diff --git a/src/main/java/controls/PhaseController.java b/src/main/java/controls/PhaseController.java new file mode 100644 index 0000000..8a1cabb --- /dev/null +++ b/src/main/java/controls/PhaseController.java @@ -0,0 +1,127 @@ +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 + } +}