質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

1回答

3881閲覧

数当てゲームについて

terax

総合スコア14

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2017/10/22 12:11

編集2017/10/22 12:14

###前提・実現したいこと
Cの初心者で数当てゲームを作っているのですが、以下に示す完成条件を満たすものが書けず、苦労しています。特にターン数のカウンタです。
完成条件
・プログラムの起動~終了は3ターン
・1ターン(1つの乱数生成~正解まで)において、生成した乱数を当てるまで何度も回答可能
・回答時に0を入力すると次のターンへ
・最後に総ターン数と回答数、その平均入力回数を表示するが、0入力で飛ばしたターンは無視する
・平均入力回数に応じてコメントを表示

###発生している問題・エラーメッセージ

回答数カウンタacnt、ターン数カウンタtcnt、1ゲームを計るカウンタiがぐちゃぐちゃになっている気がするので、修正したいです。 また、乱数に対する回答への条件分岐がうまく動かないです。(デバッグしたところ、正解と全然違う以外に分岐されない) 乱数のリセットするタイミングがおかしいので、完成条件2が満たせないです。

###該当のソースコード

C

1#include <time.h> 2#include <stdio.h> 3#include <stdlib.h> 4 5int main(void) { 6 long int x = 0, y, z; 7 z = x - y; 8 int i, tcnt = 1, acnt = 1; 9 10 int t = time(NULL); 11 srandom(t); 12 13 for(i=1; i<=3; i++){ 14 x = 1 + random() % 99; 15 printf("%dターン目\n", i); 16 // printf("%ld\n", x); 17 18 printf("第%d回予想: ", acnt); 19 scanf("%ld", &y); 20 if(y != 0){ 21 acnt ++; 22 if(y == x){ 23 puts("正解"); 24 tcnt ++; 25 }else if((z <= 5 && z >= 1) || (z <= -1 && z >= -5)){ 26 puts("おしい"); 27 }else if((z <= 6 && z >= 10) || (z <= -6 && z >= -10)){ 28 puts("もう少し"); 29 }else{ 30 puts("全然違う"); 31 } 32 } 33 } 34 double ave = acnt/tcnt; 35 printf("あなたは%dターンで%d回回答しました。1ターンあたりの平均は%f回です。\n", tcnt, acnt, ave); 36 if(ave <= 3){ 37 puts("すごい"); 38 }else if(4 <= ave && ave <= 6){ 39 puts("やるね"); 40 }else if(7 <= ave && ave <= 10){ 41 puts("まあまあ"); 42 }else{ 43 puts("普通"); 44 } 45 46 return 0; 47 48}

###試したこと
プログラミング初心者ですがかれこれこの程度に10時間以上かかってしまっています…

###補足情報(言語/FW/ツール等のバージョンなど)
VMwareでCentOS7+Eclipseでやっています
完成イメージです
完成実行イメージ

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

LouiS0616

2017/10/22 12:23

randomという関数はありませんし、yが初期化されるより先に参照されています。まずはこれらのエラーを潰してはいかがですか。
terax

2017/10/22 12:50

ターミナルでマニュアルを見たらrandomはあり、きちんと機能しているのですが…。yについては確かにそうですね。見逃しておりました。
guest

回答1

0

ベストアンサー

デバッグはしていないですが、こういう関数を作れると良さそうですね。
基本的に変数は増やせば増やすほど管理しきれなくなります。
切り分けられそうな機能はどんどん切り分けましょう。

C

1int play_one_game(int answer_num) { 2 int input_num; 3 4 for(int challenge_num = 1; 1; challange_num++) { 5 printf("第%d回予想: ", challange_num); 6 scanf("%d\n", &input_num); 7 8 if(input_num == 0) return -1; 9 10 int diff = abs(input_num - answer_num); 11 if(diff == 0) { 12 puts("正解"); 13 return challange_num; 14 } 15 else if(diff <= 5) { 16 puts("おしい"); 17 } 18 else if(diff <= 10) { 19 puts("もう少し"); 20 } 21 else { 22 puts("全然違う"); 23 } 24 } 25}

あと、根本的に理解できていなそうな部分が一つ。

C

1long int x = 0, y, z; 2z = x - y;

プログラムは数学と違います。
zには、そのときのx-yの値が入って、その後自動的に変わることはありません。
また、yの値が初期化されていないので、てんで意味不明な値が使われてしまいます。

投稿2017/10/22 12:41

編集2017/10/24 04:09
LouiS0616

総合スコア35658

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

terax

2017/10/22 13:07

ありがとうございます。1行目の説明と、returnの使い方を説明していただけないでしょうか。ググってはみたのですがあまり理解できませんでした。 また、3ターンで終了する場合はどうすればよろしいでしょうか。 宜しくお願いいたします
LouiS0616

2017/10/22 13:08

関数の定義って習ってませんか?
LouiS0616

2017/10/23 02:21

マイナス評価を受けてしまいましたが、原因に思い当たりません。 コメントをお付けいただけますか。
terax

2017/10/24 03:31

返事遅れてしまい、申し訳ございません。昨日、確認できておりませんでした。 関数の定義についてはまだ理解が浅いのですが、0が入力されるとanswer_numに-1の返り値を返すという理解でよろしいでしょうか。
LouiS0616

2017/10/24 03:59

関数play_one_gameは、『数あてゲーム』を一回して、当てるまでに要した回数challange_numを返す関数です。ただし、途中で0が入力された場合は、リタイアとみなして-1を返します。 三回『数あてゲーム』をしてスコアを計算したい場合は、三回play_one_gameを呼び出して、-1以外の結果を集計すればよいです。
terax

2017/10/24 04:08

なるほどです。そのような考え方が思いつきませんでした… ご回答くださり、ありがとうございました。
LouiS0616

2017/10/24 04:10

即興で作ってろくにデバッグしてないコードなので、バグがあるかもしれません。 適当になおして使ってみてください。 (実は今も一個こっそり編集しました。)
terax

2017/10/24 04:13

ありがとうございます。参考にさせていただきます。 また機会がありましたらよろしくお願いします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問