4
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Kiroを使って仕様駆動開発をしてみる

Last updated at Posted at 2025-12-22

Kiroとは?

AWSが発表したAI IDEです。画面はVSCodeっぽく、Cursorと似ています。
「Spec」というモードで仕様駆動開発が可能です。
チャットでやりたいことを伝えると、要件定義、設計、タスク作成(実行)までAIがやってくれます。
開発者がやるのは、主にドキュメントのチェックと指示出しです。

詳しくは公式ブログ

なにを作るか決める

「溜め、バリア、かめはめ波で戦うゲーム」を作ります。
小学生の時に流行ったじゃんけんに似たゲームです。
今回は触ってみるという温度感であり、軽めでゲームのルールを明確にしやすいので、これに決めました。

Kiroをインストール

  1. 公式サイトからインストーラーをダウンロード

  2. インストールが完了し、Kiro を開くとサインインが求められるので任意のアカウントでサインイン
    スクリーンショット1.png

  3. VScode の拡張機能の入れる
    長かったので途中で「Next」を押してやめました。
    後から見たらちゃんとインストールされていました。
    スクリーンショット2.png

  4. シェル設定をする
    スクリーンショット3.png

    Mac のパスワードを求められ、入力するだけで設定が完了します。
    スクリーンショット4.png

これでKiroのインストールとセットアップは完了です。

Kiroと仕様駆動開発する

  1. 任意のプロジェクトフォルダをKiroで開く
    今回はSpecモードを選択します。
    スクリーンショット5.png

  2. 下のチャット欄から作りたいものを投げる
    とりあえず思いついた内容で投げてみます。
    投げたのはこちら。

    じゃんけんに似た「溜め、バリア、かめはめ波で戦うゲーム」を作りたい。
    ルールは以下の通り。
    - 2名で行う。ユーザーの入力とCPUの出す手で勝敗を決める。
    - 溜め1回につき、1回かめはめ波が打てる。
    - バリアに溜めは必要ないが、2回連続では出せない。連続でなければ何度でも出せる。
    - 溜めに対してかめはめ波を打たれると負け。それ以外はあいこで続行。
    - かめはめ波はバリアで防げる。
    - 溜めの上限は3まで。4回目の溜めで負けになる。
    
    言語はTypeScriptのみを使用する。
    ドキュメントは全て日本語で作成する。
    

    このチャットを投げると、requirements.mdが生成されます。

  3. requirements.mdを確認
    requirements.mdは要件が明記されたドキュメントです。
    Kiroがチャットの内容をいい感じに解釈して書いてくれます。
    スクリーンショット7.png

    作成されたrequirements.md
    # 要件ドキュメント
    
    ## 概要
    
    かめはめ波バトルは、じゃんけんに似た戦略的な対戦ゲームです。プレイヤーは「溜め」「バリア」「かめはめ波」の 3 つの行動から選択し、CPU と対戦します。溜めによってかめはめ波の使用回数を蓄積し、バリアで防御し、かめはめ波で攻撃する戦略的なゲームプレイを提供します。
    
    ## 用語集
    
    - **かめはめ波バトルシステム**: プレイヤーと CPU が対戦するゲームシステム
    - **プレイヤー**: ゲームを操作するユーザー
    - **CPU**: コンピューター制御の対戦相手
    - **溜め**: かめはめ波を使用するためのエネルギーを蓄積する行動
    - **バリア**: 相手の攻撃を防ぐ防御行動
    - **かめはめ波**: 攻撃行動(溜めが必要)
    - **溜めカウンター**: 現在蓄積されている溜めの回数
    - **バリア連続フラグ**: 前回の行動がバリアだったかを示すフラグ
    
    ## 要件
    
    ### 要件 1
    
    **ユーザーストーリー:** プレイヤーとして、CPU と対戦できるかめはめ波バトルゲームをプレイしたいので、戦略的な選択を楽しめるようにしたい
    
    #### 受入基準
    
    1. WHEN ゲームが開始されるとき THEN かめはめ波バトルシステム SHALL プレイヤーと CPU の初期状態を設定する
    2. WHEN プレイヤーが行動を選択するとき THEN かめはめ波バトルシステム SHALL 有効な行動のみを受け付ける
    3. WHEN 両者の行動が決定されるとき THEN かめはめ波バトルシステム SHALL 勝敗判定を実行する
    4. WHEN 勝敗が決定されるとき THEN かめはめ波バトルシステム SHALL ゲーム結果を表示する
    5. WHEN あいこの場合 THEN かめはめ波バトルシステム SHALL ゲームを継続する
    
    ### 要件 2
    
    **ユーザーストーリー:** プレイヤーとして、溜め行動でかめはめ波のエネルギーを蓄積したいので、戦略的に攻撃の準備ができるようにしたい
    
    #### 受入基準
    
    1. WHEN プレイヤーが溜めを選択するとき THEN かめはめ波バトルシステム SHALL 溜めカウンターを 1 増加させる
    2. WHEN 溜めカウンターが 3 に達した状態で溜めを選択するとき THEN かめはめ波バトルシステム SHALL プレイヤーの敗北を宣言する
    3. WHEN 溜め行動に対してかめはめ波が使用されるとき THEN かめはめ波バトルシステム SHALL 溜めを行ったプレイヤーの敗北を宣言する
    4. WHEN 溜め行動に対して溜めまたはバリアが使用されるとき THEN かめはめ波バトルシステム SHALL あいこと判定する
    
    ### 要件 3
    
    **ユーザーストーリー:** プレイヤーとして、バリアで相手の攻撃を防ぎたいので、防御的な戦略を取れるようにしたい
    
    #### 受入基準
    
    1. WHEN プレイヤーがバリアを選択するとき THEN かめはめ波バトルシステム SHALL バリア連続フラグを確認する
    2. WHEN 前回の行動がバリアでバリアを選択するとき THEN かめはめ波バトルシステム SHALL 無効な行動として拒否する
    3. WHEN バリアに対してかめはめ波が使用されるとき THEN かめはめ波バトルシステム SHALL バリアを行ったプレイヤーの勝利を宣言する
    4. WHEN バリアに対して溜めまたはバリアが使用されるとき THEN かめはめ波バトルシステム SHALL あいこと判定する
    
    ### 要件 4
    
    **ユーザーストーリー:** プレイヤーとして、かめはめ波で相手を攻撃したいので、溜めたエネルギーを使って勝利を目指せるようにしたい
    
    #### 受入基準
    
    1. WHEN プレイヤーがかめはめ波を選択するとき THEN かめはめ波バトルシステム SHALL 溜めカウンターが 1 以上であることを確認する
    2. WHEN 溜めカウンターが 0 でかめはめ波を選択するとき THEN かめはめ波バトルシステム SHALL 無効な行動として拒否する
    3. WHEN かめはめ波が使用されるとき THEN かめはめ波バトルシステム SHALL 溜めカウンターを 1 減少させる
    4. WHEN かめはめ波に対して溜めが使用されるとき THEN かめはめ波バトルシステム SHALL かめはめ波を使用したプレイヤーの勝利を宣言する
    5. WHEN かめはめ波に対してバリアが使用されるとき THEN かめはめ波バトルシステム SHALL バリアを使用したプレイヤーの勝利を宣言する
    6. WHEN かめはめ波に対してかめはめ波が使用されるとき THEN かめはめ波バトルシステム SHALL あいこと判定する
    
    ### 要件 5
    
    **ユーザーストーリー:** プレイヤーとして、CPU が適切な戦略で対戦してほしいので、挑戦的で楽しいゲーム体験を得られるようにしたい
    
    #### 受入基準
    
    1. WHEN CPU が行動を選択するとき THEN かめはめ波バトルシステム SHALL 現在の状態に基づいて有効な行動を選択する
    2. WHEN CPU の溜めカウンターが 3 に達するとき THEN かめはめ波バトルシステム SHALL CPU が溜め以外の行動を選択するようにする
    3. WHEN CPU の前回の行動がバリアのとき THEN かめはめ波バトルシステム SHALL CPU がバリア以外の行動を選択するようにする
    4. WHEN CPU の溜めカウンターが 0 のとき THEN かめはめ波バトルシステム SHALL CPU がかめはめ波以外の行動を選択するようにする
    
    ### 要件 6
    
    **ユーザーストーリー:** プレイヤーとして、ゲームの状態を常に把握したいので、現在の溜めカウンターやゲーム進行状況を確認できるようにしたい
    
    #### 受入基準
    
    1. WHEN ゲームが進行中のとき THEN かめはめ波バトルシステム SHALL プレイヤーと CPU の溜めカウンターを表示する
    2. WHEN 行動選択時 THEN かめはめ波バトルシステム SHALL 選択可能な行動を明示する
    3. WHEN 各ターンの結果が出るとき THEN かめはめ波バトルシステム SHALL 両者の行動と結果を表示する
    4. WHEN ゲームが終了するとき THEN かめはめ波バトルシステム SHALL 最終結果と勝者を明確に表示する
    
  4. requirements.mdを修正する
    勝負の前に2回手を叩くのを忘れていました。
    パンパン👏→手を出す というリズムでゲームは進行します。

    1. WHEN バリアに対してかめはめ波が使用されるとき THEN かめはめ波バトルシステム SHALL バリアを行ったプレイヤーの勝利を宣言する

    また、上記の条件はあいこになるので、ここも修正します。

    スクリーンショット8.png

    1. WHEN 各ターンが開始されるとき THEN かめはめ波バトルシステム SHALL 手を 2 回叩くアニメーションを表示する
    2. WHEN バリアに対してかめはめ波が使用されるとき THEN かめはめ波バトルシステム SHALL あいこと判定し溜めカウンターを 1 減少させる

    しっかり直してくれました。

    修正されたrequirements.md
    # 要件ドキュメント
    
    ## 概要
    
    かめはめ波バトルは、じゃんけんに似た戦略的な対戦ゲームです。プレイヤーは「溜め」「バリア」「かめはめ波」の 3 つの行動から選択し、CPU と対戦します。溜めによってかめはめ波の使用回数を蓄積し、バリアで防御し、かめはめ波で攻撃する戦略的なゲームプレイを提供します。
    
    ## 用語集
    
    - **かめはめ波バトルシステム**: プレイヤーと CPU が対戦するゲームシステム
    - **プレイヤー**: ゲームを操作するユーザー
    - **CPU**: コンピューター制御の対戦相手
    - **溜め**: かめはめ波を使用するためのエネルギーを蓄積する行動
    - **バリア**: 相手の攻撃を防ぐ防御行動
    - **かめはめ波**: 攻撃行動(溜めが必要)
    - **溜めカウンター**: 現在蓄積されている溜めの回数
    - **バリア連続フラグ**: 前回の行動がバリアだったかを示すフラグ
    
    ## 要件
    
    ### 要件 1
    
    **ユーザーストーリー:** プレイヤーとして、CPU と対戦できるかめはめ波バトルゲームをプレイしたいので、戦略的な選択を楽しめるようにしたい
    
    #### 受入基準
    
    1. WHEN ゲームが開始されるとき THEN かめはめ波バトルシステム SHALL プレイヤーと CPU の初期状態を設定する
    2. WHEN 各ターンが開始されるとき THEN かめはめ波バトルシステム SHALL 手を 2 回叩くアニメーションを表示する
    3. WHEN プレイヤーが行動を選択するとき THEN かめはめ波バトルシステム SHALL 有効な行動のみを受け付ける
    4. WHEN 両者の行動が決定されるとき THEN かめはめ波バトルシステム SHALL 勝敗判定を実行する
    5. WHEN 勝敗が決定されるとき THEN かめはめ波バトルシステム SHALL ゲーム結果を表示する
    6. WHEN あいこの場合 THEN かめはめ波バトルシステム SHALL ゲームを継続する
    
    ### 要件 2
    
    **ユーザーストーリー:** プレイヤーとして、溜め行動でかめはめ波のエネルギーを蓄積したいので、戦略的に攻撃の準備ができるようにしたい
    
    #### 受入基準
    
    1. WHEN プレイヤーが溜めを選択するとき THEN かめはめ波バトルシステム SHALL 溜めカウンターを 1 増加させる
    2. WHEN 溜めカウンターが 3 に達した状態で溜めを選択するとき THEN かめはめ波バトルシステム SHALL プレイヤーの敗北を宣言する
    3. WHEN 溜め行動に対してかめはめ波が使用されるとき THEN かめはめ波バトルシステム SHALL 溜めを行ったプレイヤーの敗北を宣言する
    4. WHEN 溜め行動に対して溜めまたはバリアが使用されるとき THEN かめはめ波バトルシステム SHALL あいこと判定する
    
    ### 要件 3
    
    **ユーザーストーリー:** プレイヤーとして、バリアで相手の攻撃を防ぎたいので、防御的な戦略を取れるようにしたい
    
    #### 受入基準
    
    1. WHEN プレイヤーがバリアを選択するとき THEN かめはめ波バトルシステム SHALL バリア連続フラグを確認する
    2. WHEN 前回の行動がバリアでバリアを選択するとき THEN かめはめ波バトルシステム SHALL 無効な行動として拒否する
    3. WHEN バリアに対してかめはめ波が使用されるとき THEN かめはめ波バトルシステム SHALL あいこと判定し溜めカウンターを 1 減少させる
    4. WHEN バリアに対して溜めまたはバリアが使用されるとき THEN かめはめ波バトルシステム SHALL あいこと判定する
    
    ### 要件 4
    
    **ユーザーストーリー:** プレイヤーとして、かめはめ波で相手を攻撃したいので、溜めたエネルギーを使って勝利を目指せるようにしたい
    
    #### 受入基準
    
    1. WHEN プレイヤーがかめはめ波を選択するとき THEN かめはめ波バトルシステム SHALL 溜めカウンターが 1 以上であることを確認する
    2. WHEN 溜めカウンターが 0 でかめはめ波を選択するとき THEN かめはめ波バトルシステム SHALL 無効な行動として拒否する
    3. WHEN かめはめ波が使用されるとき THEN かめはめ波バトルシステム SHALL 溜めカウンターを 1 減少させる
    4. WHEN かめはめ波に対して溜めが使用されるとき THEN かめはめ波バトルシステム SHALL かめはめ波を使用したプレイヤーの勝利を宣言する
    5. WHEN かめはめ波に対してバリアが使用されるとき THEN かめはめ波バトルシステム SHALL あいこと判定し溜めカウンターを 1 減少させる
    6. WHEN かめはめ波に対してかめはめ波が使用されるとき THEN かめはめ波バトルシステム SHALL あいこと判定する
    
    ### 要件 5
    
    **ユーザーストーリー:** プレイヤーとして、CPU が適切な戦略で対戦してほしいので、挑戦的で楽しいゲーム体験を得られるようにしたい
    
    #### 受入基準
    
    1. WHEN CPU が行動を選択するとき THEN かめはめ波バトルシステム SHALL 現在の状態に基づいて有効な行動を選択する
    2. WHEN CPU の溜めカウンターが 3 に達するとき THEN かめはめ波バトルシステム SHALL CPU が溜め以外の行動を選択するようにする
    3. WHEN CPU の前回の行動がバリアのとき THEN かめはめ波バトルシステム SHALL CPU がバリア以外の行動を選択するようにする
    4. WHEN CPU の溜めカウンターが 0 のとき THEN かめはめ波バトルシステム SHALL CPU がかめはめ波以外の行動を選択するようにする
    
    ### 要件 6
    
    **ユーザーストーリー:** プレイヤーとして、ゲームの状態を常に把握したいので、現在の溜めカウンターやゲーム進行状況を確認できるようにしたい
    
    #### 受入基準
    
    1. WHEN ゲームが進行中のとき THEN かめはめ波バトルシステム SHALL プレイヤーと CPU の溜めカウンターを表示する
    2. WHEN 行動選択時 THEN かめはめ波バトルシステム SHALL 選択可能な行動を明示する
    3. WHEN 各ターンの結果が出るとき THEN かめはめ波バトルシステム SHALL 両者の行動と結果を表示する
    4. WHEN ゲームが終了するとき THEN かめはめ波バトルシステム SHALL 最終結果と勝者を明確に表示する
    
  5. 設計フェーズに進む
    「Move to design phase」を押下します。
    これでdesign.mdが生成されます。
    スクリーンショット9.png

  6. design.mdを確認する
    design.mdは、requirements.mdを元に作成される設計書です。
    ざっと確認して、問題なさそうなのでこれで進めます。
    スクリーンショット10.png

    生成されたdesign.md
    # 設計ドキュメント
    
    ## 概要
    
    かめはめ波バトルは、戦略的な選択を重視したターン制対戦ゲームです。プレイヤーと CPU が「溜め」「バリア」「かめはめ波」の 3 つの行動から選択し、複雑な勝敗条件に基づいて対戦します。TypeScript を使用してコンソールベースのゲームとして実装し、明確な状態管理と直感的なユーザーインターフェースを提供します。
    
    ## アーキテクチャ
    
    システムは以下の主要コンポーネントで構成されます:
    
    

    ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
    │ GameEngine │ │ PlayerState │ │ BattleUI │
    │ │ │ │ │ │
    │ - ゲーム進行 │◄──►│ - 溜めカウンター │ │ - 入力処理 │
    │ - 勝敗判定 │ │ - 前回の行動 │ │ - 状態表示 │
    │ - ターン管理 │ │ - 行動履歴 │ │ - アニメーション │
    └─────────────────┘ └─────────────────┘ └─────────────────┘
    │ │ │
    └───────────────────────┼───────────────────────┘

    ┌─────────────────┐
    │ ActionType │
    │ │
    │ - CHARGE │
    │ - BARRIER │
    │ - KAMEHAMEHA │
    └─────────────────┘

    
    ## コンポーネントとインターフェース
    
    ### GameEngine
    
    ゲームの中核となるエンジンで、ターンの進行と勝敗判定を管理します。
    
    ```typescript
    interface GameEngine {
    startGame(): void;
    playTurn(playerAction: ActionType, cpuAction: ActionType): TurnResult;
    isGameOver(): boolean;
    getWinner(): Player | null;
    }
    

    PlayerState

    各プレイヤー(人間と CPU)の状態を管理します。

    interface PlayerState {
    chargeCount: number;
    lastAction: ActionType | null;
    canUseAction(action: ActionType): boolean;
    executeAction(action: ActionType): void;
    }
    

    BattleUI

    ユーザーインターフェースを管理し、入力処理と表示を担当します。

    interface BattleUI {
    displayGameState(playerState: PlayerState, cpuState: PlayerState): void;
    showHandClapping(): Promise<void>;
    getPlayerAction(availableActions: ActionType[]): Promise<ActionType>;
    displayTurnResult(result: TurnResult): void;
    displayGameResult(winner: Player): void;
    }
    

    CPUStrategy

    CPU の行動選択ロジックを管理します。

    interface CPUStrategy {
    selectAction(cpuState: PlayerState, playerState: PlayerState): ActionType;
    }
    

    データモデル

    ActionType

    enum ActionType {
    CHARGE = "charge",
    BARRIER = "barrier",
    KAMEHAMEHA = "kamehameha",
    }
    

    Player

    enum Player {
    HUMAN = "human",
    CPU = "cpu",
    }
    

    TurnResult

    interface TurnResult {
    playerAction: ActionType;
    cpuAction: ActionType;
    outcome: TurnOutcome;
    winner: Player | null;
    message: string;
    }
    
    enum TurnOutcome {
    PLAYER_WIN = "player_win",
    CPU_WIN = "cpu_win",
    DRAW = "draw",
    }
    

    GameState

    interface GameState {
    playerState: PlayerState;
    cpuState: PlayerState;
    turnCount: number;
    isGameOver: boolean;
    winner: Player | null;
    }
    

    正確性プロパティ

    プロパティとは、システムのすべての有効な実行において真であるべき特性または動作のことです。本質的には、システムが何をすべきかについての形式的な記述です。プロパティは、人間が読める仕様と機械で検証可能な正確性保証との橋渡しとなります。

    プロパティ 1: ゲーム初期化の一貫性

    任意のゲーム開始時において、プレイヤーと CPU の溜めカウンターは 0、前回の行動は null に設定されるべきである
    検証: 要件 1.1

    プロパティ 2: 無効な行動の拒否

    任意のプレイヤー状態において、その状態で無効な行動(溜めカウンター=3 での溜め、前回バリア後のバリア、溜めカウンター=0 でのかめはめ波)は拒否されるべきである
    検証: 要件 1.3, 3.2, 4.1, 4.2

    プロパティ 3: あいこ時のゲーム継続

    任意のあいこの結果において、ゲームオーバーフラグは false であり、ゲームは継続されるべきである
    検証: 要件 1.6

    プロパティ 4: 溜めによるカウンター増加

    任意の溜めカウンター値(0〜2)において、溜め行動の実行後、溜めカウンターは 1 増加するべきである
    検証: 要件 2.1

    プロパティ 5: かめはめ波が溜めに勝利

    任意のゲーム状態において、一方がかめはめ波を使用し、他方が溜めを使用した場合、かめはめ波を使用したプレイヤーが勝利するべきである
    検証: 要件 2.3, 4.4

    プロパティ 6: 同種行動の組み合わせはあいこ

    任意のゲーム状態において、両プレイヤーが溜めと溜め、溜めとバリア、バリアと溜め、バリアとバリアの組み合わせを選択した場合、結果はあいこになるべきである
    検証: 要件 2.4, 3.4

    プロパティ 7: バリアとかめはめ波はあいこで溜め消費

    任意のゲーム状態において、一方がバリアを使用し、他方がかめはめ波を使用した場合(順序は問わない)、結果はあいこになり、かめはめ波を使用したプレイヤーの溜めカウンターは 1 減少するべきである
    検証: 要件 3.3, 4.5

    プロパティ 8: かめはめ波による溜め消費

    任意の溜めカウンター値(1 以上)において、かめはめ波の実行後、溜めカウンターは 1 減少するべきである
    検証: 要件 4.3

    プロパティ 9: かめはめ波同士はあいこで両者溜め消費

    任意のゲーム状態において、両プレイヤーがかめはめ波を使用した場合、結果はあいこになり、両プレイヤーの溜めカウンターがそれぞれ 1 減少するべきである
    検証: 要件 4.6

    プロパティ 10: CPU は常に有効な行動を選択

    任意のCPU 状態において、CPU が選択する行動は、その状態で有効な行動であるべきである
    検証: 要件 5.1

    プロパティ 11: CPU はバリア連続使用を回避

    任意のCPU 状態において、前回の行動がバリアの場合、CPU はバリア以外の行動を選択するべきである
    検証: 要件 5.3

    プロパティ 12: CPU は溜めなしでかめはめ波を使用しない

    任意のCPU 状態において、溜めカウンターが 0 の場合、CPU はかめはめ波以外の行動を選択するべきである
    検証: 要件 5.4

    エラーハンドリング

    無効な行動の処理

    • 溜めカウンターが 3 の状態で溜めを選択した場合、即座に敗北として処理
    • 前回バリアを使用した直後にバリアを選択した場合、エラーメッセージを表示し再入力を促す
    • 溜めカウンターが 0 の状態でかめはめ波を選択した場合、エラーメッセージを表示し再入力を促す

    入力検証

    • ユーザー入力は事前に検証し、有効な行動のみを受け付ける
    • 無効な入力(存在しない行動名など)に対しては、エラーメッセージを表示し再入力を促す

    状態の整合性

    • 各ターン終了時に、両プレイヤーの状態が有効な範囲内(溜めカウンター: 0-3)であることを確認
    • 不整合が検出された場合は、エラーログを出力し、ゲームを安全に終了

    テスト戦略

    ユニットテスト

    以下のコンポーネントに対してユニットテストを実施します:

    1. PlayerState:
    • 溜めカウンターの増減
    • 行動の有効性チェック
    • 状態の初期化
    1. GameEngine:
    • 勝敗判定ロジック
    • ターン処理
    • ゲーム終了条件
    1. CPUStrategy:
    • 有効な行動の選択
    • 制約条件の遵守

    プロパティベーステスト

    プロパティベーステストにはfast-checkライブラリを使用します。各プロパティベーステストは最低 100 回の反復を実行し、ランダムな入力に対してプロパティが保持されることを検証します。

    各プロパティベーステストには、設計ドキュメントの正確性プロパティを参照するコメントを付与します。形式: **Feature: kamehame-battle, Property {番号}: {プロパティテキスト}**

    テスト対象のプロパティ:

    • プロパティ 1: ゲーム初期化の一貫性
    • プロパティ 2: 無効な行動の拒否
    • プロパティ 3: あいこ時のゲーム継続
    • プロパティ 4: 溜めによるカウンター増加
    • プロパティ 5: かめはめ波が溜めに勝利
    • プロパティ 6: 同種行動の組み合わせはあいこ
    • プロパティ 7: バリアとかめはめ波はあいこで溜め消費
    • プロパティ 8: かめはめ波による溜め消費
    • プロパティ 9: かめはめ波同士はあいこで両者溜め消費
    • プロパティ 10: CPU は常に有効な行動を選択
    • プロパティ 11: CPU はバリア連続使用を回避
    • プロパティ 12: CPU は溜めなしでかめはめ波を使用しない

    エッジケーステスト

    以下の境界条件を明示的にテストします:

    • 溜めカウンターが 3 の状態で溜めを選択(敗北条件)
    • CPU の溜めカウンターが 3 の状態での行動選択(溜め以外を選択)
    • 溜めカウンターが 0 の状態でのかめはめ波選択(無効)
    • 連続バリア使用の試行(無効)

    統合テスト

    完全なゲームフローを通じて、複数のターンにわたる状態遷移と勝敗判定が正しく機能することを確認します。

    
    </details>
    
    
    
  7. 実装計画に進む
    「 Move to implementation plan」を押下します。
    tasks.mdが作成されます。
    スクリーンショット9.png

  8. tasks.mdを確認
    tasks.mdは、どういう順番で何を実装するかが記述されたドキュメントです。
    「Looks good to me」を押下して、ワークフローを終了します。
    スクリーンショット10.png

    生成されたtasks.md
    # 実装計画
    
    - [ ] 1. プロジェクト構造とコア型定義の設定
    
      - TypeScript プロジェクトの初期化(package.json、tsconfig.json)
      - 基本的な型定義(ActionType、Player、TurnOutcome、各種インターフェース)
      - fast-check テストライブラリの設定
      - _要件: 1.1_
    
    - [ ] 2. PlayerState クラスの実装
    
      - 溜めカウンター、前回の行動、行動履歴の管理
      - 行動の有効性チェック機能
      - 状態の初期化と更新メソッド
      - _要件: 2.1, 3.2, 4.1, 4.2_
    
    - [ ] 2.1 PlayerState のプロパティベーステスト
    
      - **プロパティ 1: ゲーム初期化の一貫性**
      - **検証: 要件 1.1**
    
    - [ ] 2.2 PlayerState のプロパティベーステスト
    
      - **プロパティ 2: 無効な行動の拒否**
      - **検証: 要件 1.3, 3.2, 4.1, 4.2**
    
    - [ ] 2.3 PlayerState のプロパティベーステスト
    
      - **プロパティ 4: 溜めによるカウンター増加**
      - **検証: 要件 2.1**
    
    - [ ] 2.4 PlayerState のプロパティベーステスト
    
      - **プロパティ 8: かめはめ波による溜め消費**
      - **検証: 要件 4.3**
    
    - [ ] 3. GameEngine クラスの実装
    
      - ターン処理とゲーム状態管理
      - 勝敗判定ロジックの実装
      - ゲーム終了条件の判定
      - _要件: 1.4, 1.6, 2.3, 2.4, 3.3, 3.4, 4.4, 4.5, 4.6_
    
    - [ ] 3.1 GameEngine のプロパティベーステスト
    
      - **プロパティ 3: あいこ時のゲーム継続**
      - **検証: 要件 1.6**
    
    - [ ] 3.2 GameEngine のプロパティベーステスト
    
      - **プロパティ 5: かめはめ波が溜めに勝利**
      - **検証: 要件 2.3, 4.4**
    
    - [ ] 3.3 GameEngine のプロパティベーステスト
    
      - **プロパティ 6: 同種行動の組み合わせはあいこ**
      - **検証: 要件 2.4, 3.4**
    
    - [ ] 3.4 GameEngine のプロパティベーステスト
    
      - **プロパティ 7: バリアとかめはめ波はあいこで溜め消費**
      - **検証: 要件 3.3, 4.5**
    
    - [ ] 3.5 GameEngine のプロパティベーステスト
    
      - **プロパティ 9: かめはめ波同士はあいこで両者溜め消費**
      - **検証: 要件 4.6**
    
    - [ ] 4. CPUStrategy クラスの実装
    
      - 現在の状態に基づく有効な行動の選択
      - 制約条件(溜め上限、バリア連続使用、溜めなしかめはめ波)の遵守
      - ランダム性を含む戦略的な行動選択
      - _要件: 5.1, 5.2, 5.3, 5.4_
    
    - [ ] 4.1 CPUStrategy のプロパティベーステスト
    
      - **プロパティ 10: CPU は常に有効な行動を選択**
      - **検証: 要件 5.1**
    
    - [ ] 4.2 CPUStrategy のプロパティベーステスト
    
      - **プロパティ 11: CPU はバリア連続使用を回避**
      - **検証: 要件 5.3**
    
    - [ ] 4.3 CPUStrategy のプロパティベーステスト
    
      - **プロパティ 12: CPU は溜めなしでかめはめ波を使用しない**
      - **検証: 要件 5.4**
    
    - [ ] 5. チェックポイント - すべてのテストが通ることを確認
    
      - すべてのテストが通ることを確認し、質問があれば用户に尋ねる
    
    - [ ] 6. BattleUI クラスの実装
    
      - コンソール入出力の処理
      - ゲーム状態の表示機能
      - 手を叩くアニメーションの実装
      - プレイヤー行動の入力処理
      - _要件: 1.2, 1.3, 1.5, 6.1, 6.2, 6.3, 6.4_
    
    - [ ] 6.1 BattleUI のユニットテスト
    
      - 入力検証機能のテスト
      - 表示フォーマットのテスト
      - エラーメッセージの表示テスト
      - _要件: 1.3, 6.1, 6.2, 6.3, 6.4_
    
    - [ ] 7. メインゲームループの実装
    
      - ゲーム開始から終了までの完全なフロー
      - 各コンポーネントの統合
      - エラーハンドリングの実装
      - _要件: 1.1, 1.2, 1.4, 1.5, 1.6_
    
    - [ ] 7.1 統合テスト
    
      - 完全なゲームフローのテスト
      - 複数ターンにわたる状態遷移のテスト
      - エッジケースの統合テスト
      - _要件: すべて_
    
    - [ ] 8. エッジケースの明示的テスト
    
      - 溜めカウンター=3 での溜め選択(敗北条件)
      - 連続バリア使用の試行
      - 溜めカウンター=0 でのかめはめ波選択
      - _要件: 2.2, 3.2, 4.2, 5.2_
    
    - [ ] 9. 最終チェックポイント - すべてのテストが通ることを確認
      - すべてのテストが通ることを確認し、質問があれば用户に尋ねる
    
  9. タスクを実行する
    上から順に「Start task」を押下して、実装してもらいます。
    スクリーンショット12.png

  10. 作成されたアプリを確認
    ながらで待っていたので正確な時間は分かりませんが、30分かからずタスクは完了しました。
    動画.gif

    ちゃんとゲームになっています。

まとめと所感

できたゲームについては、「初手バリアは出さない」など色々改善点はありますが、簡単なものはあっという間に作れてしまいました。
仕様駆動開発というだけあって、仕様(requirements.md)をしっかり固めておくが肝ですね。

ソースコードを全く触らずに簡単なゲームを作れてしまうことに、感動と寂しさを感じました。

4
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?