RPGキャラクター
CoddyのCジャーニー「オブジェクト指向プログラミング」セクションの一部。レッスン 58/61。
チャレンジ
簡単RPGキャラクターの戦闘システムを作りましょう。構造体、メソッド、コンストラクター、オブジェクト間の相互作用を、すっきりとモジュール化された設計にまとめた古典的な例です。
コードを次の3つのファイルに分けて整理します。
character.h:2つの整数フィールド、healthとdamageを持つCharacter構造体を定義します。キャラクターの作成、攻撃の実行、キャラクターが生きているかの確認、キャラクターのステータスの表示を行う関数プロトタイプを宣言します。character.c:キャラクターシステムを実装します。create_character:初期体力とダメージの値を受け取り、ヒープ上にCharacterを割り当ててフィールドを初期化し、ポインターを返します。attack:2つのCharacterポインター(攻撃側と対象)を受け取り、攻撃側のダメージ分だけ対象の体力を減らします。is_alive:const Characterポインターを受け取り、体力が0より大きければ1を返し、それ以外の場合は0を返します。print_status:const Characterポインターを受け取り、Health: Xの形式でキャラクターの体力を表示します。free_character:割り当てたメモリを解放します。
main.c:戦闘シミュレーションを作成します。ヒーローの体力、ヒーローのダメージ、敵の体力、敵のダメージを表す4つの整数を読み込みます。コンストラクターを使って両方のキャラクターを作成します。その後、戦闘ラウンドをシミュレートします。各ラウンドでは、まずヒーローが攻撃し、次に敵が反撃します。ヒーローの攻撃で敵の体力が0以下になると、敵は倒され、そのラウンドでは反撃しません。どちらかのキャラクターが倒れるまで続けます。各ラウンドの後、両方のキャラクターのステータスを(先にヒーロー、次に敵の順で)表示します。戦闘が終わったら、生き残ったのが誰かに応じてHero wins!またはEnemy wins!を表示します。両方のキャラクターのメモリを解放するのを忘れないでください。
プログラムには次の4つの入力が与えられます。
- ヒーローの初期体力
- ヒーローの1回の攻撃あたりのダメージ
- 敵の初期体力
- 敵の1回の攻撃あたりのダメージ
入力が50、20、30、15の場合の出力例:
Health: 35
Health: 10
Health: 35
Health: -10
Hero wins!入力が20、5、100、25の場合の出力例:
Health: -5
Health: 95
Enemy wins!ヘッダーファイルでインクルードガードを使用することを忘れないでください。attack関数は、あるオブジェクトが別のオブジェクトの内部状態を変更できることを示しています。これはオブジェクト指向設計における重要な概念です。データを読み取るだけの関数では、適切にconstポインターを使用してください。
自分で試してみよう
#include <stdio.h>
#include "character.h"
int main() {
// 入力値を読み取る
int hero_health, hero_damage, enemy_health, enemy_damage;
scanf("%d", &hero_health);
scanf("%d", &hero_damage);
scanf("%d", &enemy_health);
scanf("%d", &enemy_damage);
// TODO: create_characterを使ってヒーローと敵のキャラクターを作成する
// TODO: 戦闘のラウンドをシミュレートする
// - ヒーローが先に攻撃する
// - 敵がまだ生きていれば攻撃する
// - 各ラウンド後に両キャラクターの状態を出力する(ヒーロー、敵の順)
// - どちらかのキャラクターが倒れるまで続ける
// TODO: 勝者を出力する("Hero wins!" または "Enemy wins!")
// TODO: 両キャラクターを解放する
return 0;
}
オブジェクト指向プログラミングのすべてのレッスン
自分で練習してみよう: Cオンラインコンパイラ