総合演習¶
各カテゴリの演習(下のリンク一覧)を終えた人向けの、分野横断の総合問題です。解答は answers.md にあります。
カテゴリ別演習へのリンク¶
| カテゴリ | 演習 |
|---|---|
| 第1部 設計の基礎 | exercises |
| 第2部 SOLID | exercises |
| 第3部 GoFパターン | exercises |
| 第4部 ゲームパターン | exercises |
| 第5部 C++言語 | exercises |
| 第6部 C++内部 | exercises |
| 第7部 メモリと実行時 | exercises |
| 第8部 ビルド | exercises |
| 第9部 Unity/C# | exercises |
| 第10部 UE | exercises |
| 第11部 ケーススタディ | exercises |
| 第12部 判断ガイド | exercises |
総合問題(全分野横断)¶
総合1. 設計レビュー(読解+診断)¶
あるプロジェクトのコードレビューで、次のクラスに出会いました。
// C++20
class GameManager {
public:
static GameManager* instance;
std::vector<Enemy*> enemies; // newした敵を格納
void Update(float dt) {
for (auto* e : enemies) {
e->hp -= poisonActive ? 1 : 0;
if (e->hp <= 0) { enemies.erase(std::find(enemies.begin(), enemies.end(), e));
scoreLabel->SetText(std::to_string(++score)); }
}
if (Input::GetKey(Key::S)) SaveToFile();
}
void SaveToFile(); // 構造体をfwriteで直書き
bool poisonActive = false;
int score = 0;
TextLabel* scoreLabel;
};
問: 問題点を「設計(責務・依存)」「C++の正しさ(所有権・イテレータ・UB)」「保守(セーブ互換)」の3観点で列挙し、優先度順の改善計画(3ステップ)を書いてください。
総合2. 仕組みの説明(C++内部)¶
「std::vector<std::unique_ptr<Enemy>> enemies; に push_back(std::make_unique<Boss>()) する」— この1行について、次を説明してください。
- コンパイル時に何が起きるか(テンプレートの実体化はどの型に対して起きるか)
- 実行時のメモリはどこに何が置かれるか(スタック/ヒープ、vectorの中身は何か)
enemies.clear()で何がどの順で起きるか(unique_ptr・仮想デストラクタとの関係)
総合3. パターン選定(設計判断)¶
「ローグライトの装備品: 拾う・装備する・パッシブ効果(攻撃+X%等)が重複して乗る・種類は運用で毎週追加」という要件に対し、使う道具を第3部・第4部から3つ以内選び、それぞれ「何の問題に対して」使うのかを明記して全体構成図を書いてください。「使わないことにした候補」も1つ挙げ、理由を書いてください。
総合4. クロスエンジン設計(Unity→UE)¶
Unityで実装済みの「敵死亡→イベント発行→実績/クエスト/UIが購読」システム(C# event+ScriptableObjectチャネル)をUEに移植します。対応する仕組みの選定(Delegate種別、Subsystem等)と、移植で設計変更が必要になる点(GC・リフレクション・例外方針の違いから来るもの)を2つ挙げてください。
総合5. バグ調査総合(症状→原因→ツール)¶
リリースビルドのみで発生する次の症状の調査計画を立ててください:「長時間プレイ後、特定の敵を倒した瞬間に、まれに無関係なUIのテキストが化けてクラッシュする」。
- 疑うべきバグの種類(候補2つ以上、優先度つき)
- それぞれの検証手段(ツール・ビルド設定)
- 恒久対策の方向性
総合6. ミニプロジェクト(実装)¶
samples/ の部品を組み合わせて「ウェーブサバイバル」の骨格を完成させてください(第11部演習 問7と共通)。追加要件:
- 固定タイムステップ(samples/game_loop.cpp)
- 敵はFSM(samples/fsm_guard.cpp)+Type Object(samples/type_object.cpp)
- 弾はObject Pool(samples/object_pool.cpp)
- 通知は3分類(直呼び/バス/キュー)(samples/event_bus.cpp、samples/event_queue.cpp)
- 全体をRule of Zero・所有の木・const correctnessでレビューして提出