dポイントプレゼントキャンペーン実施中!

重複しない4ケタの数字を当てるゲームを作りました。
しかし、数字以外が入力されると正しく動きません。
getchar();を使って、考えてみたのですが、無限ループは回避できましたが、余分なHit,Blowが表示されてしまいます。
重複しない4ケタの数字以外が入力された場合、私のプログラムにgetchar, getchなどを加えて、プログラムを終了させる方法を教えてください。
または、数字以外が入力されても正しく動くプログラムに改良する方法を教えてください。
私のプログラムのどこに何を入れたらいいかを教えていただくとありがたいです。

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

main()
{
int num1, num2, num3,num4,o;
int user, user1, user2, user3,user4;
int hit, blow, count;


srand(time(0));
num1=rand()%10;
while (1) {
num2=rand()%10;
if (num2!=num1) {
break;
}
}
while (1) {
num3=rand()%10;
if (num3!=num1 && num3!=num2) {
break;
}
}
while (1) {
num4=rand()%10;
if (num4!=num1 && num4!=num2 && num4!=num3) {
break;
}
}
printf("%d%d%d%d\n",num4,num3,num2,num1);


count=1;
printf("重複しない4つの数字を入力 \n");
while(1) {
while (1) {
scanf("%d",&user);
o = getchar();
user4=(user/1000)%10;
user3=(user/100)%10;
user2=(user/10%10);
user1=(user/1)%10;
if (user1!=user2 && user1!=user3 && user1!=user4 &&user2!=user3 &&user2!=user4 &&user3!=user4) {
break;
}
printf(" やり直し! \n");
return 0;
}


if (user1==num1 && user2==num2 && user3==num3 && user4==num4) {
break;
}


hit=0;
blow=0;
if (user1==num1) {
hit++;
}
if (user2==num2) {
hit++;
}
if (user3==num3) {
hit++;
}
if (user4==num4) {
hit++;
}
if (user1==num2 || user1==num3 || user1==num4) {
blow++;
}
if (user2==num1 || user2==num3 || user2==num4) {
blow++;
}
if (user3==num1 || user3==num2 || user3==num4) {
blow++;
}
if (user4==num1 || user4==num2 || user4==num3) {
blow++;
}
printf(" %dH%dB\n",hit,blow);
count++;
}
printf(" %d回目で正解!\n",count);
}

質問者からの補足コメント

  • 自作した関数を入れるの部分が分かりません。(user1!=user2 && user1!=user3 && user1!=user4 &&user2!=user3 &&user2!=user4 &&user3!=user4) しか思いつきません。
    また、scanfではなく、char cを使って、文字として今まで考えてみたのですが、全くうまくいきませんでした。scanfを使わずにどのように確認するか具体的に教えていただけませんか?
    私の書いたプログラムに何を付け加えたらいいのでしょうか?
    お手数ですが、よろしくお願いします。
    ずっと考えているのですが思いつかず、困っています。

    No.1の回答に寄せられた補足コメントです。 補足日時:2016/05/26 23:38

A 回答 (1件)

まずは、マスターマインドの部分はおいといて



int main() {
 do {
  4つの異なる数字を入力する() ;
  if (読み込み終了 ) { break ;}
  読み込んだ4つの数字を出力() ;
} while (1)
}

と、読み込むだけのプログラムを作ってみましょう。

「4つの異なる数字を入力する() ;」
には、ここに直接プログラムを書かずに、自作した関数を入れます。

プロトタイムは
int input4Numbers(int *a1,int *a2,int *a3, int *a4) ;
戻り値は
正常時 0、 エラー(EOF等) 時 1


今回読み込むのは「数値」ではなく「4つの文字」でよいはずです。
ならば。エラー処理の面倒なscanfは止めて、fgetsで1行入力→1文字ずつ確認 で十分でしょう。


このように分割すると、他の影響をあまり考えずに、単純な機能(今回なら、4つの文字入力する)に集中できます。
この回答への補足あり
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!