番外編:ドラ〇エ風RPGをつくってみる(STEP 4・完成と発展)

STEP 4無効なコマンドに対応しよう

いまの状態だと「9」とか「5」を入力しても何も起きずに次のループに進むだけ。
「無効なコマンドです」と表示するようにしましょう。

💡 ヒント
✅ 正解例コード(main関数のみ・完成版)
int main() {
    int command;

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

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

        printf("\n0: にげる\n");
        printf("1: たたかう\n");
        printf("コマンドを入力してください: ");
        scanf("%d", &command);
        getchar();

        if (command == 1) {
            battle();

            if (enemyParam[CHAR_HP] <= 0) {
                break;
            }
        }
        else if (command == 0) {
            printf("\n%sはにげだした!\n", playerName);
            break;
        }
        else {                                              // ★ 追加:それ以外の入力
            printf("\n無効なコマンドです。もう一度入力してください。\n");
        }

        waitEnter();
    }

    printf("=== バトル終了 ===\n");
    return 0;
}
▶ やってみよう
「9」など適当な数字を入力 → 「無効なコマンドです」と出てもう一度入力を求められる。
ここまでで STEP 4 完成。お疲れさまでした!
✅ これで 「最低限のゲーム」が完成しました。
早く終わった人は、下の「もっと改造してみよう」に挑戦してみましょう。
まだ作業中の人を手伝ってあげてもOKです。

発展もっと改造してみよう

ここからは自由課題です。やりたいものから挑戦してください。
ヒントと正解例は折りたたみの中にあります。

① プレイヤーの名前を入力できるようにする(おすすめ・かんたん)

毎回「さんぎょ」だと寂しいので、ゲーム開始時に自分の名前を入力できるようにしましょう。

💡 ヒント
✅ 正解例コード(main関数の冒頭部分)
int main() {
    int command;

    printf("あなたの名前を入力してください: ");
    scanf("%s", playerName);

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

    // 以下は同じ
    while (1) {
        // ...
    }
}

② スライムを強くする

いまのスライムは HP 5 で、3回攻撃したら倒せます。もっと粘ってくる強敵にしてみましょう。

💡 ヒント
✅ 例
// HPを20に増やす
int enemyParam[3] = { 20, 3, 2 };

// さらに防御力も上げて手強くする
int enemyParam[3] = { 20, 3, 3 };

③ 敵の反撃を入れる(ちょっと難しい)

このゲームは敵が一方的にやられるだけ。
プレイヤーが攻撃した後、敵もプレイヤーに反撃するようにします。
プレイヤーの HP が 0 になったらゲームオーバーです。

💡 ヒント
  1. battle() 関数の中、「%sをたおした!」の処理の後ろに敵の攻撃を足す
  2. 敵の攻撃ダメージは 敵の攻撃力 - プレイヤーの防御力
  3. そのダメージをプレイヤーの HP から引く
  4. 敵を倒した場合は反撃させないように return; でbattle関数を抜ける
  5. mainif (enemyParam[CHAR_HP] <= 0) の後ろに、プレイヤーHPもチェックする if を足す
✅ 正解例コード(battle関数とmain関数)
// ====== 戦闘処理(プレイヤー攻撃 → 敵の反撃)======
void battle() {
    // プレイヤーの攻撃
    int damage = playerParam[CHAR_STR] - enemyParam[CHAR_DEF];
    if (damage < 0) damage = 0;

    enemyParam[CHAR_HP] -= damage;
    Sleep(400);
    printf("\n%sのこうげき!", playerName);
    Sleep(600);
    printf("%sに%dのダメージ!\n", enemyName, damage);
    Sleep(400);

    // 敵を倒した場合はここで終了(反撃させない)
    if (enemyParam[CHAR_HP] <= 0) {
        printf("%sをたおした!\n", enemyName);
        return;
    }

    // 敵の反撃
    int counter = enemyParam[CHAR_STR] - playerParam[CHAR_DEF];
    if (counter < 0) counter = 0;

    playerParam[CHAR_HP] -= counter;
    Sleep(400);
    printf("%sのこうげき!", enemyName);
    Sleep(600);
    printf("%sに%dのダメージ!\n", playerName, counter);
}

// main関数のif分岐部分にプレイヤーHPチェックを追加
if (command == 1) {
    battle();

    if (enemyParam[CHAR_HP] <= 0) {
        break;
    }
    if (playerParam[CHAR_HP] <= 0) {
        printf("\n%sはたおれた...\n", playerName);
        break;
    }
}
⚠ いまの数値設定だと、プレイヤー攻撃力3 − 敵防御力2 = ダメージ1、敵攻撃力3 − プレイヤー防御力3 = ダメージ0、なのでプレイヤーが一方的に勝ちます
発展②で敵を強くしたり、プレイヤーの防御力を下げたりして調整してみよう。

④ さらに何かやりたい人へ


今回のまとめ

使った仕組み役割
printf画面に表示する
scanfキーボードから入力を受け取る
if / else if / else入力によって動作を変える
✅ ゲームの基本は「表示する → 入力をもらう → 条件で分岐する」の繰り返し。
これまで学んできた小さな道具を組み合わせるだけで、ちゃんと遊べるものが作れることが体感できたはずです。
これからの授業では、while・配列・関数といった「今回は読めなくてOK」だった仕組みを、しっかり扱っていきます。