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){ this.algo = algo; isDecidedAttacker = false; turnPlayer = new TurnPlayer(algo); turnBot = new TurnBot(algo); abstractGameState = turnPlayer; currentPhase=Phase.Selection; } public void bindGameView(IGameView iGameView){ 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; var 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 } }