# C++の授業

## C++講義計画（C言語からの移行・ゲームオブジェクト構築まで）

### 🎯 目標

<span style="white-space: pre-wrap;">C言語を半年学んだ学生が、C++の基礎文法からオブジェクト指向（継承・ポリモーフィズム）を学び、最終的に </span>`<span class="editor-theme-code">GameObject</span>`<span style="white-space: pre-wrap;"> クラスを継承してプレイヤーや敵を実装できるようにする。</span>

---

## 🧭 全体構成（全15回想定）

<table id="bkmrk-%E5%9B%9E%E3%83%86%E3%83%BC%E3%83%9E%E6%8A%80%E8%A1%93%E7%9B%AE%E6%A8%99%E6%BC%94%E7%BF%92%E4%BE%8B1c%2B%2B%E5%B0%8E%E5%85%A5%E3%83%BBc%E3%81%A8"><colgroup><col></col><col></col><col></col><col></col></colgroup><tbody><tr><th>回</th><th>テーマ</th><th>技術目標</th><th>演習例</th></tr><tr><td>****1****

</td><td>C++導入・Cとの違い

</td><td>`<span class="editor-theme-code">iostream</span>`<span style="white-space: pre-wrap;"> / 名前空間 / </span>`<span class="editor-theme-code">new</span>`<span style="white-space: pre-wrap;"> / </span>`<span class="editor-theme-code">delete</span>`

</td><td>Cのprintf版→C++出力へ書き換え

</td></tr><tr><td>****2****

</td><td>関数と参照・オーバーロード

</td><td>参照渡し・デフォルト引数・関数多重定義

</td><td>距離計算関数のオーバーロード

</td></tr><tr><td>****3****

</td><td>クラス・コンストラクタ入門

</td><td>`<span class="editor-theme-code">class</span>`<span style="white-space: pre-wrap;"> / </span>`<span class="editor-theme-code">public</span>`<span style="white-space: pre-wrap;"> / </span>`<span class="editor-theme-code">private</span>`<span style="white-space: pre-wrap;"> / </span>`<span class="editor-theme-code">this</span>`

</td><td>Vector2構造体→Vector2クラス化

</td></tr><tr><td>****4****

</td><td>クラスの設計とヘッダ分離

</td><td>`<span class="editor-theme-code">.h</span>`<span style="white-space: pre-wrap;"> / </span>`<span class="editor-theme-code">.cpp</span>`<span style="white-space: pre-wrap;"> 分離と include 管理</span>

</td><td>Vector2, Rect クラス実装

</td></tr><tr><td>****5****

</td><td>動的メモリとコンテナ基礎

</td><td>`<span class="editor-theme-code">new/delete</span>`<span style="white-space: pre-wrap;">, </span>`<span class="editor-theme-code">std::vector</span>`

</td><td>`<span class="editor-theme-code">std::vector</span>`で敵リストを作る

</td></tr><tr><td>****6****

</td><td>コンストラクタ／デストラクタ／コピー

</td><td>RAIIの考え方

</td><td>ファイル読み込み管理クラス

</td></tr><tr><td>****7****

</td><td>継承入門

</td><td>`<span class="editor-theme-code">Base</span>`<span style="white-space: pre-wrap;"> / </span>`<span class="editor-theme-code">Derived</span>`<span style="white-space: pre-wrap;"> クラス / </span>`<span class="editor-theme-code">protected</span>`

</td><td>`<span class="editor-theme-code">Enemy</span>`<span style="white-space: pre-wrap;"> ← </span>`<span class="editor-theme-code">Slime</span>`<span style="white-space: pre-wrap;">, </span>`<span class="editor-theme-code">Bat</span>`<span style="white-space: pre-wrap;"> など作る</span>

</td></tr><tr><td>****8****

</td><td>仮想関数とポリモーフィズム

</td><td>`<span class="editor-theme-code">virtual</span>`<span style="white-space: pre-wrap;">, </span>`<span class="editor-theme-code">override</span>`<span style="white-space: pre-wrap;">, </span>`<span class="editor-theme-code">GameObject*</span>`管理

</td><td>`<span class="editor-theme-code">GameObject</span>`<span style="white-space: pre-wrap;"> 基底で Draw/Updateを仮想化</span>

</td></tr><tr><td>****9****

</td><td>純粋仮想関数・抽象クラス

</td><td>`<span class="editor-theme-code">=0</span>`<span style="white-space: pre-wrap;"> の概念、基底クラス設計</span>

</td><td>`<span class="editor-theme-code">GameObject</span>`<span style="white-space: pre-wrap;"> を抽象化して管理リストに追加</span>

</td></tr><tr><td>****10****

</td><td>スマートポインタ・メモリ安全化

</td><td>`<span class="editor-theme-code">std::unique_ptr</span>`<span style="white-space: pre-wrap;">, </span>`<span class="editor-theme-code">std::shared_ptr</span>`

</td><td>`<span class="editor-theme-code">std::vector<unique_ptr<GameObject>></span>`

</td></tr><tr><td>****11****

</td><td>継承＋多態性の活用

</td><td>`<span class="editor-theme-code">virtual</span>`<span style="white-space: pre-wrap;">呼び出しと </span>`<span class="editor-theme-code">override</span>`確認

</td><td>`<span class="editor-theme-code">Enemy</span>`<span style="white-space: pre-wrap;"> / </span>`<span class="editor-theme-code">Player</span>`<span style="white-space: pre-wrap;"> / </span>`<span class="editor-theme-code">Item</span>`<span style="white-space: pre-wrap;"> を一括更新</span>

</td></tr><tr><td>****12****

</td><td>クラス間関係・静的メンバ

</td><td>`<span class="editor-theme-code">static</span>`<span style="white-space: pre-wrap;">, </span>`<span class="editor-theme-code">const</span>`, クラス内定数

</td><td>`<span class="editor-theme-code">ObjectManager</span>`<span style="white-space: pre-wrap;"> 実装</span>

</td></tr><tr><td>****13****

</td><td>名前空間・クラス分割整理

</td><td>`<span class="editor-theme-code">namespace</span>`, include guard

</td><td>`<span class="editor-theme-code">game/</span>`<span style="white-space: pre-wrap;">, </span>`<span class="editor-theme-code">engine/</span>`<span style="white-space: pre-wrap;"> に分離</span>

</td></tr><tr><td>****14****

</td><td>総合演習：ミニゲーム制作

</td><td>ゲームループ構築

</td><td>コンソール or DxLibで動作確認

</td></tr><tr><td>****15****

</td><td>発表・振り返り

</td><td>設計比較・自己評価

</td><td>ソース＋UML提出・口頭説明

</td></tr></tbody></table>

---

## 🧩 ステップ詳細

### STEP 1〜4：C++基礎をCとの違いで理解

- Cの書き方との比較で、スムーズに導入。
- printf→`<span class="editor-theme-code">std::cout</span>`、struct→class、malloc→new など差分理解。

### STEP 5〜6：クラスとメモリ管理

- C構造体＋関数をクラスに統合。
- `<span class="editor-theme-code">vector</span>`<span style="white-space: pre-wrap;"> と RAII の基本を体験。</span>

### STEP 7〜9：継承とポリモーフィズム

- `<span class="editor-theme-code">GameObject</span>`<span style="white-space: pre-wrap;"> に </span>`<span class="editor-theme-code">virtual void Update()</span>`<span style="white-space: pre-wrap;"> を持たせて多態の体験。</span>
- `<span class="editor-theme-code">Player</span>`<span style="white-space: pre-wrap;">, </span>`<span class="editor-theme-code">Enemy</span>`<span style="white-space: pre-wrap;">, </span>`<span class="editor-theme-code">Item</span>`<span style="white-space: pre-wrap;"> の派生クラスを一括更新。</span>

for (auto obj : objects) obj-&gt;Update();

### STEP 10〜11：メモリ安全化

- `<span class="editor-theme-code">unique_ptr</span>`導入でC言語的delete漏れを防止。
- `<span class="editor-theme-code">ObjectManager</span>`<span style="white-space: pre-wrap;"> による一元管理へ。</span>

### STEP 12〜15：まとめとゲーム制作

- 名前空間整理とクラス分離で設計の見通しをよくする。
- 最終的にプレイヤー・敵・アイテムなどを`<span class="editor-theme-code">GameObject</span>`継承で統合。

---

## 🎮 最終課題例

<table id="bkmrk-%E3%82%BF%E3%82%A4%E3%83%97%E5%86%85%E5%AE%B9%E3%82%B3%E3%83%B3%E3%82%BD%E3%83%BC%E3%83%ABrpgcharact"><colgroup><col></col><col></col></colgroup><tbody><tr><td>タイプ

</td><td>内容

</td></tr><tr><td>****コンソールRPG****

</td><td>`<span class="editor-theme-code">Character</span>`<span style="white-space: pre-wrap;"> 継承で </span>`<span class="editor-theme-code">Player</span>`<span style="white-space: pre-wrap;"> / </span>`<span class="editor-theme-code">Enemy</span>`<span style="white-space: pre-wrap;"> を共通管理</span>

</td></tr><tr><td>****2Dアクション (DxLib)****

</td><td>`<span class="editor-theme-code">GameObject</span>`<span style="white-space: pre-wrap;">継承で </span>`<span class="editor-theme-code">Ball</span>`<span style="white-space: pre-wrap;"> / </span>`<span class="editor-theme-code">Block</span>`<span style="white-space: pre-wrap;"> / </span>`<span class="editor-theme-code">Paddle</span>`<span style="white-space: pre-wrap;"> 管理</span>

</td></tr><tr><td>****スネーク風ゲーム****

</td><td>`<span class="editor-theme-code">GameObject</span>`<span style="white-space: pre-wrap;">多態性で </span>`<span class="editor-theme-code">SnakeHead</span>`<span style="white-space: pre-wrap;"> / </span>`<span class="editor-theme-code">Fruit</span>`<span style="white-space: pre-wrap;"> 管理</span>

</td></tr></tbody></table>

---

## 📘 授業設計のポイント

- 毎回「CからC++へどう変わるか」を比較して示す。
- すぐ動かせるコード例を提示。
- 最終回で「OOPでコードがどう整理されたか」を可視化する。

---

### 💡 まとめ

> 15回で「C構文→クラス→継承→仮想関数→安全なゲーム構造」まで自然に到達できる構成。 最終的には、ポリモーフィズムを使って`<span class="editor-theme-code">GameObject</span>`を扱う“C++らしいゲーム設計”を完成させる。