Skip to main content

第4回 入力処理

🔁 第4回 プレイヤーの入力を繰り返し受け取ろう

問題が作れるようになったので、次はプレイヤーの入力を受け取ります。

HIT&BLOWでは、正解するまで何度も入力します。

入力メッセージを表示
        ↓
プレイヤーが入力
        ↓
コンピュータが応答
        ↓
もう一度入力メッセージへ戻る

1.入力用の配列を用意する

char input[255];

ゲームのルールでは4桁だけですが、プレイヤーが必ず4文字だけ入力するとは限りません。

そのため、入力を受け取る段階では少し大きな配列を用意し、後で内容を確認します。


2.ここでC言語: while (1)

while (1)
{
    /* 繰り返す処理 */
}

whileは、条件が成立している間、処理を繰り返します。

C言語では、

  • 0が偽(条件不成立)
  • 0以外が真(条件成立)

として扱われます。
(-1も100も15も0以外は全部真なことに注意!)

1は常に真なので、次の処理は終わらない繰返しになります。

while (1)
{
    printf("繰り返しています。\n");
}

これを無限ループと呼びます。

💡 今は無限ループにしておき、最終回で正解したときにbreakで抜ける処理を追加します。


3.入力メッセージを表示する

printf("予想した4桁の数字を入力:");

入力を促すメッセージをプロンプトと呼ぶことがあります。

改行を入れずに表示すると、同じ行へ入力できます。

予想した4桁の数字を入力:1234

4.文字列を入力する

scanf("%254s", input);

配列名inputは、配列の先頭位置を表すため、&inputとは書きません。

scanf("%254s", input);   /* 今回はこちら */

⚠️ int型の変数を%dで入力するときは&numberと書きますが、文字配列へ%sで入力するときは配列名をそのまま渡します。

↑これって、ちゃんと理屈あるんだけど、はじめは%sのときは、配列名を渡す。で覚えたほうがいいと思う。


5.入力した内容をそのまま表示して確認する

まずは、入力された文字列が正しく配列へ入ったか確認します。

printf("入力された文字列:%s\n", input);

6.前回のプログラムへ入力ループを追加する

前回作成したMakeProblem関数は、そのまま残します。

main関数を次のようにします。

int main(void)
{
    char answer[5];
    char input[255];

    srand((unsigned int)time(NULL));
    MakeProblem(answer);

    /* デバッグ中だけ正解を表示する */
    printf("正解:%s\n", answer);

    while (1)
    {
        printf("予想した4桁の数字を入力:");
        scanf("%254s", input);

        printf("入力された文字列:%s\n", input);
    }

    return 0;
}

実行すると、何度でも入力できるようになります。

正解:8250
予想した4桁の数字を入力:1234
入力された文字列:1234
予想した4桁の数字を入力:5678
入力された文字列:5678
予想した4桁の数字を入力:

プログラムは自動では終了しません。

Visual Studioで実行を止めるか、コンソール画面を閉じてください。
(多分Ctrl+Cあたりで止まります)


7.疑似言語との対応

今回作ったのは、全体の疑似言語の次の部分です。

■ hit ≠ 4
│ ・4桁を入力する
│
■

今はまだHITを数えていないため、C言語では一時的にwhile (1)を使っています。

while (1)
{
    printf("予想した4桁の数字を入力:");
    scanf("%254s", input);
}

🏁 今回のまとめ

  • プレイヤーの入力はchar input[255]へ保存する
  • whileは条件が成立している間、処理を繰り返す
  • while (1)は無限ループになる
  • %sで文字配列へ入力するときは、配列名をそのまま渡す
  • 入力メッセージ、入力待ち、応答を繰り返す部分がゲームループになる

次回は、入力が本当にゲームのルールを満たしているか確認します。 (かなり重要なところだね)