Menu
Coddy logo textTech

RPGキャラクター

CoddyのCジャーニー「オブジェクト指向プログラミング」セクションの一部。レッスン 58/61。

challenge icon

チャレンジ

簡単

RPG Character の戦闘システムを構築しましょう。これは、struct、メソッド、コンストラクター、オブジェクト間の相互作用を、すっきりとしたモジュール設計にまとめた古典的な例です。

コードを3つのファイルに分けて整理します。

  • character.h:2つの整数フィールド、healthdamage を持つ Character struct を Define します。Character の作成、攻撃の実行、Character が生存しているかの確認、Character のステータスの表示を行う関数プロトタイプを Declare します。
  • character.c:Character システムを Implement します。
    • create_character:初期の health と damage の値を受け取り、heap 上に Character を割り当て、その fields を初期化して、ポインターを返します
    • attack:2つの Character ポインター(attacker と target)を受け取り、attacker の damage の分だけ target の health を減らします
    • is_alive:const Character ポインターを受け取り、health が 0 より大きい場合は 1、そうでなければ 0 を返します
    • print_status:const Character ポインターを受け取り、Character の health を Health: X の format で表示します
    • free_character:割り当てられたメモリを free します
  • main.c:戦闘シミュレーションを Create します。hero の開始時の health、hero の damage、enemy の開始時の health、enemy の damage を表す4つの整数を読み込みます。コンストラクターを使用して両方の Character を Create します。その後、combat のラウンドをシミュレートします。各ラウンドでは、hero が first に攻撃し、その後 enemy が反撃します。両方の攻撃は同じラウンド内で発生するため、hero の攻撃によって enemy の health がすでに 0 以下になっていても、enemy の反撃は実行されます。どちらか一方の Character が falls するまで Continue します。各ラウンドの後に、両方の Character のステータスを(hero、次に enemy の順で)表示します。combat が終了したら、生き残った方に応じて Hero wins! または Enemy wins! を表示します。両方の Character を忘れずに Free してください。

プログラムは4つの入力を受け取ります。

  1. Hero の開始時の health
  2. Hero の攻撃ごとの damage
  3. Enemy の開始時の health
  4. Enemy の攻撃ごとの damage

入力が 50203015 の場合の出力例:

Health: 35
Health: 10
Health: 20
Health: -10
Hero wins!

入力が 20510025 の場合の出力例:

Health: -5
Health: 95
Enemy wins!

header ファイルでは include guard を使用することを忘れないでください。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オンラインコンパイラ