ゲームエンジンを作る
tic-tac-toe のルールを Claude に書いてもらう
⏱ 想定 ~7 分
01 · 読む
ゲームエンジンはアプリの頭脳です。 WebSocket も HTML もプレイヤーも知りません。知っているのは tic-tac-toe のルールだけ:3x3 の盤、 2 種類の記号、手番、勝利条件。
このロジックを専用ファイルに分けて、 server コードとは別に置く —— これを 関心の分離(separation of concerns)と呼びます。ゲームエンジンは独立したモジュールで、どんな server からも、どんなテストフレームワークからも、どんな UI からも使えます。
💡 想像してみてくださいバスケットボールの試合の審判を思い浮かべてください。審判はコート運営もチケット販売もスコアボードの操作もしません。やるのはルールの適用だけ。あなたのゲームエンジンは審判です —— その手が有効か、誰が勝ったかだけを気にします。
ポイントまとめ
- 関心の分離:ゲームロジックは専用ファイルに置く
- ゲームエンジンは WebSocket や HTML を知らない
- 担当するのは:盤面の状態、手の検証、手番の追跡、勝敗判定
- テストしやすく、使い回しもしやすくなる
02 · プロンプトテンプレート
Claude にゲームエンジンモジュールを作ってもらいます。 class が何をすべきか具体的に伝えると、「tic-tac-toe ゲームを作って」と頼むよりはるかに良い結果になります。
game.js モジュールを作ってください。中に TicTacToeGame class を含めます。要件:(1)board を長さ 9 で全部 null の配列として初期化する。(2)現在の手番を追跡する —— X が常に先手。(3)makeMove(cellIndex) メソッドを用意する。手の有効性を検証し(マスは 0 〜 8 の範囲、マスは空、手番のプレイヤーであること)、対応する記号を置き、勝敗または引き分けを判定し、{ valid, symbol, winner, isDraw, board } というオブジェクトを返す。(4)getState() メソッドで現在の board と手番を返す。(5)8 通りの勝利ライン(横 3、縦 3、対角 2)すべてをチェックする。(6)module.exports でこの class を export する。03 · コード例
Claude がゲームエンジンを出してくれたら、勝利判定のロジックを探してみてください。これはただ受け入れるのではなく、理解しておきたい部分です。
勝利判定:8 本の勝利ライン
const WINNING_LINES = [
[0, 1, 2], [3, 4, 5], [6, 7, 8], // rows
[0, 3, 6], [1, 4, 7], [2, 5, 8], // columns
[0, 4, 8], [2, 4, 6] // diagonals
];
// Board layout:
// 0 | 1 | 2
// ---+---+---
// 3 | 4 | 5
// ---+---+---
// 6 | 7 | 8
盤面は 9 マスのフラットな配列です。 Index 0 〜 2 が上段、 3 〜 5 が中段、 6 〜 8 が下段。プレイヤーが 8 通りの勝利ラインのいずれかで 3 マスを揃えれば勝ち。各手の後、エンジンは 8 ライン全部をチェック —— あるラインが同じ記号で 3 つ揃っていて null でなければ、そのプレイヤーの勝利です。 9 マスすべて埋まっていて勝者がいなければ引き分け。
04 · 実機演習
Node.js の REPL でゲームエンジンを直接テストしてみましょう。プロのエンジニアは、他のものをつなぐ前にこうやってコードを検証します。
05 · チェックリスト
ゲームエンジンがこれらのエッジケースを処理できるか確認しましょう。 Node REPL でひとつずつ試すか、 Claude に簡単なテストを書いてもらってください。
- X が常に先手 —— 最初の手は必ず X
- 埋まっているマスに手を置こうとすると valid: false が返る
- 手番でないのに指そうとすると valid: false が返る
- 勝敗が決まった後はそれ以上の手を受け付けない
- 盤が埋まって勝者がいなければ、引き分けと正しく報告される
06 · クイズ
ゲームエンジンを server と分けたモジュールとして作ることに、なぜ価値があるのでしょうか?
- 独立してテストでき、他のプロジェクトでも使え、 server コードを簡潔に保てる
- JavaScript ではすべての class を別ファイルに置くことが必須だから
- コードを理解しにくくする代わりに、実行が速くなるから
- Socket.io は Express と同じファイルのコードにアクセスできないから
⚠ 全機能のインタラクティブ体験には JavaScript が必要です。JavaScript を有効にして再読み込みしてください。
※ このサイトは独立した教育プロジェクトで、Anthropic の公式製品ではありません。Claude™ は Anthropic, PBC の商標です。