番外編:ドラ〇エ風RPGをつくってみる(STEP 2)

STEP 2scanf を足して、入力で動かそう

いまは「自動で攻撃し続けて終わる」だけで、プレイヤーが何かを選ぶ場面がありません。
ここから main 関数を書き換えて、ゲームらしい「コマンド入力」の流れを作ります。

やりたいことの流れ

1. 自分のステータスを表示する(showStatus();
2. 敵のステータスを表示する(showEnemy();
3. 「1: たたかう」とコマンドの一覧を表示する
4. ユーザーの入力を受け取る(scanf
5. 入力が 1 なら battle(); を呼んで戦う
6. 敵の HP が 0 以下になったらループを抜ける(break
7. ループ末尾で waitEnter(); を呼び、Enter で次のターンへ
⚠ 今回はまだ「1 以外を入力したときの処理」は書きません。
1 以外を入力すると何も起きずに次のターンへ進むだけです。次の STEP で対応します。

変更するのは main 関数だけ

他の場所はさわらなくてOK。main 関数の中身を以下のように書き換えます。

💡 ヒント(何をするか)
なぜ scanf の直後に getchar(); が必要?
scanf("%d", ...) で数字を入力して Enter を押すと、その Enter(改行)が入力バッファに残ります。
この状態で waitEnter() が呼ばれると、残った改行をそのまま読み取って一瞬で素通りしてしまいます。
scanf の直後に getchar(); を1行入れて、残った改行を先に捨てておきます。
✅ 正解例コード(main関数のみ)
int main() {
    int command;   // ★ 追加:入力されたコマンドを入れる変数

    printf("=== バトルスタート ===\n");

    while (1) {
        showStatus();
        showEnemy();

        printf("\n1: たたかう\n");                    // ★ 追加
        printf("コマンドを入力してください: ");       // ★ 追加
        scanf("%d", &command);                        // ★ 追加
        getchar();   // ★ 追加:scanf が残した Enter を捨てる

        if (command == 1) {                            // ★ 追加:1なら攻撃
            battle();

            if (enemyParam[CHAR_HP] <= 0) {
                break;
            }
        }

        waitEnter();   // ★ 追加:Enter キー待ち
    }

    printf("=== バトル終了 ===\n");
    return 0;
}
▶ やってみよう
実行して、何度か「1」を入力してスライムを倒してみる。
「2」や「9」を入力したらどうなるかも試してみよう。

気づいたこと

「1以外」を入力してもエラーにはなりませんが、戦闘が進まないまま無限ループになります。
「にげる」や「無効な入力を弾く」処理を入れて、ちゃんとしたゲームにしていきましょう。