Skip to content
第28回 拠点の勝敗とリトライ

1 / 1 拠点の勝敗とリトライ ​

このステップの目的

拠点HPで勝敗を決め、リトライ時に進行中の状態を初期化します。

第28回の到達版で敵拠点を破壊し、勝利画面を見ます。出撃しない場合は敵に味方拠点を破壊されます。敵が一時的にいなくなることと、拠点を破壊することを区別してください。

勝敗の条件 ​

Battle.cppのBattle::CheckResultを実装します。味方拠点のHPが0以下ならResult::Defeat、それ以外で敵拠点が0以下ならResult::Victoryへ変えます。両方が同時に0なら敗北という優先順です。個体数やウェーブの予定数は条件に使いません。

Updateの先頭では、結果が決まったら更新を終了しています。main.cppは結果画面でRを押すとResetを呼びます。これは提供済みの接続です。

リセットする状態 ​

Battle::Resetを読んで、個体一覧、再出撃待ち時間、戦闘時計、資源、両拠点HP、出現予定の読み取り位置、結果、表示メッセージが戻る箇所を探してください。現在の確認用の敵1体はリセット後に再生成します。第32回で、この1体をウェーブによる出現へ置き換えます。

勝利後にRを押し、開始状態へ戻ることを確認します。敗北側でも繰り返してください。結果後にPを押した状態からでも、リトライで停止状態が解除されます。

確認用に最大HPや攻撃力を変更した場合は元へ戻します。次回は勝敗が一周するゲームから、種類ごとの性能差を作ります。

実装後に比較する参考コード
Source/TowerDefense/Battle.cppcpp
void Battle::CheckResult()
{
    // 同時に両拠点が0なら敗北。出現予定の完了だけでは勝利にしない。
    if (allyHp_ <= 0) result_ = Result::Defeat;
    else if (enemyHp_ <= 0) result_ = Result::Victory;
}
実装後に比較する参考コード
Source/TowerDefense/Battle.cppcpp
void Battle::Reset()
{
    units_.clear();
    cooldowns_.assign(data_.roster.size(), 0);
    timeSec_ = 0;
    resource_ = tuning::InitialResource;
    allyHp_ = tuning::BaseHp;
    enemyHp_ = tuning::BaseHp;
    nextEvent_ = 0;
    result_ = Result::Playing;
    currentWave_.clear();
    notice_.clear();
    SpawnUnit(data_.FindUnit("scout"), Team::Enemy); // 索敵と戦闘を確認する1体
}
チェックリスト

今回の変更箇所を指し示し、観察した結果とその理由を説明できますか。実験後の値とファイルを確認して次へ進みます。

ゲームプログラミング実践