Как правильно оформить игровой автомат с внутренними условными переходами - PullRequest
1 голос
/ 06 июля 2019

У меня есть следующие состояния, которые предназначены для имитации игровых состояний

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

Только состояние Bet является внешним для игры (может быть вызвано извне).Любое другое состояние является внутренним, что вызвано самой игрой.

Если я нахожусь в состоянии CompleteBet, игра может перейти в состояние Bonus, но также может быть возвращена в состояние Bet (это для каждой конфигурации игры).

Та же самая ситуация повторяется в состоянии CompleteBonus.Игра может перейти в состояние Bet или Jackpot.

Сейчас я решаю эту ситуацию со следующей 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 определяется следующим образом:

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

initiateTransfer и completeTransfer определены как default методы в интерфейсе TransferState.

1 Ответ

0 голосов
/ 06 июля 2019

В этом случае я бы использовал State Patter с цепочкой ответственности и пример для вашего случая

The your game

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. Класс Game
  3. Другое состояние
  4. Любой объект, шаблон - это идея, которая предлагает решение известной проблемы, но эта идея может быть расширена в зависимости от случая

Кроме того, схема цепочки ответственности - это крутой режим для разделения вашей логики на большее количество хедлеров, в вашем случае один хедлер равен If()

Кроме того, я бы предпочел использовать другой паттер длясоздайте состояние, одно состояние уникально, и шаблон flyweight решит эту проблему. Я бы удалил enum

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...