マスターマインドの問題について
Posted: 2018年9月26日(水) 15:28
コンピューターが生成した4桁の数字を当てるマスターマインドというプログラムを作ろうとしています.
例えば答えが2341の時
入力:7890 出力:それらの数字中0個の数字が含まれ、そのうち位置もあっているのは0個です
入力:1234 出力:それらの数字中4個の数字が含まれ、そのうち位置もあっているのは0個です
入力:2341 出力:正解です
というようなプログラムです。
しかし、どのような数字を入力しても「それらの数字中0個が含まれ、・・・」というような結果になってしまいます・・・。どこが間違っているのか、どなたか教えてください(´;ω;`)
例えば答えが2341の時
入力:7890 出力:それらの数字中0個の数字が含まれ、そのうち位置もあっているのは0個です
入力:1234 出力:それらの数字中4個の数字が含まれ、そのうち位置もあっているのは0個です
入力:2341 出力:正解です
というようなプログラムです。
しかし、どのような数字を入力しても「それらの数字中0個が含まれ、・・・」というような結果になってしまいます・・・。どこが間違っているのか、どなたか教えてください(´;ω;`)
#include<stdio.h>
#include<string.h>
#include<time.h>
#include<string.h>
#include<ctype.h>
void make4digits(char x[]) /*相異なる4つの数字の並びを生成して配列xに格納*/
{
int i,j,val;
srand(time(NULL));
for(i=0;i<4;i++){
do{
val=rand()%10;
for(j=0;j<i;j++)
if(val==x[j]-'0') break;
}while(j<i); /*重複しない値が出るまで繰り返す*/
x[i]=val+'0';
}
}
int check(const char s[]) /*入力された文字列が四文字、数字のみ、重複なしを満たすかチェック*/
{
int i,j;
int len=strlen(s);
if(len!=4)
return 1;
for(i=0;i<4;i++){
if(!isdigit(s[i]))
return 2;
}
for(i=0;i<4;i++){
for(j=0;j<i;j++)
if(s[i]==s[j]) return 3;
}
return 0;
}
void judge(const char s[],char no[],int *hit,int *blow) /*ヒットとフローの判定*/
{
int i,j;
*hit=*blow=0;
for(i=0;i<4;i++){
for(j=0;j<4;j++){
if(s[i]==no[j]) /*数字が一致*/
if(i==j) *(hit)++; /*位置も一致*/
else *(blow)++; /*位置は不一致*/
}
}
}
void print_result(int snum,int spos) /*判定結果を出力*/
{
if(spos==4)
printf("正解です!\n");
else{
printf("それらの文字中%d個の数字が含まれます\n",spos+snum);
printf("そのうち位置もあっているのは%d個です\n",spos);
}
}
int main(void)
{
int try_no=0,i;
int chk;
int hit,blow,ch;
char no[4];
const char s[10];
clock_t end,start;
printf("マスターマインドをしましょう\n");
printf("4つの数字の並びを当ててください\n");
printf("1234のように連続して数字を入力してください\n");
printf("重複のないようにしてください\n");
printf("五回以内の正解を目指しましょう\n");
printf("スペースキーで開始します\n");
make4digits(no);
printf("%s",no); /*正しくプログラムが動いてるか検証するために答えを表示*/
while((ch=getchar())!=' ')
;
start=time(NULL);
do{
do{
printf("入力してください:");
scanf("%s",s);
chk=check(s);
switch(chk){ /*正しく入力されるまでループ*/
case 1:
printf("きちんと4文字入力してください\n");
break;
case 2:
printf("数字以外を入力しないでください\n");
break;
case 3:
printf("同じ数字を重複して入力しないでください\n");
break;
}
}while(chk!=0);
try_no++;
printf("%d回目\n",try_no);
judge(s,no,&hit,&blow);
print_result(blow,hit);
}while(try_no<6 && hit!=4);
end=time(NULL);
if(hit!=4)
printf("残念でした.正解は%sです\n",no);
else
printf("正解です!かかった時間は%f秒です\n",difftime(end,start));
return 0;
}