# ゲームのモックアップ: デザインパターンの適用 ## 課題概要 デザインパターンの知識を活かして、シンプルなゲームプロトタイプを作成しましょう!この課題では、アーキテクチャパターン(継承またはコンポジション)と、レッスンで学んだpub/sub通信システムを練習することが目的です。 ## 指示 このレッスンで学んだデザインパターンを示すシンプルなゲームを作成してください。ゲームは機能的であれば十分で、複雑なグラフィックは必要ありません。基盤となるアーキテクチャと通信パターンに焦点を当ててください。 ### 要件 **アーキテクチャパターンを選択する:** - **オプションA**: クラスベースの継承を使用する(例: `GameObject` → `Movable` → `Hero`) - **オプションB**: コンポジションを使用する(例: 工場関数アプローチで混合動作を使用) **通信を実装する:** - **`EventEmitter`クラス**を含め、pub/subメッセージングを実現する - **少なくとも2~3種類のメッセージタイプ**を設定する(例: `PLAYER_MOVE`, `ENEMY_SPAWN`, `SCORE_UPDATE`) - **ユーザー入力**(キーボード/マウス)をイベントシステムを通じてゲームイベントに接続する **ゲーム要素を含める:** - プレイヤーが操作するキャラクターを少なくとも1つ含める - 他のゲームオブジェクト(敵、収集アイテム、環境要素など)を少なくとも1つ含める - オブジェクト間の基本的な相互作用(衝突、収集、通信など)を実装する ### ゲームアイデアの提案 **検討すべきシンプルなゲーム:** - **スネークゲーム** \u2013 ヘッドを追従するセグメント、ランダムにスポーンする食べ物 - **ポンのバリエーション** \u2013 入力に応じて動くパドル、壁で跳ね返るボール - **収集ゲーム** \u2013 プレイヤーがアイテムを収集しながら障害物を避ける - **タワーディフェンスの基本** \u2013 タワーが移動する敵を検知して攻撃する ### コード構造のガイドライン ```javascript // Example starting structure const Messages = { // Define your game messages here }; class EventEmitter { // Your event system implementation } // Choose either class-based OR composition approach // Class-based example: class GameObject { /* base properties */ } class Player extends GameObject { /* player-specific behavior */ } // OR Composition example: const gameObject = { /* base properties */ }; const movable = { /* movement behavior */ }; function createPlayer() { /* combine behaviors */ } ``` ### 実装のテスト **コードが動作することを確認する方法:** - **テスト**: イベントがトリガーされたときにオブジェクトが移動または変化するか - **確認**: 複数のオブジェクトが同じイベントに応答できるか - **チェック**: 既存のコードを変更せずに新しい動作を追加できるか - **確認**: キーボード/マウス入力が適切にゲームイベントをトリガーするか ## 提出ガイドライン **提出物に含めるべきもの:** 1. **JavaScriptファイル**: ゲームの実装 2. **HTMLファイル**: ゲームを実行・テストするためのもの(シンプルで構いません) 3. **コメント**: 選択したパターンとその理由の説明 4. **簡単なドキュメント**: メッセージタイプとその機能の説明 ## 採点基準 | 基準 | 優秀 (3点) | 適切 (2点) | 改善が必要 (1点) | |----------|---------------------|---------------------|------------------------------| | **アーキテクチャパターン** | 継承またはコンポジションを正しく実装し、明確なクラス/オブジェクト階層を持つ | 選択したパターンを使用しているが、軽微な問題や一貫性の欠如がある | パターンを使用しようとしているが、実装に重大な問題がある | | **Pub/Subの実装** | EventEmitterが複数のメッセージタイプと適切なイベントフローで正しく動作する | 基本的なpub/subシステムが動作し、いくつかのイベント処理がある | イベントシステムは存在するが、信頼性に欠ける | | **ゲームの機能性** | 3つ以上のインタラクティブな要素がイベントを通じて通信する | 2つのインタラクティブな要素が基本的なイベント通信を行う | 1つの要素がイベントに応答するか、基本的な相互作用がある | | **コードの品質** | クリーンでコメントが充実し、論理的に整理されたモダンなJavaScript | 一般的に整理されたコードで、コメントが適度にある | コードは動作するが、整理や明確なコメントが不足している | **ボーナスポイント:** - **創造的なゲームメカニクス**: パターンの興味深い使用例を示す - **複数の入力方法**: キーボードとマウスイベントの両方を使用 - **拡張可能なアーキテクチャ**: 新しい機能を簡単に追加できる構造 --- **免責事項**: この文書はAI翻訳サービス[Co-op Translator](https://github.com/Azure/co-op-translator)を使用して翻訳されています。正確性を追求していますが、自動翻訳には誤りや不正確さが含まれる可能性があります。元の言語で記載された文書が正式な情報源とみなされるべきです。重要な情報については、専門の人間による翻訳を推奨します。この翻訳の使用に起因する誤解や誤解について、当社は責任を負いません。