C言語入門|STEP6:バトルシステムを作ろう-コマンド選択型ターン制バトル

はじめに:RPGの中心はバトルシステム

STEP5では、敵キャラクターと簡易AIの仕組みを解説しました。
STEP6では、いよいよ RPGの心臓部であるバトルシステム を作っていきます。

このSTEPで実装しているのは、

  • コマンド選択型
  • ターン制
  • 味方 → 敵 の順で進行

という、王道RPGスタイルの戦闘です。

複雑そうに見えますが、
実は「順番に処理しているだけ」なので、落ち着いて見ていきましょう。

今回のバトルシステムの基本ルール

まずは、今回のバトルのルールを整理します。

項目内容
参加人数味方3人 vs 敵1体
進行方式ターン制
行動順味方全員 → 敵
勝利条件敵HPが0
敗北条件味方全員が戦闘不能

とてもシンプルな構成なので、
C言語での実装にも向いています。

バトルは1つの関数で完結させる

今回の設計では、
バトル全体を1つの関数にまとめています

この関数の役割は次のとおりです。

  • 敵の登場演出
  • ターンの繰り返し
  • コマンド入力の受付
  • ダメージ計算
  • 勝敗判定

「バトル中のことは、すべてこの関数に任せる」
という考え方にすると、プログラム全体が整理されます。

ターン制バトルの考え方

ターン制バトルの本質は、とても単純です。

  1. 味方が行動する。
  2. 敵が行動する。
  3. どちらかが倒れるまで繰り返す

この流れを while ループ で表現しています。

敵のHPが0になるまでループを続ける、
という形なので、自然と戦闘が継続します。

味方ターンの処理の流れ

味方ターンでは、
生きているキャラクター全員が順番に行動します。

処理の流れは次のとおりです。

手順内容
1生存チェック
2行動メニュー表示
3入力受付
4行動処理
5次のキャラへ

このように分解して考えると、
バトル処理がぐっと分かりやすくなります。

行動コマンドの種類

プレイヤーが選べる行動は、次の4つです。

コマンド内容
戦う通常攻撃
魔法MPを使った特殊行動
アイテム回復・装備変更
防御次の被ダメージ軽減

この4択だけでも、
十分に戦略性のあるバトルになります。

通常攻撃の処理

通常攻撃は、最も基本的な行動です。

攻撃時には、

  • キャラクターの攻撃力
  • 少しのランダム要素

を加えてダメージを計算します。

さらに、

  • 敵が防御中ならダメージ半減

という処理も入っています。

これにより、
「防御する意味」がしっかりと生まれます。

魔法コマンドの扱い方

魔法コマンドを選ぶと、

  1. 使用する魔法を選択
  2. MPが足りるか確認
  3. 魔法効果を適用

という流れになります。

もし、

  • MP不足
  • 入力ミス

などで魔法が使えなかった場合は、
自動的に通常攻撃に切り替える設計です。

これにより、

  • 操作ミスで何も起きない。
  • ゲームが止まる。

といったストレスを防いでいます。

アイテム使用の処理

アイテムコマンドでは、

  • 所持アイテム一覧を表示
  • 使用または装備を選択

します。

回復アイテムの場合は、

  • 対象キャラを選ぶ
  • HPやMPを回復
  • 所持数を減らす

という処理が行われます。

装備品の場合は、

  • 職業に合っているか確認
  • 装備できれば能力を更新

といった流れになります。

防御コマンドの役割

防御コマンドは、とても重要です。

防御を選ぶと、

  • 防御状態フラグが立つ
  • 次に受けるダメージが半減

します。

攻撃できない代わりに、

  • 大ダメージを防ぐ
  • 次のターンにつなぐ

といった 戦略的な選択 が可能になります。

敵ターンの処理の流れ

味方全員の行動が終わると、敵のターンです。

敵ターンでは、

  1. 魔法を使うか判定
  2. 使えなければ通常攻撃
  3. 対象をランダムに選択

という流れになります。

STEP5で作った敵AIが、
ここで活躍します。

戦闘不能の判定と処理

ダメージを受けてHPが0以下になると、

  • HPを0に補正
  • 生存フラグをオフ

します。

これにより、

  • 行動できなくなる。
  • 経験値をもらえなくなる。

といった影響が出ます。

戦闘不能の扱いをきちんと決めておくことで、
後の処理がとても楽になります。

勝利・敗北の判定

バトル中は常に、

  • 敵のHP
  • 味方の生存人数

をチェックしています。

状態結果
敵HPが0勝利
味方全滅敗北

勝利した場合は、

  • 経験値獲得
  • レベルアップ処理

へと進みます。

敗北した場合は、

  • ゲームオーバー
  • タイトル画面へ戻る

という流れになります。

Enter待ちを入れている理由

バトル終了後には、
Enterキー待ちを入れています。

これは、

  • 結果をしっかり読める。
  • 画面が一気に切り替わらない。

ようにするためです。

こうした小さな工夫が、
遊びやすさ に大きく影響します。

STEP6で理解しておきたいポイントまとめ

STEP6で押さえておきたいポイントはこちらです。

  • バトルは1つの関数で管理すると分かりやすい。
  • ターン制は while ループで表現できる。
  • 行動は 戦う・魔法・アイテム・防御 の4つ
  • 防御フラグでダメージ軽減を実現
  • 勝敗判定を常に行うことが重要

ここまで来ると、
RPGとして「ちゃんと遊べる」状態 になっています 👍