いまの状態だと「9」とか「5」を入力しても何も起きずに次のループに進むだけ。
「無効なコマンドです」と表示するようにしましょう。
else if (command == 0) の後ろに else { ... } を足すbreak; は要らない(戻ってコマンド入力をやり直す)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;
}
ここからは自由課題です。やりたいものから挑戦してください。
ヒントと正解例は折りたたみの中にあります。
毎回「さんぎょ」だと寂しいので、ゲーム開始時に自分の名前を入力できるようにしましょう。
main 関数の最初(「=== バトルスタート ===」の表示の前あたり)に、名前入力の処理を入れるprintf("あなたの名前を入力してください: ");scanf("%s", playerName);(playerName には & を付けないことに注意)int main() {
int command;
printf("あなたの名前を入力してください: ");
scanf("%s", playerName);
printf("=== バトルスタート ===\n");
// 以下は同じ
while (1) {
// ...
}
}
いまのスライムは HP 5 で、3回攻撃したら倒せます。もっと粘ってくる強敵にしてみましょう。
int enemyParam[3] = { 5, 3, 2 }; の 5 を大きくするだけ{ 20, 3, 2 } にすると HP 20 のスライムになる// HPを20に増やす
int enemyParam[3] = { 20, 3, 2 };
// さらに防御力も上げて手強くする
int enemyParam[3] = { 20, 3, 3 };
このゲームは敵が一方的にやられるだけ。
プレイヤーが攻撃した後、敵もプレイヤーに反撃するようにします。
プレイヤーの HP が 0 になったらゲームオーバーです。
battle() 関数の中、「%sをたおした!」の処理の後ろに敵の攻撃を足す敵の攻撃力 - プレイヤーの防御力return; でbattle関数を抜けるmain の if (enemyParam[CHAR_HP] <= 0) の後ろに、プレイヤーHPもチェックする if を足す// ====== 戦闘処理(プレイヤー攻撃 → 敵の反撃)======
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;
}
}
waitEnter() のメッセージを好きな文言に変えてみる(例:「▶ 次へ」「Press Enter...」など)| 使った仕組み | 役割 |
|---|---|
printf | 画面に表示する |
scanf | キーボードから入力を受け取る |
if / else if / else | 入力によって動作を変える |
while・配列・関数といった「今回は読めなくてOK」だった仕組みを、しっかり扱っていきます。