ページ 11

どこが間違えているかがわかりません。

Posted: 2011年8月16日(火) 17:10
by XTL
初めまして、XTLといいます。
問題
数字当てゲームHit & Blowなんですが
1)コンピューターが4桁の数字(0-9まで)を考える関数
2)ユーザーが考えた4桁の数字、仮に1234であれば、1235なら3hit0chip
3)10回以内にクリアーを目指す。
4)0以下、10000以上なら強制終了。

わからない点が、2)の1223という問題のときに、1233とやったばあい、3hit1chipとなり、おかしな内容になります。
そこを直したいのですが、宜しくお願い致します。
下が作ったソースです。

#include<stdio.h>
#include<stdlib.h>
#include<time.h>



int main(void)
{
int ans[4],count[4];
int hit(int ans[4],int count[4];
int blow(int ans[4],int count[4];
int hitblow(int ans[4],int count[4];
int guess;
int hitresult;
int blowresult;
int hitblow;
int i;
char str[9]

srand( (unsigned)time( NULL ) );
ans[3]=rand()%10
ans[2]=rand()%10
ans[1]=rand()%10
ans[0]=rand()%10
printf("hit & blow")

for (i=10 ;i<10,i+1);
{
printf("%D",i+1);
printf("回数");
fgets(str,sizeof(str),stdin);
guess=atoi(str);

count[0]=guess%10;
count[1]=(guess/10)%10;
count[2]=(guess/100)%10;
count[3]=(guess/1000)%10;

hitresult = hit(ans,count);
blowresult = blow(ans,count);
hitblowresult = hitblow(ans,count);

if(hitresult==4)
{
printf("正解");
break;
}else{
printf("%d",hit%dchip.¥n,hitresult,chipresult,hitchipresult);
}
}
printf(正解は%d%d%d%dです¥n",ans{3},ans{2},ans{1},ans{0}),
}


int hit(int ans[4],int count[4]
{
int i;
int hit=0
for(int i=0;i<4;i++){
if(ans{i}=count{i}){
hit++;
}
}
return hit;
}

int blow(int ans[4],int count[4];
{
int i;
int j:
int blow=0;
for(int i=0;i<4;i++){
for(int j=0;j<4;j++){
if(i! = j&&ans==count)
blow++;
break;
}
}
}
return blow;
}


int hitblow(int ans[4],int count[4];
{
int hitblow=0;
int i;
int j;
{
for(int i=0;i<4;i++){
if(ans==count){
for(int j=0;j<4;j++){
if(i! = j&&ans==count)
hitblow++;
break;
}
}
}
return hitblow;
}

Re: どこが間違えているかがわかりません。

Posted: 2011年8月16日(火) 18:41
by non
エラーの出ないプログラムを、codeタグを使って貼りつけてください。

Re: どこが間違えているかがわかりません。

Posted: 2011年8月17日(水) 02:05
by N.M
プログラムの方を読ませていただきました。まずハッカーさんのおっしゃるとおり,このままだとエラーが結構出ます(主に;忘れや)忘れなど)。一番の問題は使われていない変数chipresultとかhitchipresultが使われているところです。(自分はこれをblowresult,hitblowresultとしてとらえました。)
このままだとプログラム自体もあまり分からないので、そこは直してください。あともう少しルールのほうを詳しく説明してください。(とくにchipが何を示すのかを)

Re: どこが間違えているかがわかりません。

Posted: 2011年8月17日(水) 05:41
by xtl
#include<stdio.h>
#include<stdlib.h>
#include<time.h>



int main(void)
{
int ans[4],count[4];
int hit(int ans[4],int count[4];
int blow(int ans[4],int count[4];
int hitblow(int ans[4],int count[4];
int guess;
int hitresult;
int blowresult;
int hitblow;
int i;
char str[9]

srand( (unsigned)time( NULL ) );
ans[3]=rand()%10
ans[2]=rand()%10
ans[1]=rand()%10
ans[0]=rand()%10
printf("hit & blow")

for (i=10 ;i<10,i+1);
{
printf("%D",i+1);
printf("回数");
fgets(str,sizeof(str),stdin);
guess=atoi(str);

count[0]=guess%10;
count[1]=(guess/10)%10;
count[2]=(guess/100)%10;
count[3]=(guess/1000)%10;

hitresult = hit(ans,count);
blowresult = blow(ans,count);
hitblowresult = hitblow(ans,count);

if(hitresult==4)
{
printf("正解");
break;
}else{
printf("%d",hit%dblow.¥n,hitresult,blowresult,hitblowresult);
}
}
printf(正解は%d%d%d%dです¥n",ans{3},ans{2},ans{1},ans{0}),
}


int hit(int ans[4],int count[4]
{
int i;
int hit=0
for(int i=0;i<4;i++){
if(ans{i}=count{i}){
hit++;
}
}
return hit;
}

int blow(int ans[4],int count[4]);
{
int i;
int j:
int blow=0;
for(int i=0;i<4;i++){
for(int j=0;j<4;j++){
if(i! = j&&ans==count)
blow++;
break;
}
}
}
return blow;
}


int hitblow(int ans[4],int count[4];
{
int hitblow=0;
int i;
int j;
{
for(int i=0;i<4;i++){
if(ans==count){
for(int j=0;j<4;j++){
if(i! = j&&ans==count)
hitblow++;
break;
}
}
}
return hitblow;
}

codeタグがわかりませんでした。
訂正個所を直しました。

Re: どこが間違えているかがわかりません。

Posted: 2011年8月17日(水) 07:04
by bitter_fox
xtl さんが書きました: codeタグがわかりませんでした。
訂正個所を直しました。
codeタグはフォーラムルールを参考にしてください。

また、載せていただいたソースコードでもコンパイルエラーが発生してしまいます。
コンパイルエラーの原因と恐らく誤りである点を列挙します。

コード:

int hit(int ans[4],int count[4];
                               ^閉じ括弧がない
int blow(int ans[4],int count[4];
                                ^閉じ括弧がない
int hitblow(int ans[4],int count[4];
                                   ^閉じ括弧がない

コード:

int hitblow;
    ^恐らくhitblowresult

コード:

char str[9]
           ^;がない

srand( (unsigned)time( NULL ) );
ans[3]=rand()%10
ans[2]=rand()%10
ans[1]=rand()%10
ans[0]=rand()%10
                ^;がない
printf("hit & blow")
                    ^;がない

コード:

for (i=10 ;i<10,i+1);
     ^恐らくi=0 ^恐らくi++
               ^恐らく;
                    ^恐らく不要な;

コード:

printf("%d",hit%dblow.¥n,hitresult,blowresult,hitblowresult);
                ^blowの誤り?
                     ^不正な文字.¥n(ちなみに\が全角)
//もしかしたら文字列リテラルの範囲が間違っている?

コード:

printf(正解は%d%d%d%dです¥n",ans{3},ans{2},ans{1},ans{0}),
       ^"がない          ^\が全角になっている
                                 ^ ^    ^ ^    ^ ^    ^ ^恐らく[]の誤り
                                                          ^恐らく;

コード:

int hit(int ans[4],int count[4]
                               ^閉じ括弧がない
{
int i;
int hit=0
         ^;がない
for(int i=0;i<4;i++){
    ^C言語としてコンパイルするなら問題あり
if(ans{i}=count{i}){
      ^ ^      ^ ^恐らく[]の誤り
         ^恐らく不正な代入

コード:

int blow(int ans[4],int count[4]);
                                 ^不正な;
{
int i;
int j:
     ^恐らく;の誤り
int blow=0;
for(int i=0;i<4;i++){
    ^C言語としてコンパイルするなら問題あり
for(int j=0;j<4;j++){
    ^C言語としてコンパイルするなら問題あり
if(i! = j&&ans[i]==count[i])
    ^恐らく!=の誤り
blow++;
    ^++が全角
break;
}
^}の数があっていない(恐らくifブロックに{が無い)
}
}
return blow;
}

コード:

int hitblow(int ans[4],int count[4];
                                   ^閉じ括弧がない・不正な;
{
int hitblow=0;
int i;
int j;
{
^(*1)
for(int i=0;i<4;i++){
    ^C言語としてコンパイルするなら問題あり
if(ans[i]==count[i]){
for(int j=0;j<4;j++){
    ^C言語としてコンパイルするなら問題あり
if(i! = j&&ans[i]==count[i])
^(*2)
    ^恐らく!=の誤り
hitblow++;
       ^++が全角
break;
}
^}の数があっていない(恐らく(*1)の{が不要で(*2)に{がない)
}
}
return hitblow;
}
コンパイルできるソースコード(実行可能なプログラム)がないと「2)の1223という問題のときに、1233とやったばあい、3hit1chipとなり、おかしな内容になります。」の正確な検証が出来ないので、取りあえずこれらの点を正確に直してコンパイルできるソースコードを載せてください。

[hr][追記]
N.M さんが書きました: あともう少しルールのほうを詳しく説明してください。(とくにchipが何を示すのかを)
これに対してもお答えくださいね。

Re: どこが間違えているかがわかりません。

Posted: 2011年8月17日(水) 17:35
by ISLe
そもそも、
XTL さんが書きました:わからない点が、2)の1223という問題のときに、1233とやったばあい、3hit1chipとなり、おかしな内容になります。
そこを直したいのですが、宜しくお願い致します。
#chipがブローのことだとして
質問者さんがおかしいと言ってる内容がおかしくないわけですが。

Re: どこが間違えているかがわかりません。

Posted: 2011年8月17日(水) 17:41
by みけCAT
ISLe さんが書きました:そもそも、
XTL さんが書きました:わからない点が、2)の1223という問題のときに、1233とやったばあい、3hit1chipとなり、おかしな内容になります。
そこを直したいのですが、宜しくお願い致します。
#chipがブローのことだとして
質問者さんがおかしいと言ってる内容がおかしくないわけですが。
質問者さんはこの場合3hit0chipとさせたいのでしょうか?

Re: どこが間違えているかがわかりません。

Posted: 2011年8月17日(水) 20:11
by XTL
>そもそも、
XTL さんが書きました:
わからない点が、2)の1223という問題のときに、1233とやったばあい、3hit1blowとなり、おかしな内容になります。
そこを直したいのですが、宜しくお願い致します。

#chipがブローのことだとして
質問者さんがおかしいと言ってる内容がおかしくないわけですが。
質問者さんはこの場合3hit0blowとさせたいのでしょうか?


そうです。3hit0blowとさせたいです。
1222の場合2211なら2hit1blowのように。


私が考えているのは、
int blow(int ans[4],int count[4]);
^不正な;
{
int i;
int j:
^恐らく;の誤り
int blow=0;
for(i=0;i<4;i++){
for(j=0;j<4;j++){
if(i ! = j&&ans==count){

blow++;
break;
}
}
}
return blow;
}

これのどれかが間違えているように思い、色々試したのですが、わからずじまいで
皆さんに相談しようと考えました。

Re: どこが間違えているかがわかりません。

Posted: 2011年8月17日(水) 20:39
by box
XTL さんが書きました: 2)の1223という問題のときに、1233とやったばあい、3hit1chipとなり、おかしな内容になります。
そこを直したいのですが、宜しくお願い致します。
実行時に思った動きをしない、ということは、少なくともコンパイルはできていることになります。
その、コンパイルできているソースコードを(CODEタグ付きで)コピペしてください、というのが、
おそらく回答者一同の考えであります。

セミコロンがあるべきところに抜けているとか、インクリメントが全角になっているとかいうのは、
コンパイルできているソースコードではあり得ないことです。

Re: どこが間違えているかがわかりません。

Posted: 2011年8月17日(水) 21:09
by 白い時空
Hit & Blowについて調べましたが、4つの数字の中で同じ数字を二度使ってはいけないというルールがあるみたいです。
(使うとhitとblowが同時発生しておかしくなる)
なので、1223とか1233という数字はそもそも使われません。

普通にHit & Blowを作るだけならこの問題は無視してもいいみたいですね。

Re: どこが間違えているかがわかりません。

Posted: 2011年8月17日(水) 21:19
by non
なぜ、XLTさんは、みんながこれだけお手伝いしようとしているのに、まともなプログラムを添付しないのだろうか?
本当に、自分で作ったプログラムがあるのか、そう思うのは僕だけ?

Re: どこが間違えているかがわかりません。

Posted: 2011年8月17日(水) 22:12
by box
白い時空 さんが書きました: 普通にHit & Blowを作るだけならこの問題は無視してもいいみたいですね。
無視していいのではなく、じゅうぶんに意識しなくてはならないのではないでしょうか。
特に、コンピューターが答えを作成するとき、同じ数字が出ないようにするロジックを組み込む、とか。

Re: どこが間違えているかがわかりません。

Posted: 2011年8月17日(水) 22:36
by xtl
non様へ

自分で作ったソースコードを一番初めに書いたのですが、{、}などが適切でなかったですね。すいません。
皆様に感謝しています。
もう一度書きなおしましたので、宜しくお願い致します。


#include<stdio.h>
#include<stdlib.h>
#include<time.h>



int main(void)
{
int ans[4],count[4];
int hit(int ans[4],int count[4]);
int blow(int ans[4],int count[4]);
int hitblow(int ans[4],int count[4]);
int guess;
int hitresult;
int blowresult;
int hitblowresult;
int i;
char str[9];

srand( (unsigned)time( NULL ) );
ans[3]=rand()%10;
ans[2]=rand()%10;
ans[1]=rand()%10;
ans[0]=rand()%10;
printf("hit & blow");

for (i=0 ;i<10,i++)
{
printf("%D",i+1);
printf("回数");
fgets(str,sizeof(str),stdin);
guess=atoi(str);

count[0]=guess%10;
count[1]=(guess/10)%10;
count[2]=(guess/100)%10;
count[3]=(guess/1000)%10;

hitresult = hit(ans,count);
blowresult = blow(ans,count);
hitblowresult = hitblow(ans,count);

if(hitresult==4)
{
printf("正解");
break;
}else{
printf("%d",hit%blow.\n,hitresult,blowresult,hitblowresult);
}
}
printf(正解は%d%d%d%dです\n",ans[3],ans[2],ans[1],ans[0]),
}


int hit(int ans[4],int count[4])
{
int i;
int hit=0;
for(i=0;i<4;i++){
if(ans=count){
hit++;
}
}
return hit;
}

int blow(int ans[4],int count[4])
{
int i;
int j;
int blow=0;
for( i=0;i<4;i++){
for( j=0;j<4;j++){
if(i! = j&&ans==count){
blow++;
break;
}
}
}
return blow;
}


int hitblow(int ans[4],int count[4])
{
int hitblow=0;
int i;
int j;
for(i=0;i<4;i++){
if(ans==count){
for( j=0;j<4;j++){
if(i != j&&ans==count){
hitblow++;
break;
}
}
}
return hitblow;
}

Re: どこが間違えているかがわかりません。

Posted: 2011年8月17日(水) 22:59
by box
xtl さんが書きました: 自分で作ったソースコードを一番初めに書いた
それはおかしくないですか?
xtl さんが書きました: 2)の1223という問題のときに、1233とやったばあい、3hit1chipとなり、おかしな内容になります。
という文とともに、「コンパイルが通らない」ソースコードを載せられたのですよ。
矛盾していませんか?

そして、最後に載せられたソースコードもコンパイルできないため、
xtl さんが書きました: 2)の1223という問題のときに、1233とやったばあい、3hit1chipとなり、おかしな内容になります。
この状況を再現できるソースコードがなかなか登場しないでいます。

Re: どこが間違えているかがわかりません。

Posted: 2011年8月18日(木) 02:16
by N.M
ルールのほうはネット検索でとりあえず理解しました(調べもせずに書き込んでしまってすみません)。
それでまたプログラムを見て思ったことがあるので少し書かせていただきます。

コード:

int blow(int ans[4],int count[4])
{
int i;
int j;
int blow=0;
for( i=0;i<4;i++){
for( j=0;j<4;j++){
if(i! = j&&ans[i]==count[i]){
                ^ここjでは?
blow++;
break;
}
}
}
return blow;
}
そこだけ気になりました。

Re: どこが間違えているかがわかりません。

Posted: 2011年8月18日(木) 06:49
by xtl
box様

私のソースコードがコピーが出来なく、手書きで書いたため、色々な間違いがあり、
皆様にご迷惑をかけ、申し訳ありませんでした。
実際に自分が作ったソースです。

N.M様
jでも試してみましたが、駄目でした・・

Re: どこが間違えているかがわかりません。

Posted: 2011年8月18日(木) 08:02
by hidden
コードタグを使ってほしいと最初の返信で書いてあるのですからコードタグを使うべきです。フォーラムルールは既読ですか?
どうしても使わないのであればその理由を書いてほしいです。書き間違い?から考えると携帯電話とかからなんでしょうか?
その辺のあなたの状況の説明がないといらぬ誤解を生むだけです。

printf("%d",hit%blow.\n,hitresult,blowresult,hitblowresult);
これはどんな文なんでしょうか?

Re: どこが間違えているかがわかりません。

Posted: 2011年8月18日(木) 22:45
by xtl
hiddenさん

いらぬ誤解の意味がわからないのですが・・・
答えて頂ける方にお聞きしたいと考えています。
¥←これの半角が何故かできなく、半角した場合→\ になってしまいます。

Re: どこが間違えているかがわかりません。

Posted: 2011年8月18日(木) 22:59
by box
xtl さんが書きました: ¥←これの半角が何故かできなく、半角した場合→\ になってしまいます。
これがどういう状況を指しているのかよくわかりませんし、先の投稿にあった
「ソースコードがコピーできない状態」というのも、何のことやらよくわかりません。

もし、「ソースコードがコピーできない状態」が本当に存在していて、なおかつ、
質問者さんが今抱えている問題を本当に解決したい、とお考えでしたら、
手間や時間がかかるかもしれませんが、お手元にあるソースコードを
「一字一句正確に」手で打って投稿していただく必要があると思います。
とにかく、問題が再現できるソースコードが見えないことには、話になりません。

Re: どこが間違えているかがわかりません。

Posted: 2011年8月18日(木) 23:26
by softya(ソフト屋)
ブラウザの表示上¥は\に見えますが、codeタグを使い投稿してしまえばちゃんと¥になります。
プレビューで確認してみてくださいね。

あと、なぜソースをコピペ出来ないのでしょうか?
コピペの方法がわからなければ聞いてください。
パソコン→スマートフォン等でも方法はあると思います。

Re: どこが間違えているかがわかりません。

Posted: 2011年8月18日(木) 23:51
by box
softya(ソフト屋) さんが書きました:ブラウザの表示上¥は\に見えますが、codeタグを使い投稿してしまえばちゃんと¥になります。
バックスラッシュとか円マークとか書かれた方が伝わりやすいような気がします。
少なくとも私のところでは、表示上、

ブラウザの表示上円マークは円マークに見えますが、codeタグを使い投稿してしまえばちゃんと円マークになります。

という意味の文になってしまっていて、何のことやらよくわからなくなっています。

Re: どこが間違えているかがわかりません。

Posted: 2011年8月19日(金) 07:25
by hidden
おっといらぬ誤解ってなんかちょっと変ですね。あらぬ誤解が普通でしょうか。まぁどうでもいいです。

xtlさんが質問に必要な情報を出さずにコンパイルも通らないコードばかりを出すので
無駄に遠回りをしているなぁと思って書いたのです。
ちなみに私は答えられない状況なだけで答える気がないわけではありませんので。


2)の1223という問題のときに、1233とやったばあい、3hit1chipとなり、おかしな内容になります。
おかしな内容になる ではなくどうなってほしいのかを書いたほうがいいと思います。
むしろマスターマインドの場合問題の時点でルール違反とも言えます。
もし1223という出題があり得るルールなのであればルールの説明をすべきです。

Re: どこが間違えているかがわかりません。

Posted: 2011年8月22日(月) 17:52
by xtl
codeの書き方はこれでいいのでしょうか??
blowの判定を直したいです。
どうか宜しくお願い致します。

コード:

#include<stdio.h>
#include<stdlib.h>
#include<time.h>

/* 概要 */
/* コンピュータが指定した値を当てるゲームの作成 */																															
/* コンピュータが出力した4桁の数値を当てる。 */																														
/* 解答回数は「10」回。10回入力し、正解しなければ、ゲームを終了する。 */	
/* 入力された答えとコンピュータが出力した数値を判定し、 */																						
/* 同じ桁に同じ数値の場合:1Hit */																									
/* 違う桁に同じ数値の場合:1Blow */																											
/* とカウントし、「4Hit」になれば、終了。 */																											
/* 下記のような場合は、「1Hit」とする。 */																												
/* コンピュータ出力値:「1」「2」「1」「4] */																															
/* ユーザ入力値   :「1」「5」「6」「7] */																															
/* 「hit関数」「Blow関数」を作成する。 */																															
/* 各関数は、「入力された値」と「コンピュータが出力した値」を引数で渡し, */																															
/*「hit関数」は「hit数」を、「Blow関数」は「Blow数」を返す。 */
/*int=integer*/

int hit(int *answer,int *count);/*プロトタイプ宣言*/


int main(void)
{	
	int answer[4],count[4];
	int	blow(int *answer,int *count);
	int guess;				/* 4桁の数字					  */
	int hitresult;			/* hitの回数					  */
	int blowresult;			/* blowの回数				  */
	int i;					/* 回数(制限)				  */
	char str[9];			/* 数字が半角4文字+1			  */
	
	
	/* 正解の数字を4ケタランダム。それぞれ1桁指定 */
	srand((unsigned int)time(NULL));	/* randの初期化 */
	answer[3] = rand() % 10;				
	answer[2] = rand() % 10;
	answer[1] = rand() % 10;
	answer[0] = rand() % 10;
	/* 始めの指示 */
	printf("さあ始まりました HIT & BLOW!!!\n");
	printf("プレイヤーさん、用意はいいかな?^^;\n");
	printf("チャンスは10回!\n");
	printf("4桁以外の数字を入れればゲームオーバだから気をつけてね!\n");
	printf("ではCPUから勝利をもぎとるんだ!!\n\n");
	/* 解答 */
	printf("取得した値は%d%d%d%dです。\n", answer[3], answer[2], answer[1], answer[0]);//デバック用なので消してもよい
	
	/* 範囲指定 */
	for(i=0 ;i<10 ;i++)
	{
		printf("%d",i +1);
		printf("回目の数を入力してね!");
		fgets(str,sizeof(str),stdin);
		guess = atoi(str);

		count[0] = guess % 10;				/* 4桁の数字を千・百・十・一と順番で反映させている */
		count[1] = (guess / 10) % 10;
		count[2] = (guess / 100) % 10;
		count[3] = (guess / 1000) % 10;

		hitresult=hit(answer,count);
		blowresult=blow(answer,count);
		
		if(hitresult==4)
		{
			printf("大正解、おめでとう!!!");
			break;
		}			
		else if((guess < 0)||(9999 < guess))	/* guessの値が0000~9999の範囲指定 */
		{
			printf("4桁の数字を入れ直さないとゲームオーバー\n");	
			break;		
			}else {
			printf(" %d HIT %d BLOW.\n\n",hitresult,blowresult);
		}
	}
	printf("正解は%d%d%d%dです\n",answer[3],answer[2],answer[1],answer[0]);
	printf("ゲームを終了します!!\n\nお疲れ様でした!\n");
}
/* hit */
int hit(int *answer,int *count)
{
	int i;
	int hit=0;
	for(i = 0 ; i < 4 ; i++){
		if(answer[i]==count[i]){
			hit++;
		}
	}
	return hit;
}

/* blow */
int blow(int *answer,int *count)
{
	int i;
	int j;
	int blow=0;

	for(i = 0 ; i < 4 ; i++){
		if(answer[i]==count[i]){
			count[i] = 'a';
		}
	}
	for(i = 0 ; i < 4 ; i++)
	for(j = 0 ; j < 4 ; j++){
		
	}
		if(i=!j&&answer[i]==count[j]){
			blow++;
			break;
		}
	}
	return blow;
}


Re: どこが間違えているかがわかりません。

Posted: 2011年8月22日(月) 18:13
by softya(ソフト屋)
前にもお願いしましたが、必ずプレビューでcodeタグをうまく使えることを確認してください。今回は修正しておきました。
ところで今回も動かないプログラムなのですが、なぜコピー出来ないのか教えて頂けませんでしょうか?

Re: どこが間違えているかがわかりません。

Posted: 2011年8月22日(月) 18:16
by h2so5
とりあえずコンパイルが通るようにしてみました

コード:

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
 
/* 概要 */
/* コンピュータが指定した値を当てるゲームの作成 */        
/* コンピュータが出力した4桁の数値を当てる。 */   
/* 解答回数は「10」回。10回入力し、正解しなければ、ゲームを終了する。 */ 
/* 入力された答えとコンピュータが出力した数値を判定し、 */    
/* 同じ桁に同じ数値の場合:1Hit */  
/* 違う桁に同じ数値の場合:1Blow */       
/* とカウントし、「4Hit」になれば、終了。 */   
/* 下記のような場合は、「1Hit」とする。 */      
/* コンピュータ出力値:「1」「2」「1」「4] */  
/* ユーザ入力値   :「1」「5」「6」「7] */  
/* 「hit関数」「Blow関数」を作成する。 */ 
/* 各関数は、「入力された値」と「コンピュータが出力した値」を引数で渡し, */   
/*「hit関数」は「hit数」を、「Blow関数」は「Blow数」を返す。 */
/*int=integer*/
 
int hit(int *answer,int *count);/*プロトタイプ宣言*/
 
 
int main(void)
{       
        int answer[4],count[4];
        int     blow(int *answer,int *count);
        int guess;       /* 4桁の数字        */
        int hitresult;   /* hitの回数         */
        int blowresult;  /* blowの回数        */
        int i;   /* 回数(制限)       */
        char str[9];     /* 数字が半角4文字+1     */
 
 
        /* 正解の数字を4ケタランダム。それぞれ1桁指定 */
        srand((unsigned int)time(NULL));        /* randの初期化 */
        answer[3] = rand() % 10;        
        answer[2] = rand() % 10;
        answer[1] = rand() % 10;
        answer[0] = rand() % 10;
        /* 始めの指示 */
        printf("さあ始まりました HIT & BLOW!!!\n");
        printf("プレイヤーさん、用意はいいかな?^^;\n");
        printf("チャンスは10回!\n");
        printf("4桁以外の数字を入れればゲームオーバだから気をつけてね!\n");
        printf("ではCPUから勝利をもぎとるんだ!!\n\n");
        /* 解答 */
        printf("取得した値は%d%d%d%dです。\n", answer[3], answer[2], answer[1], answer[0]);//デバック用なので消してもよい
        
        /* 範囲指定 */
        for(i=0 ;i<10 ;i++)
        {
                printf("%d",i +1);
                printf("回目の数を入力してね!");
                fgets(str,sizeof(str),stdin);
                guess = atoi(str);
                
                count[0] = guess % 10;   /* 4桁の数字を千・百・十・一と順番で反映させている */
                count[1] = (guess / 10) % 10;
                count[2] = (guess / 100) % 10;
                count[3] = (guess / 1000) % 10;
                
                hitresult=hit(answer,count);
                blowresult=blow(answer,count);
                
                if(hitresult==4)
                {
                        printf("大正解、おめでとう!!!");
                        break;
                }       
                else if((guess < 0)||(9999 < guess))    /* guessの値が0000~9999の範囲指定 */
                {
                        printf("4桁の数字を入れ直さないとゲームオーバー\n"); 
                        break;  
                }else {
                        printf(" %d HIT %d BLOW.\n\n",hitresult,blowresult);
                }
        }
        
        printf("正解は%d%d%d%dです\n",answer[3],answer[2],answer[1],answer[0]);
        printf("ゲームを終了します!!\n\nお疲れ様でした!\n");
}
        /* hit */
int hit(int *answer,int *count)
{
        int i;
        int hit=0;
        for(i = 0 ; i < 4 ; i++){
                if(answer[i]==count[i]){
                hit++;
                }
        }
        return hit;
}
 
/* blow */
int blow(int *answer,int *count)
{
        int i;
        int j;
        int blow=0;
        
        for(i = 0 ; i < 4 ; i++){
                if(answer[i]==count[i]){
                        count[i] = 'a';
                }
        }
        
        for(i = 0 ; i < 4 ; i++){
                for(j = 0 ; j < 4 ; j++){
                
                        if(i!=j&&answer[i]==count[j]){
                                blow++;
                                break;
                        }
                
                }
        }
        
        return blow;
}

Re: どこが間違えているかがわかりません。

Posted: 2011年8月22日(月) 18:24
by xtl
h2so5さん

ありがとうございます!!
あれから内容を大幅に修正したのですが、それでもblowのカウント値がおかしく・・

Re: どこが間違えているかがわかりません。

Posted: 2011年8月22日(月) 18:48
by h2so5
「blowのカウント値がおかしい」というだけではなかなか判断できないので、
具体的な実行結果を貼っていただけないでしょうか。

Re: どこが間違えているかがわかりません。

Posted: 2011年8月22日(月) 21:42
by box
xtl さんが書きました:

コード:

			count[i] = 'a';
この文で、何がしたいのでしょうか?

Re: どこが間違えているかがわかりません。

Posted: 2011年8月22日(月) 21:54
by non
前々からみなさんが仰っているように、あなたの頭の中は説明してもらわないとわかりませんって!
この実行結果はあなたの思っている通りですか?

取得した値は1122です。
1回目の数を入力してね!1222
3 HIT 0 BLOW.

2回目の数を入力してね!1223
2 HIT 1 BLOW.

3回目の数を入力してね!2211
0 HIT 4 BLOW.

4回目の数を入力してね!1111
2 HIT 0 BLOW.

5回目の数を入力してね!1122
大正解、おめでとう!!!正解は1122です

Re: どこが間違えているかがわかりません。

Posted: 2011年8月23日(火) 01:54
by xtl
前々からみなさんが仰っているように、あなたの頭の中は説明してもらわないとわかりませんって!
この実行結果はあなたの思っている通りですか?

取得した値は1122です。
1回目の数を入力してね!1222
3 HIT 0 BLOW.

2回目の数を入力してね!1223
2 HIT 1 BLOW.

3回目の数を入力してね!2211
0 HIT 4 BLOW.

4回目の数を入力してね!1111
2 HIT 0 BLOW.

5回目の数を入力してね!1122
大正解、おめでとう!!!正解は1122です



上記の内容は問題ないのですが、
1223の時に1222とうつと、
3hit1blowになってしまいます。
本来であれば、3hit0blowとしたいのですが。。。
↑これが知りたいのです。

Re: どこが間違えているかがわかりません。

Posted: 2011年8月23日(火) 07:44
by xtl
>前々からみなさんが仰っているように、あなたの頭の中は説明してもらわないとわかりませんって!
この実行結果はあなたの思っている通りですか?

取得した値は1122です。
1回目の数を入力してね!1222
3 HIT 0 BLOW.

2回目の数を入力してね!1223
2 HIT 1 BLOW.

3回目の数を入力してね!2211
0 HIT 4 BLOW.

4回目の数を入力してね!1111
2 HIT 0 BLOW.

5回目の数を入力してね!1122
大正解、おめでとう!!!正解は1122です



上記の内容は問題ないのですが、
1223の時に1222とうつと、
3hit1blowになってしまいます。
本来であれば、3hit0blowとしたいのですが。。。
↑これが知りたいのです。

Re: どこが間違えているかがわかりません。

Posted: 2011年8月23日(火) 08:49
by non
xtl さんが書きました: 1223の時に1222とうつと、
3hit1blowになってしまいます。
本来であれば、3hit0blowとしたいのですが。。。
↑これが知りたいのです。
その値に関しては、何度も書かれているから、みんなわかっているのですが、
なぜ、その値が3hit0blowなのかについて説明がないのです。
それで、私の独自の判断でhitした場所の数値は削除するのだろうという考えで
上記の例を挙げたわけです。あなたが、そのことを自分から説明するのをみんな
待っていたわけで、私も、最初のスレが出たときからプログラムは既にできていました。

さて、解答例ですが、上記例は、関数blowのチェック部分を下のように変えました。

コード:

        for(i = 0 ; i < 4 ; i++){
			if(count[i]=='a')
				continue;
        	for(j = 0 ; j < 4 ; j++){
            	if(count[j]=='a')
					continue;    
                if(answer[j]==count[i]){
                    blow++;
                    break;
                }
            }
        }