開発者向けの詳細(構成・ビルド・テスト観点など)は AGENTS.md を参照してください。
- Java(Swing)で、ドラクエ風UIの1対1ターン制バトルを実装。
- 3すくみコマンドと、力/技/守備のポイント配分で戦う簡易ゲーム。
- 5人抜き(先鋒→次鋒→中堅→副将→大将)を連戦で突破すると完全勝利。途中で敗北するとゲームオーバー。
- JDK 25(Eclipse Temurinなど)。
- Gradle Wrapper 9.0(同梱)でビルド・実行。
- 外部ライブラリなし(標準Swingのみ)。
- 画面サイズ目安: 640x480 固定。
- HP: プレイヤー/敵ともに最大100。
- パラメータ(配分制):
- 力(Power): 与ダメージに影響
- 技(Skill): 命中率に影響
- 守備(Guard): 被ダメ軽減に影響
- 各パラメータの範囲: 0〜10
- プレイヤー初期配分ポイント: 合計18pt(各0〜10制約)。
- 敵は5体を連戦:
- 先鋒: 合計12pt
- 次鋒: 合計13pt
- 中堅: 合計14pt
- 副将: 合計15pt
- 大将: 合計16pt
- 敵の各ポイントはラウンド毎にランダム配分(各0〜10の範囲内で合計値を満たす)。
- コマンド: 斬、突、打
- 相性: 斬 > 打、打 > 突、突 > 斬
- 勝ち: 「相性+」
- 負け: 「相性-」
- あいこ: 相性なし
- 相性+: 命中+20ポイント(pp)、ダメージ+5
- 相性-: 命中-20ポイント(pp)、ダメージ-5
- 相性なし: 補正なし
- 命中率は最終的に5〜95%へクランプ
- 基本命中率 = 70% + 技×2%
- 相性補正を加算後、5〜95%にクランプ
- 命中判定: 一様乱数[0,1) < 命中率 で命中
- 攻撃側基礎ダメージ = 10 + 力×3
- 相性補正を加算(+5 / -5 / 0)
- 最終ダメージ = max(1, 基礎ダメージ - 守備×2)
- 命中時のみ適用。HPは0未満にしない
- プレイヤーがコマンド(斬/突/打)を選択
- 敵がランダムでコマンド決定(事前に非表示)
- 相性判定(+/-/なし)を決定し表示
- 攻撃解決順: プレイヤー→敵(プレイヤー攻撃で敵HPが0以下なら勝利で終了)
- 双方とも生存なら次ターンへ
- プレイヤーは1人で、敵5体を順に撃破する。
- HPはバトル間で持ち越し、勝利時に小回復を行う。
- 小回復量: +20(上限100まで)。
- いずれかのバトルで敗北したらゲームオーバー。
- 5体すべて撃破したら完全勝利。
- タイトル: ゲーム名、開始、終了
- ステータス配分: 力/技/守備に±ボタン、残りpt表示、開始ボタン
- 合計18pt、各値0〜10、合計超過不可
- バトル画面:
- ステータス枠: プレイヤー/敵のHPバーと数値、力/技/守備表示
- コマンド枠: 斬/突/打の3ボタン(矢印+Enter操作)
- メッセージ枠: 4行表示(例: 「プレイヤーは斬!」「命中!15のダメージ!」)
- 進行表示: 「先鋒/次鋒/中堅/副将/大将」や「残りn人」
- リザルト(各バトル後):
- 勝利時: ダメージ結果、回復量、次の相手へ進むボタン
- 敗北時: ゲームオーバー、タイトルへボタン
- 完全勝利リザルト: 5人抜き達成、再戦/タイトルへ
- 入力: マウス、矢印(上下or左右)+Enter、Escでタイトル(確認ダイアログ)
- ボタン押下ハイライト、解決中は非活性
- 命中/回避/相性のテキスト色: 命中=白、回避=灰、相性+=緑、相性-=赤
- 簡易アニメ(点滅/0.3〜0.5秒)
- 各ラウンドの合計pt(12/13/14/15/16)を満たすよう0〜10制約内でランダム配分
- 表示名: 「先鋒のスライム」「次鋒のスライム」…など固定テキスト
java.util.Random(シードは起動時の時刻)。- デバッグ用に固定シード起動をサポート(JVM引数や設定で指定)。
- Enum
Move { ZAN, TSUKI, UCHI }(斬/突/打、優劣: ZAN>UCHI, UCHI>TSUKI, TSUKI>ZAN) - Class
Stats { int power; int skill; int guard; } - Class
Battler { String name; int hp; int maxHp; Stats stats; } - Class
BattleEngine:int calcHitPct(Stats atk, Outcome o)(5〜95%クランプ)int calcDamage(Stats atk, Stats def, Outcome o)(最小1)AttackResult attemptAttack(attacker, defender, outcome, name)(命中ならHP減少)
- 管理:
Gauntlet(ラウンド、敵生成、勝利時回復) - 画面:
TitleView,AllocateView,BattleView,ResultView(Swingパネル切替) - 制御:
GameController(状態遷移と入力制御)
- Title → Allocate → Battle(先鋒→…→大将) → Result
- 各バトル勝利: 次の敵へ(回復後)
- 敗北: ゲームオーバー → Title
- 完全勝利: 完全勝利リザルト → Title/Allocate
- Esc: タイトルに戻る確認後に遷移
- 配分で残りptが0でない場合は開始不可、警告
- 各値0〜10の範囲チェック、合計18超過不可
- バトル解決中は入力抑止(ボタン無効化)
- 相性ロジック: 3×3全組み合わせで補正(命中±20pp、ダメージ±5)が正しい
- 命中率: 技=0/10、相性±で5/95%のクランプ確認
- ダメージ: 力/守備極端値で最小1保証、相性±の±5反映
- 勝敗判定: 先攻で敵撃破時、後攻処理スキップ
- 5人抜き進行: HP持ち越し、勝利時+20回復(上限100)、敗北でゲームオーバー、5体撃破で完全勝利
- UI: 配分合計制約、活性/非活性、キー操作フォーカス
- 乱数: 固定シード時の再現性
- 指定UIと操作で5人抜きが開始〜終了まで遊べる
- 仕様通りの命中/ダメージ/相性ロジックが動作
- 例外なく終了でき、タイトルへ戻れる
- 起動方法と操作説明を本書に記載
- 前提: JDK 25 がインストールされていること。
- 実行(Wrapper同梱):
- Windows:
./gradlew-utf8.bat run(推奨。UTF-8対策付き)- 通常の
./gradlew.bat runでも可(環境により文字化けの可能性あり)
- 通常の
- macOS/Linux:
./gradlew run
- Windows:
- ビルド:
./gradlew clean build - 注意: 実行時にJDK 25特有の警告が出る場合がありますが動作に支障はありません。
- 配布Zipの作成:
./gradlew packageDist- 生成物:
build/distributions/tri-battle-gauntlet.zip
- 生成物:
- ローカルインストール:
./gradlew installDist- 実行スクリプト:
build/install/tri-battle-gauntlet/bin/tri-battle-gauntlet(.bat)
- 実行スクリプト:
- 簡易起動ヘルパー: リポジトリ直下の
run.bat(Windows)/run.sh(macOS/Linux)run.batまたは./run.shを実行すると自動でinstallDist後に起動します。
src/main/java/app/App.java(エントリ)controller/GameController.javamodel/{Stats.java,Battler.java,Move.java,Outcome.java,AttackResult.java,BattleEngine.java,Gauntlet.java}view/{TitleView.java,AllocateView.java,BattleView.java,ResultView.java}
src/main/resources/(任意)build.gradle/settings.gradlegradle/(Wrapper一式)、gradlew/gradlew.bat
- プレイヤー配分合計: 18(推奨: 16〜20で調整)
- 敵配分合計(先鋒→大将): 12,13,14,15,16
- バトル間回復量: +20(0〜30程度で調整)
- 基本命中率: 70% + 技×2%
- 命中クランプ: 5〜95%
- ダメージ式: 10 + 力×3 − 守備×2(最小1)
- 相性補正: 命中±20pp、ダメージ±5
- クリティカル、状態異常、アイテム、連戦モード拡張
- 難易度設定(敵ポイント/命中基礎の変更)
- BGM/SE、アニメ強化、セーブ/ロード