
4ケタの数当てゲームを作りました。数字以外は入力させないように作りたいです。
以下の私のプログラムでは、無限ループにはならないのですが、数字以外を入力させたときにも前のヒットとブロー数が表示されてしまいます。
例:答え5632
入力5631 3H0B
入力56sd 3H0B
入力2365 0H4B
入力dddd 0H4B
私のプログラムのどこをどのように変更したらよいか教えてください。
ずっと考えているのですが、数字以外を入力させない方法が分かりません。
詳しく教えていただくとありがたいです。
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
main()
{
int n1,n2,n3,n4;
int u1,u2,u3,u4;
int hit, blow, count;
float f;
char str[32];
int u=0;
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) {
fgets(str,31,stdin);
sscanf(str,"%d",&u);
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);
No.1ベストアンサー
- 回答日時:
前の質問を閉じるでもなく、『続きの質問』を繰り返すのもどうかと思いますけどね……。
# 「最新の質問」から溢れたら新しく質問して目に付くようにするのが回答率アップのコツ!!なんですよ。
# 既に回答してくれた人に対する心象? そんなの関係ねぇ!!
それはともかく。
掲示するのならばコンパイル通るコードを貼った方がよろしいかと。
コンパイル出来ないのはどこが悪いんでしょう?って質問ではないのですし。
# それならそれでエラーメッセージ読め。ってことになりますけど。
コードが判らん。というのならば、まずは日本語で処理の手順を書いてみてはどうです?
フローチャートでもかまいませんが。
まぁ、普通ならフローチャートなんでしょうけど。
# 前の質問で似たように記述してくれている回答はありましたが……。
while(1)
{
fgets(str,31,stdin);
strに改行コードがあったら'\0'に置き換える。
strの長さが4じゃなかったら「4桁入力」ではないのでcontinue
str内の文字を1文字ずつチェックして数字以外があったら「4桁の数字」ではないのでcontinue
str内の数字が他に同じ数字があるかチェックしてダブりがあれば「重複しない数字」ではないのでcontinue (今回の質問には記載されてませんが)
strの数字を数値に変換
break;
}
こんな感じ?
ところで…
fgets(str,31,stdin);
の箇所で34文字入力されたらどうします?
# 1回目で34文字中30文字(と'\0'で第2引数の31バイト)を読み込み、上記の処理で次の読み込みへ
# 2回目で残りの4文字と改行コードを読み込んで処理継続。
# 入力時に34文字入力したのに処理継続…となりますね。
前向きな努力の跡も見られないなら、私はこれで回答控えますけどね。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C言語でのトランプシャッフルに...
-
構文エラー";"が型の前にあり...
-
プログラム
-
for文の中にswitch文はいれられ...
-
#if 1 #elseの意味について
-
C言語プログラムが理解できなくて…
-
c言語プログラミングで1から100...
-
C言語で電卓を作成する。
-
最早開始時間と最遅完了時刻を...
-
C言語 エラーの原因がわからな...
-
信頼区間の1.96や1.65ってどこ...
-
Enterキーを押されたら次の処理...
-
プログラムでの数字につく”f”の...
-
「Aに対するBの割合」と「Aに対...
-
C++のfor文について
-
変数とパラメータとは違うもの...
-
C言語のプログラミングですが、
-
LNK2019:未解決の外部シンボル ...
-
main.c:7:43: warning: implici...
-
For文の終了値を関数にしても問...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
#if 1 #elseの意味について
-
構文エラー";"が型の前にあり...
-
for文の中にswitch文はいれられ...
-
配列を使って魔方陣
-
C言語 数字以外を入力させない...
-
10進数からN進数に変換するプロ...
-
配列を関数に渡す方法
-
scanfが実行されません
-
C言語で電卓を作成する。
-
C言語・最大値を算出するプロ...
-
C言語階乗の総和を求める
-
実行すると if文 に矛盾
-
計算結果がlong型以上になる場...
-
C言語プログラム
-
C言語。どうしてコンパイルでき...
-
c言語for文
-
getcの改行判定
-
C言語で勉強中(max,min)の出し方
-
C言語 プログラム
-
SIGALRMでプロセス終了
おすすめ情報