
C言語入門|STEP6:バトルシステムを作ろう-コマンド選択型ターン制バトル
はじめに:RPGの中心はバトルシステム
STEP5では、敵キャラクターと簡易AIの仕組みを解説しました。
STEP6では、いよいよ RPGの心臓部であるバトルシステム を作っていきます。
このSTEPで実装しているのは、
- コマンド選択型
- ターン制
- 味方 → 敵 の順で進行
という、王道RPGスタイルの戦闘です。
複雑そうに見えますが、
実は「順番に処理しているだけ」なので、落ち着いて見ていきましょう。

今回のバトルシステムの基本ルール
まずは、今回のバトルのルールを整理します。
| 項目 | 内容 |
|---|---|
| 参加人数 | 味方3人 vs 敵1体 |
| 進行方式 | ターン制 |
| 行動順 | 味方全員 → 敵 |
| 勝利条件 | 敵HPが0 |
| 敗北条件 | 味方全員が戦闘不能 |
とてもシンプルな構成なので、
C言語での実装にも向いています。
バトルは1つの関数で完結させる
今回の設計では、
バトル全体を1つの関数にまとめています。
この関数の役割は次のとおりです。
- 敵の登場演出
- ターンの繰り返し
- コマンド入力の受付
- ダメージ計算
- 勝敗判定
「バトル中のことは、すべてこの関数に任せる」
という考え方にすると、プログラム全体が整理されます。
ターン制バトルの考え方
ターン制バトルの本質は、とても単純です。
- 味方が行動する。
- 敵が行動する。
- どちらかが倒れるまで繰り返す
この流れを while ループ で表現しています。
敵のHPが0になるまでループを続ける、
という形なので、自然と戦闘が継続します。
味方ターンの処理の流れ
味方ターンでは、
生きているキャラクター全員が順番に行動します。
処理の流れは次のとおりです。
| 手順 | 内容 |
|---|---|
| 1 | 生存チェック |
| 2 | 行動メニュー表示 |
| 3 | 入力受付 |
| 4 | 行動処理 |
| 5 | 次のキャラへ |
このように分解して考えると、
バトル処理がぐっと分かりやすくなります。
行動コマンドの種類
プレイヤーが選べる行動は、次の4つです。
| コマンド | 内容 |
|---|---|
| 戦う | 通常攻撃 |
| 魔法 | MPを使った特殊行動 |
| アイテム | 回復・装備変更 |
| 防御 | 次の被ダメージ軽減 |
この4択だけでも、
十分に戦略性のあるバトルになります。
通常攻撃の処理
通常攻撃は、最も基本的な行動です。
攻撃時には、
- キャラクターの攻撃力
- 少しのランダム要素
を加えてダメージを計算します。
さらに、
- 敵が防御中ならダメージ半減
という処理も入っています。
これにより、
「防御する意味」がしっかりと生まれます。
魔法コマンドの扱い方
魔法コマンドを選ぶと、
- 使用する魔法を選択
- MPが足りるか確認
- 魔法効果を適用
という流れになります。
もし、
- MP不足
- 入力ミス
などで魔法が使えなかった場合は、
自動的に通常攻撃に切り替える設計です。
これにより、
- 操作ミスで何も起きない。
- ゲームが止まる。
といったストレスを防いでいます。
アイテム使用の処理
アイテムコマンドでは、
- 所持アイテム一覧を表示
- 使用または装備を選択
します。
回復アイテムの場合は、
- 対象キャラを選ぶ
- HPやMPを回復
- 所持数を減らす
という処理が行われます。
装備品の場合は、
- 職業に合っているか確認
- 装備できれば能力を更新
といった流れになります。
防御コマンドの役割
防御コマンドは、とても重要です。
防御を選ぶと、
- 防御状態フラグが立つ
- 次に受けるダメージが半減
します。
攻撃できない代わりに、
- 大ダメージを防ぐ
- 次のターンにつなぐ
といった 戦略的な選択 が可能になります。
敵ターンの処理の流れ
味方全員の行動が終わると、敵のターンです。
敵ターンでは、
- 魔法を使うか判定
- 使えなければ通常攻撃
- 対象をランダムに選択
という流れになります。
STEP5で作った敵AIが、
ここで活躍します。
戦闘不能の判定と処理
ダメージを受けてHPが0以下になると、
- HPを0に補正
- 生存フラグをオフ
します。
これにより、
- 行動できなくなる。
- 経験値をもらえなくなる。
といった影響が出ます。
戦闘不能の扱いをきちんと決めておくことで、
後の処理がとても楽になります。
勝利・敗北の判定
バトル中は常に、
- 敵のHP
- 味方の生存人数
をチェックしています。
| 状態 | 結果 |
|---|---|
| 敵HPが0 | 勝利 |
| 味方全滅 | 敗北 |
勝利した場合は、
- 経験値獲得
- レベルアップ処理
へと進みます。
敗北した場合は、
- ゲームオーバー
- タイトル画面へ戻る
という流れになります。
Enter待ちを入れている理由
バトル終了後には、
Enterキー待ちを入れています。
これは、
- 結果をしっかり読める。
- 画面が一気に切り替わらない。
ようにするためです。
こうした小さな工夫が、
遊びやすさ に大きく影響します。
STEP6で理解しておきたいポイントまとめ
STEP6で押さえておきたいポイントはこちらです。
- バトルは1つの関数で管理すると分かりやすい。
- ターン制は while ループで表現できる。
- 行動は 戦う・魔法・アイテム・防御 の4つ
- 防御フラグでダメージ軽減を実現
- 勝敗判定を常に行うことが重要
ここまで来ると、
RPGとして「ちゃんと遊べる」状態 になっています 👍
