gpt4 book ai didi

java - 如何正确设计具有内部条件转换的游戏状态机

转载 作者:太空宇宙 更新时间:2023-11-04 09:32:29 25 4
gpt4 key购买 nike

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

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

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

如果我处于CompleteBet状态,游戏可以进入Bonus状态,但也可以返回到Bet状态(这是每个游戏的配置)。

CompleteBonus 状态下会重复相同的情况。游戏可以自行转换到BetJackpot状态。

现在我正在使用以下 if - else 逻辑处理这种情况

    // 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);
}
}
}
}
// ...
}

initiateTransfercompleteTransferTransferState 接口(interface)中定义为 default 方法。

最佳答案

在这种情况下,我将使用状态模式责任链模式,以及您的案例的示例

你的游戏

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));
}
}

常用接口(interface)

public interface IGameHeadler{

boolean doChain();
}

public interface IState{

void play(Game game);
}

但是游戏的状态会变成

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

此外,责任链模式是一种很酷的模式,可以将逻辑划分为更多 header ,在您的情况下,一个 header 是 If()

此外,我更喜欢使用另一种模式来创建状态,一个状态是唯一的,享元模式解决了这个问题,我会删除枚举

关于java - 如何正确设计具有内部条件转换的游戏状态机,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56914127/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com