質問: C言語記憶力ゲームを修正したいです。 下記コードのif( no != num) 0012の場合は12でも012でも0012でも正解となってしまいます。
回答: 初めから文字列で入力してしまえばいいのでは。 -------------------- #include #include #include #define MAX_STAGE 10 /*ステージ数 */ /* x秒経過するまで待つ */ int sleep(unsigned long x) { clock_t c1 = clock(),c2; do { /* エラー処理 */ if((c2 = clock()) == (clock_t)-1) { return 0; } } while(1000.0 * (c2 -c1) / CLOCKS_PER_SEC < x); { return 1; } } int main(void) { int stage; int success = 0; /* 正解数 */ clock_t start,end; /* 開始時刻・終了時刻 */ char num[5]; /* 読み込んだ数字 */ //★文字配列に変更 char no[5]={0}; //★文字配列に変更 [4]='\0'にするために要初期化 //★4桁の数字に文字列の末尾'\0'で[5] /*乱数を設定*/ srand(time(NULL)); printf("4桁の数値を記憶して下さい。\n"); start = clock(); for(stage = 0; stage < MAX_STAGE; stage++) { //int num; /* 読み込んだ数字 */ //int no = rand() % 9000; /* 記憶する数字 */ //printf("%4d",no); for(int i=0;i<4;i++) //★このように文字で数字を設定 no[i]='0'+rand()%10; //0-9の文字がランダムに入る printf("%s",no); //★文字列で出力 fflush(stdout); /* 問題の提示秒数 */ sleep(500); printf("\r数値を入力して下さい。\n"); fflush(stdout); //scanf("%4d", &num); //scanf("%*[^\n]"); while(1){ //★無限ループで入力、条件を満たせばbreakでぬける scanf("%4s",num); if('0'<=num[0] && num[0]<='9' && '0'<=num[1] && num[1]<='9' && '0'<=num[2] && num[2]<='9' && '0'<=num[3] && num[3]<='9') { break; //4桁とも数字文字なら入力終了 }else{ //違った場合はメッセージを出してもう一度入力 printf("数字以外が入力されています。もう1度入力してください\n"); } } if(num[0]==no[0] && //★判定はこのように行う num[1]==no[1] && //わかるのならstrcmp()を使ってもいい num[2]==no[2] && num[3]==no[3] ) { printf("正解です。\n"); success++; }else{ printf("間違いです。\n"); } } end = clock(); printf("%d回中%d回で成功しました。\n",MAX_STAGE,success); printf("%.1f秒でした。\n",(double)(end - start) / CLOCKS_PER_SEC); return 0; }