如何通过内部条件过渡正确设计游戏状态机



我有以下旨在模拟游戏状态的状态

enum GameStates{ Bet, CompleteBet, Bonus,CompleteBonus, Jackpot, CompleteJackpot } 

只有Bet状态是游戏的外部(可以从外部触发(。每个其他状态都是内部的,这是由游戏本身触发的。

如果我处于CompleteBet状态,则游戏可以继续进行Bonus状态,但也可以返回到Bet状态(这是每场游戏配置(。

CompleteBonus状态下重复相同的情况。该游戏可以自行运输到BetJackpot状态。

现在,我正在使用以下if - else Logic

处理这种情况
    // In CompleteBet state
    if (bonus.isEnabled) {
        setState(Bonus);
    } else {
        if (jackpot.isEnabled) {
            setState(Jackpot);
        } else {
            setState(Bet);
        }
        // in CompleteBonus state
        if (jackpot.isEnabled) {
            setState(Jackpot);
        } else {
            setState(Bet);
        }
    }

,但显然这不是很好的解决方案。也许我需要重新设计我的状态机器?任何建议都会被赞赏

编辑: 实际上GameState枚举的定义是如此:

enum GameState implements TransferState {
    WITHDRAW {
        @Override
        public void initiateStep(final GameContext context) {
            //some logic which triggers complete transfer
        }
    },
    COMPLETE_WITHDRAW {
        @Override
        public void completeTransfer(final GameContext context) {
            // if bonus is enabled;
            if (true) {
                context.setState(BONUS);
            } else {
                // if remote gaming is on
                if (true) {
                    context.setState(REMOTE_GAME);
                } else {
                    context.setState(WITHDRAW);
                }
            }
        }
    }
    // ...
}

initiateTransfercompleteTransfer定义为TransferState接口中的default方法。

在这种情况下,我将使用状态模式 cain of Parsive Pattern ,并为您的情况

您的游戏

public class Game{

    private IState state = new StateReady();
    public void play(){
        state.play(this);
    }
    public void setState(IState state){
        this.state = state;
    }

}

状态

public StateReady implements IState{
        private List<IGameHeadler> headler = new ArrayList<>();
        public StateReady(){
            headler.add(new BonusHeadler());
            headler.add(new JackpotHeadler());
        }
        public void play(Game game){
            //Your operation
            //an example the operation is
            Iterator iterator = headler.iterator();
            boolean flag = false;
            while(iterator.hasNext() && !flag){
                IGameHeadler headler = (IGameHeadler)iterator.next();
                flag = headler.doChain();
            }
            game.setState(new WaitState(game));
        }
}

公共接口

public interface IGameHeadler{
    boolean doChain();
}
public interface IState{
    void play(Game game);
}

但是游戏的状态会更改为

  1. 外部线程
  2. 游戏类
  3. 另一种状态
  4. 任何对象,模式都是一个为已知问题提供解决方案的想法,但是可以根据情况扩展此想法

另外,责任链模式是将您的逻辑划分为更多headler的很酷的模式,在您的情况下,一个主人是If()

另外,我偏好使用另一个模式来创建状态,一个状态是唯一的, flyweaight模式解决此问题,我将删除enum

最新更新