Skip to content

unagi/sample-java-swing-game

Repository files navigation

ドラクエ風 3すくみバトル(5人抜き)仕様書

開発者向けの詳細(構成・ビルド・テスト観点など)は 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

プレイヤーと敵の強さ(5人抜き対応)

  • プレイヤー初期配分ポイント: 合計18pt(各0〜10制約)。
  • 敵は5体を連戦:
    • 先鋒: 合計12pt
    • 次鋒: 合計13pt
    • 中堅: 合計14pt
    • 副将: 合計15pt
    • 大将: 合計16pt
  • 敵の各ポイントはラウンド毎にランダム配分(各0〜10の範囲内で合計値を満たす)。

3すくみコマンド

  • コマンド: 斬、突、打
  • 相性: 斬 > 打、打 > 突、突 > 斬
    • 勝ち: 「相性+」
    • 負け: 「相性-」
    • あいこ: 相性なし

相性補正

  • 相性+: 命中+20ポイント(pp)、ダメージ+5
  • 相性-: 命中-20ポイント(pp)、ダメージ-5
  • 相性なし: 補正なし
  • 命中率は最終的に5〜95%へクランプ

命中計算(式)

  • 基本命中率 = 70% + 技×2%
  • 相性補正を加算後、5〜95%にクランプ
  • 命中判定: 一様乱数[0,1) < 命中率 で命中

ダメージ計算(式)

  • 攻撃側基礎ダメージ = 10 + 力×3
  • 相性補正を加算(+5 / -5 / 0)
  • 最終ダメージ = max(1, 基礎ダメージ - 守備×2)
  • 命中時のみ適用。HPは0未満にしない

ターンフロー(1バトル内)

  1. プレイヤーがコマンド(斬/突/打)を選択
  2. 敵がランダムでコマンド決定(事前に非表示)
  3. 相性判定(+/-/なし)を決定し表示
  4. 攻撃解決順: プレイヤー→敵(プレイヤー攻撃で敵HPが0以下なら勝利で終了)
  5. 双方とも生存なら次ターンへ

5人抜きの進行

  • プレイヤーは1人で、敵5体を順に撃破する。
  • HPはバトル間で持ち越し、勝利時に小回復を行う。
    • 小回復量: +20(上限100まで)。
  • いずれかのバトルで敗北したらゲームオーバー。
  • 5体すべて撃破したら完全勝利。

UI/画面仕様

画面構成

  • タイトル: ゲーム名、開始、終了
  • ステータス配分: 力/技/守備に±ボタン、残り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
  • ビルド: ./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.java
    • model/{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.gradle
  • gradle/(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、アニメ強化、セーブ/ロード

About

sample

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages