C言語入門|STEP2:キャラクターと職業を定義しよう-構造体と列挙型でパーティを作る

はじめに:RPGの主役はキャラクター

STEP1では、バトルRPG全体の流れと構成を確認しました。
STEP2では、いよいよ RPGの主役であるキャラクター をプログラムで表現していきます。

RPGでは、

  • 勇者はバランス型
  • 戦士は攻撃力が高い
  • 魔法使いは魔法が得意

といったように、職業ごとに役割がはっきり分かれています
この個性をC言語で表現するのが、STEP2のテーマです。

今回のパーティ構成を確認しよう

今回のRPGでは、パーティは固定で 3人 です。

キャラクター職業特徴
勇者HERO攻守バランス型
戦士WARRIOR高HP・高攻撃力
魔法使いMAGE高MP・高魔力

この3人を 配列+構造体 で管理します。

職業を列挙型で定義する理由

まずは「職業」をどう表すかを考えましょう。

C言語では、
文字列で "勇者" や "戦士" を扱うこともできますが、
数値で管理したほうが安全で高速です。

そこで使うのが 列挙型(enum) です。

職業の定義イメージ

意味
0勇者
1戦士
2魔法使い

これを enum でまとめることで、

  • 書き間違いを防げる。
  • switch や if で分岐しやすい。
  • 配列インデックスとして使える。

といったメリットがあります。

キャラクターを構造体で表現する

次に、キャラクターそのものを表現します。

RPGのキャラクターは、
名前・HP・MP・攻撃力・レベルなど、
たくさんの情報をひとまとめで扱う必要があります。

そこで登場するのが 構造体(struct) です。

キャラクター構造体が持つ情報

今回のキャラクター構造体には、次のような情報が含まれています。

項目内容
名前表示用のキャラ名
職業勇者・戦士・魔法使い
レベル現在の成長段階
HP / MP体力と魔力
最大HP / 最大MP上限値
攻撃力物理攻撃の基礎
魔力魔法ダメージの基礎
装備補正武器・杖による上昇分
生存状態戦闘不能かどうか
経験値レベルアップ用
防御状態次の被ダメージ軽減
魔法そのキャラ専用の魔法

このように見ると、
RPGキャラクターの要素がすべて詰まっていることが分かりますね。

なぜ base と 装備 を分けているのか

構造体を見ると、

  • base_atk
  • weapon_atk
  • base_magic
  • staff_magic

のように、能力値が分かれています。

これはとても重要な設計です。

分けておくメリット

項目理由
基礎能力レベルアップで増える。
装備補正武器を変えたら差し替えるだけ。
合計値計算式で簡単に求められる。

これにより、

  • 装備を外しても基礎能力は戻る。
  • 強い武器を持たせても処理が簡単
  • 将来の拡張がしやすい。

という、ゲームらしい設計が実現できます。

パーティを配列で管理する考え方

今回のRPGでは、キャラクターは 最大3人 と決まっています。

そこで、

  • キャラクター構造体 × 3
  • 配列でまとめて管理

という方法を使います。

パーティ管理のイメージ

インデックスキャラクター
0勇者
1戦士
2魔法使い

この方法なら、

  • for文で全員処理できる。
  • 生存チェックが簡単
  • バトル処理がスッキリ

といった利点があります。

キャラクター初期化の考え方

ゲーム開始時には、
全キャラクターを初期状態に戻す処理が必要です。

ここで行っているのは、

  • 名前の設定
  • 職業の設定
  • 初期HP / MPの設定
  • 生存状態を生きているにする。
  • 魔法リストの初期化

といった処理です。

初期化を1か所にまとめておくことで、

  • ゲームオーバー後の再スタート
  • ロード失敗時のリセット

なども、簡単に対応できます。

魔法データをキャラクターが持つ理由

今回の設計では、
魔法はキャラクターごとに4つ固定で持つ形になっています。

これは、

  • 職業ごとの個性を明確にする。
  • バトル中の選択肢をシンプルにする。
  • 複雑な魔法管理を避ける。

ためです。

結果として、

  • 勇者は回復も攻撃もできる。
  • 戦士は自己強化が得意
  • 魔法使いは攻撃魔法と回復を担当

という役割分担が自然に表現できます。

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

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

  • 職業は enum で定義すると安全
  • キャラクターは struct でまとめて管理
  • 能力値は 基礎 と 装備 を分ける
  • パーティは配列で扱うと処理が楽
  • 初期化処理は関数にまとめると便利

ここまで理解できれば、
RPGの登場人物をC言語で表現できるようになったと言えます 👍