Amazon Q CLIで東南アジアの伝統的なボードゲーム「マンカラ」を作りました
はじめに
先日、AWSが発表した Tシャツキャンペーン に参加するため、Amazon Q CLIを使って東南アジアの伝統的なボードゲーム「マンカラ」を開発しました。本記事では、Amazon Q CLIを使ってゲーム開発をしたプロセスについて共有します。
Amazon Q CLIとは
Amazon Q CLI(以下 Q CLI)は、AWSが提供する生成AI Amazon Q
をコマンドライン環境から利用できるインタフェースです。自然言語で対話することで、複雑なプログラミングタスクを自動化したり、コードの生成・修正を行うことができます。従来のプログラミングでは多くの時間がかかっていた作業を、対話的に効率よく進めることができるのが大きなメリットです。
マンカラとは
マンカラは、アフリカや東南アジアを起源とする古代のボードゲームファミリーの総称です。特に東南アジアでは「コンカク」(タイ)、「ダコン」(インドネシア)、「スンカ」(フィリピン)など様々な名前で親しまれています。
ゲームの基本的なルール:
- 2人のプレイヤーが交互に手番を行う
- ボードには各プレイヤーの側に6つのピット(小さな穴)があり、両端に各プレイヤーのストア(大きな穴)がある
- 各ピットには初期状態で4個の石が配置される
- プレイヤーは自分の側のピットから石を取り、時計回りに1つずつ配っていく
- 最後の石が自分のストアに入るとフリーターン(もう一度手番)
- 最後の石が自分側の空のピットに入ると、対面の相手のピットの石をすべて獲得(キャプチャー)
- いずれかのプレイヤーの側のすべてのピットが空になるとゲーム終了
- ストアに最も多くの石を集めたプレイヤーが勝利
ゲームの面白さ:
- シンプルなルールながら深い戦略性がある
- 数学的思考力が自然と養われる
- フリーターンやキャプチャーによる連鎖的な展開が楽しめる
- 初心者は直感的に、熟練者は複雑な計算と戦略で楽しめる奥深さ
ルールの詳細については、以下の日本レクリエーション協会様のページが参考になります。
なぜマンカラを作ろうと思ったのか
近所の公民館にマンカラが置いてあり、妻と一緒に遊んでみたところ、ルールがシンプルながら戦略性もあり非常に面白いゲームでした。石の配分を考えながら相手の手を読み、フリーターンやキャプチャーを狙っていくことで効率的に石を取ることができます。
プレイしてみるまでは「面白いの?」と疑問でしたが、実際にやってみると私も妻もハマってしまいました。そんなマンカラの魅力を再現してみたくなり、今回の題材に選びました。
完成したもの
最終的に以下の機能を持つマンカラゲームが完成しました:
- 対戦モード: 人対人、人対AI対戦に対応
- AI難易度: 3段階(かんたん、ふつう、むずかしい)の難易度設定
- カスタマイズ: 初期石数の変更(1〜6個)
- ユーザーインターフェース: 直感的なマウス操作とアニメーション
- ゲーム機能: フリーターン、キャプチャーなどの特殊ルール完全対応
ソースコードは以下の GitHub に公開しています。
完成までのプロセス
作成開始から完成までの期間は1週間でした。1日あたり1時間作業しましたので、全部で7時間前後の作業時間になりました。完成までのプロセスを振り返ってみたいと思います。
0. 開発・実行環境
開発・実行環境は以下のとおりです。
環境 | バージョン等 |
---|---|
OS | macOS Sonoma 14.7.6 |
Python | 3.13.2 |
Amazon Q CLI | 1.10.0 |
1. 要件定義
最初に要件定義書(requirements.md
)の作成からスタートしました。Q CLIを使って、マンカラゲームの詳細なルール、機能要件、AI難易度の設定などをまとめるように指示しました。この段階で以下の機能が計画されました:
- 基本的なゲームシステム
- 3段階のAI難易度(EASY、NORMAL、HARD)
- カスタマイズ機能(石数、ボードデザイン)
- 学習支援機能(チュートリアル、ヒント)
- サウンド機能
- 多言語対応(英語・日本語)
- オンライン対戦機能(将来的な拡張)
完成した要件定義書
マンカラゲーム要件定義書
マンカラとは
マンカラ:東南アジアのボードゲーム
マンカラは、アフリカや東南アジアを起源とする古代のボードゲームファミリーの総称です。特に東南アジアでは「コンカク」(タイ)、「ダコン」(インドネシア)、「スンカ」(フィリピン)など様々な名前で親しまれています。基本的には、木製の板に掘られた穴(ピット)に石や種などの駒を配置し、それらを特定のルールに従って移動させるゲームです。
マンカラは「種まきゲーム」とも呼ばれ、農耕文化と深い関わりがあります。種をまき、収穫するという農業のサイクルを模したゲームとして、何世紀にもわたって伝えられてきました。
ゲームの目的、勝利条件
目的: 相手よりも多くの石(種)を自分のストア(マンカラ)に集めること。
勝利条件:
- ゲーム終了時に最も多くの石をストアに集めたプレイヤーが勝者となります。
- ゲームは以下のいずれかの条件で終了します:
- 一方のプレイヤーの側のすべてのピットが空になった時
- 両方のプレイヤーがこれ以上石を動かせなくなった時
ゲーム全体の流れ
-
ゲーム準備:
- 2人のプレイヤーが向かい合って座ります。
- ボードには6つのピット(小さな穴)が各プレイヤーの側に並び、両端に各プレイヤーのストア(大きな穴)があります。
- 各ピットに同数の石(通常4個)を配置します。ストアは最初は空です。
-
ゲーム進行:
- プレイヤーは交互に手番を行います。
- 手番では、自分側のピットから1つを選び、そこにある全ての石を取り出します。
- 取り出した石を、選んだピットの右隣から時計回りに、1つずつピットに配っていきます。
- 自分のストアを通過する際には石を1つ入れますが、相手のストアは飛ばします。
-
特殊ルール:
- 最後の石がストアに入った場合: もう一度手番を行えます(フリーターン)。
- 最後の石が自分側の空のピットに入った場合: その石と、対面にある相手のピットの石をすべて自分のストアに獲得できます(キャプチャー)。
-
ゲーム終了:
- いずれかのプレイヤーの側のすべてのピットが空になると、ゲームは終了します。
- 残っている石はすべて、それらがある側のプレイヤーのストアに移動します。
- ストアに最も多くの石を集めたプレイヤーが勝者です。
ゲームにおいてやっていいこと、やってはいけないこと
やっていいこと:
- 戦略的に石を動かし、自分のストアに多くの石を集める計画を立てる
- フリーターンを狙って連続して手番を得る
- キャプチャーを狙って相手の石を獲得する
- 相手の動きを予測し、それに対応した手を打つ
- 終盤では、ゲーム終了のタイミングを自分に有利になるよう調整する
やってはいけないこと:
- 自分の手番で石を動かさないこと(パスは認められていない)
- 空のピットから石を取ること
- 相手のピットから石を取ること
- 石を配る際に、相手のストアに石を入れること
- ルールで定められた以外の方法で石を移動させること
- ゲーム中に石の数を変えること
このゲームの類似のゲームにはない面白さとは
マンカラの独自の魅力は以下の点にあります:
-
シンプルながら深い戦略性: ルールは非常にシンプルですが、先読みと計算が重要で、チェスやオセロのような深い戦略性があります。
-
数学的思考の育成: 石の分配と計算を通じて、数学的思考力や計算能力が自然と養われます。
-
文化的・歴史的価値: 何千年もの歴史を持つ世界最古のボードゲームの一つであり、様々な文化の交流を体験できます。
-
連鎖的な手の展開: フリーターンによる連続した手番が可能で、一度の手番で大きく局面を変えることができます。
-
直感と計算のバランス: 初心者は直感的に楽しめる一方、熟練者は複雑な計算と戦略を駆使できる奥深さがあります。
-
資源管理の要素: 限られた石をいかに効率よく管理し、最大の収穫を得るかという資源管理ゲームの要素も含んでいます。
機能要件
-
ゲームシステム
- 2人プレイヤー対応(人対人、人対AI)
- 標準的なマンカラボード(6ピット×2列、2ストア)の表示
- 各ピットの石の数を視覚的に表示
- ターン制の実装とターン表示
- 特殊ルール(フリーターン、キャプチャー)の実装
- ゲーム終了判定と勝敗判定
-
ユーザーインターフェース
- 直感的な操作性(ピットをクリック/タップして石を選択)
- ゲーム状態の明確な表示(現在のプレイヤー、石の動き)
- アニメーションによる石の移動表現
- スコア表示(各プレイヤーのストアの石の数)
- ゲーム進行状況の表示
-
AI対戦機能
- 複数難易度のAI(EASY, NORMAL, HARD)
- EASY: 短期的な報酬を最大化するAI。自分のストアに入る石の数のみを報酬とし、1手先までしか読まない。キャプチャーやフリーターンの価値を低く評価する。
- NORMAL: 中期的な報酬を最大化するAI。自分のストアの石と相手のストアの石の差を報酬とし、2〜3手先まで読む。キャプチャーとフリーターンを適切に評価する。
- HARD: 長期的な報酬を最大化するAI。ゲーム終了時の勝敗と石の差を報酬とし、4手以上先まで読む。ボード全体の石の分布、自分側のピットの空き状況、相手の選択肢の制限なども考慮した高度な評価関数を使用する。
- AIの思考時間設定
- AIの戦略パターンの多様化
- 複数難易度のAI(EASY, NORMAL, HARD)
-
カスタマイズ機能
- 初期配置の石の数の変更(2〜6個)
- ボードデザインのカスタマイズ(東南アジアの異なる地域のスタイル)
- 石のデザイン変更(種、宝石、貝殻など)
-
学習支援機能
- チュートリアルモード
- ヒント機能
- 手の推奨表示
- ルール説明へのアクセス
-
サウンド機能
- 石の移動時の効果音(囲碁や将棋のコマを打つような「パチッ」とした音)
- ストアに石が入るときの特別な効果音
- キャプチャー発生時の効果音
- ゲーム開始・終了時のサウンド
- BGM(オン/オフ切り替え可能)
- 音量調整機能
-
その他の機能
- ゲーム履歴の保存と再生
- オンライン対戦機能(将来的な拡張として)
- 統計情報(勝率、平均スコアなど)
- 実績システム(特定の条件を達成するとバッジ獲得)
- 多言語対応(英語と日本語)
2. 基本実装
次にQ CLIに要件定義書をもとにしてゲームのコア機能を開発するよう指示しました。この段階で以下が完成しました。
- ゲーム盤面の表示
- 基本的な石の移動ロジック
- プレイヤーターンの管理
- AIプレイヤーの基本実装
- フリーターンとキャプチャーの特殊ルール
3. 機能追加と改良
出来上がったアプリを実際にプレイしてみて、最低限欲しいと思った以下の機能や演出についてQ CLIに実装を指示しました。
- フリーターンやキャプチャーなどの特殊状況の通知表示機能
- AIのターン処理の修正
- ゲーム開始時の先手・後手ランダム選択演出
4. バグ修正
ここからバグ修正に移行しました。実際にプレイしてみて、石の移動ロジックに問題が発見されたため、Q CLIに修正を指示しました。
- 石の配置位置の差異
- ターン切り替えのタイミング問題
- クリック処理の重複
そのままではQがゲームのプレイ状況を把握できないため、詳細なデバッグログを追加するようQに指示し、出力されたログをもとにバグの分析をしてもらいました。
5. UI改善
あらかたバグが修正できたので、より遊びやすくなるようUIを改善しました。
- ゲーム終了時のボタン機能追加
- メニューに戻る機能の実装
- 石の移動アニメーションの改善(上向きの弧を描く移動)
- キャプチャー発生時の通知表示
- プレイヤーとコンピューターの陣地の視覚的区別
この中で、石の移動アニメーションの改善が特に難しかったです。Qに対してどう指示を出せば適切に修正してもらえるか、試行錯誤が続きました。
最初は「ユーザーが石を持ち上げて一つずつ置いていく感じを表現して」など曖昧な指示を出しましたがうまくいきませんでした。
最終的には1ステップごとに順を追ってどのような石の配置にしてほしいか、細かく記載して指示することで対応しました。
視覚的な要件をAIに効率的に伝える方法ってあるのかなー。
開発しきれなかった積み残しの機能
開発の最終段階で、Q CLIの月間利用上限に達してしまいました。そのため、当初要件定義書に記載していた以下の機能は実装を断念することになりました。
- 英語対応: 多言語化機能
- チュートリアル機能: 初心者向けの学習支援
- ヒント機能: 手の推奨表示
- ゲーム履歴: 過去のゲームの保存・再生
- 統計情報: 勝率や平均スコアの表示
- 実績システム: バッジ獲得機能
アニメーションの修正がなかなかうまくいかず、試行錯誤を繰り返しているうちに利用量を消費してしまったようです。正直すごく消化不良なので、課金して続きをやりたい気分です。
おわりに
Q CLIを実際に体験してみて素晴らしいツールだと感じました。ゲーム開発など全然やったことがない私でも、自然言語で指示を出すだけですぐにアイデアを形にできました。このスピード感は気持ちがいいですね。
今回使用したPythonのゲームライブラリ pygame
は私自身まったく触ったことがありませんでしたが、こうしてゲームアプリを開発することができました。もちろん、より踏み込んだ開発をしていくには、Q CLIに指示を出す側もライブラリができること、できないことを把握しておく必要はあるのかなと思いますが。
いずれにせよ、アイデアからプロトタイプを作るスピード感は魅力ですね。いままで提案書を作るので精一杯だったあれもこれも、今度は動くものをつけてもう一回トライしてみようかな。
Discussion