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

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

ただいまの
回答率

89.13%

数あてゲームが思い通りに動作しません。初心者の単純なプログラムです。

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 4,389

roun

score 10

前提・実現したいこと

c言語で「1から100までの数字を当てる数あてゲーム」を作っています。この本に乗っているサンプルコードを丸写ししました。
https://www.amazon.co.jp/dp/B01AWPJ7DS/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1
1から100までの数字をパソコンがランダムに決め、その数字を遊ぶ人が当てるゲームです。
入力した数字が答えより大きいか小さいかを表示したり、正解したときは「お見事!」「x回目で正解です!」という文章を表示させたりしたいです。

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

答えとなる数字が、何度やっても「42」になります。プログラムを再起動しても変わりません。(ググったのですが、これはrand関数の仕様で、正常なのでしょうか?初心者なので、全くわかりません。)

また、42を入力しても、「お見事!」「x回目で正解です!」という文章が表示されません。

数あてゲームです!
私が考えた数字を当てられるでしょうか?(1100)
答えはいくつでしょう?>41
もっと大きい!
答えはいくつでしょう?>43
もっと小さい!
答えはいくつでしょう?>42
答えはいくつでしょう?>42
答えはいくつでしょう?>

該当のソースコード

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

int main(void) {
    int answer;
    char x[5];
    int isGamePlay = 1;
    int count = 0;
    int input;

    //答えをランダムに生成
    answer = rand() % 100 + 1;

    printf("数あてゲームです!\n");
    printf("私が考えた数字を当てられるでしょうか?(1~100)\n");
    //逆スラッシュをこのフォントで入力しようとすると\になる

    while (isGamePlay) {
        count = count + 1;
        printf("答えはいくつでしょう?>");
        fgets(x, 4, stdin);
        input = atoi(x);

        //範囲外の数値が入力されたとき
        if (input < 1 || input > 100) {
            printf("1から100までの数字を入力してください!\n");
            continue;
        }
        //正解のとき
        if (input == answer) {
            isGamePlay == 0;
        }

        //答えより大きかったとき
        if (input > answer) {
            printf("もっと小さい!\n");
        }

        //答えより小さかったとき
        if (input < answer) {
            printf("もっと大きい!\n");
        }
    }

    printf("お見事!\n");
    printf("%d 回目で正解です!", count);

    return 0;
}

試したこと

本のサンプルコードと自分が書いたコードを良く見比べてみたのですが、間違っているところはないように思えます。間違いを見落としているのか、そもそもサンプルコードが間違っているのかわかりません。

補足情報(言語/FW/ツール等のバージョンなど)

microsoft visual studio 2017を使用しました。バージョンなどの細かいことはわかりません。イメージ説明

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+2

isGamePlay == 0;
これでいいのですか?

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/07/09 23:01

    ああ、追記しようとしたらすでに書かれていた・・・

    キャンセル

  • 2017/07/09 23:10

    それです!全く気づきませんでした!ありがとうございます!

    キャンセル

+2

rand関数を用いるときは必ずsrand関数でseedを初期化しましょう。

rand関数は擬似的な乱数を生成します。これは同じseedに対して常に同じ乱数列を生成することを意味します。

つまり真の乱数をseedにする必要があります。真の乱数に何を採用するかは用途によって議論を呼びますが、とりあえず乱数っぽいものとしてはtime関数が返す値なんかがいいでしょう。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/07/09 23:02

    ありがとうございます。srand関数でググると、分かりやすいサイトが出てきました。助かりました。

    キャンセル

  • 2017/07/09 23:12

    すいません。理解したと思ったら、やっぱり難しくてわかりませんでした。
    このプログラムの場合は、どのように書けばよいのでしょうか?
    教えていただけないでしょうか。

    キャンセル

  • キャンセル

  • 2017/07/09 23:26

    コードを書き換えたら、毎回ランダムに答えが決まるようになりました。本当にありがとうございました。

    キャンセル

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

  • ただいまの回答率 89.13%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる