package controls; import interfaces.IGameView; import resources.Algo; public class PhaseController { IGameView iGameView; Phase currentPhase; int guess; boolean isDecidedAttacker; int attacker; int target; Algo algo; public AbstractGameState abstractGameState; TurnPlayer turnPlayer; TurnBot turnBot; public PhaseController(Algo algo, IGameView iGameView) { this.algo = algo; isDecidedAttacker = false; turnPlayer = new TurnPlayer(algo); turnBot = new TurnBot(algo); abstractGameState = turnPlayer; currentPhase = Phase.Selection; this.iGameView = iGameView; } public void startGame() { changePhase(Phase.StartPlayerTurn); } public void setSelection(int attacker) { changePhase(Phase.Selection, attacker); } public void setTarget(int target) { changePhase(Phase.Target, target); } public boolean isDecidedAttacker() { return isDecidedAttacker; } /** * @param phase 遷移先の状態 * @param params 遷移先に遷移するために必要な引数 */ private void changePhase(Phase phase, int... params) { switch (phase) { case StartPlayerTurn: abstractGameState = turnPlayer; isDecidedAttacker = !abstractGameState.isDeckLess(); iGameView.repaintBoard(abstractGameState); iGameView.onStartPlayerTurn(abstractGameState); break; case Selection: this.attacker = params[0]; isDecidedAttacker = true; currentPhase = Phase.Target; iGameView.onDecidedSelection(attacker); break; case Target: this.target = params[0]; currentPhase = phase; iGameView.onDecidedTarget(target); currentPhase = Phase.Declaration; break; case Declaration: this.guess = params[0]; abstractGameState.attack(this.guess, this.attacker, this.target); currentPhase = Phase.StartBotTurn; boolean isSucceed = abstractGameState.isSucceedLatestAttack(); iGameView.repaintBoard(abstractGameState); iGameView.onFinishedPlayerAttack(guess, isSucceed); if (judgeGameOver()) return; changePhase(Phase.StartBotTurn, 0); break; case StartBotTurn: currentPhase = Phase.StartBotTurn; abstractGameState = turnBot; abstractGameState.updateTurn(); iGameView.onStartBotAttack(turnBot); break; case BotAttack: abstractGameState.updateTurn(); abstractGameState.attack(params[0], params[1], params[2]); iGameView.onFinishedBotAttack(params[0], abstractGameState.isSucceedLatestAttack()); if (judgeGameOver()) return; changePhase(Phase.StartPlayerTurn); break; } } public void setDeclaration(int guess) { changePhase(Phase.Declaration, guess); } public void botAttack(int guess, int attacker, int target) { changePhase(Phase.BotAttack, guess, attacker, target); } boolean judgeGameOver() { if (algo.getLoseA()) { iGameView.onFinishedGame(abstractGameState, true); return true; } else if (algo.getLoseB()) { iGameView.onFinishedGame(abstractGameState, false); return true; } return false; } enum Phase { StartPlayerTurn, Selection, Target, Declaration, StartBotTurn, BotAttack } }