예제 #1
0
        public SnakeTableStateMachine()
        {
            _currentState = SnakeStatesTypes.NORTH;

            // initialize table
            _stateMachine = new StateAction[4, 3];
            _stateMachine[(int)SnakeStatesTypes.NORTH, (int)InputType.LEFT] = new StateAction()
            {
                State = SnakeStatesTypes.WEST, Action = SnakeStatesTypes.WEST
            };
            _stateMachine[(int)SnakeStatesTypes.NORTH, (int)InputType.RIGHT] = new StateAction()
            {
                State = SnakeStatesTypes.EAST, Action = SnakeStatesTypes.EAST
            };
            _stateMachine[(int)SnakeStatesTypes.NORTH, (int)InputType.FORWARD] = new StateAction()
            {
                State = SnakeStatesTypes.NORTH, Action = SnakeStatesTypes.NORTH
            };

            _stateMachine[(int)SnakeStatesTypes.EAST, (int)InputType.LEFT] = new StateAction()
            {
                State = SnakeStatesTypes.NORTH, Action = SnakeStatesTypes.NORTH
            };
            _stateMachine[(int)SnakeStatesTypes.EAST, (int)InputType.RIGHT] = new StateAction()
            {
                State = SnakeStatesTypes.SOUTH, Action = SnakeStatesTypes.SOUTH
            };
            _stateMachine[(int)SnakeStatesTypes.EAST, (int)InputType.FORWARD] = new StateAction()
            {
                State = SnakeStatesTypes.EAST, Action = SnakeStatesTypes.EAST
            };

            _stateMachine[(int)SnakeStatesTypes.WEST, (int)InputType.LEFT] = new StateAction()
            {
                State = SnakeStatesTypes.SOUTH, Action = SnakeStatesTypes.SOUTH
            };
            _stateMachine[(int)SnakeStatesTypes.WEST, (int)InputType.RIGHT] = new StateAction()
            {
                State = SnakeStatesTypes.NORTH, Action = SnakeStatesTypes.NORTH
            };
            _stateMachine[(int)SnakeStatesTypes.WEST, (int)InputType.FORWARD] = new StateAction()
            {
                State = SnakeStatesTypes.WEST, Action = SnakeStatesTypes.WEST
            };

            _stateMachine[(int)SnakeStatesTypes.SOUTH, (int)InputType.LEFT] = new StateAction()
            {
                State = SnakeStatesTypes.EAST, Action = SnakeStatesTypes.EAST
            };
            _stateMachine[(int)SnakeStatesTypes.SOUTH, (int)InputType.RIGHT] = new StateAction()
            {
                State = SnakeStatesTypes.WEST, Action = SnakeStatesTypes.WEST
            };
            _stateMachine[(int)SnakeStatesTypes.SOUTH, (int)InputType.FORWARD] = new StateAction()
            {
                State = SnakeStatesTypes.SOUTH, Action = SnakeStatesTypes.SOUTH
            };
        }
예제 #2
0
        public SnakeStatesTypes NextMove(InputType input)
        {
            // Find next move from current state and input
            SnakeStatesTypes nextMove = _stateMachine[(int)_currentState, (int)input].Action;

            // Find next state from current state and input
            _currentState = _stateMachine[(int)_currentState, (int)input].State;
            return(nextMove);
        }
        public SnakeStatesTypes NextMove(InputType input)
        {
            // Find next move from current state and input
            SnakeStatesTypes nextMove = _currentState.NextAction(input);

            // Find next state from current state and input
            _currentState = _currentState.NextState(input);

            return(nextMove);
        }
예제 #4
0
        public void Start()
        {
            SnakePlayground pg = new SnakePlayground(20, 20);

            // using table state machine
            //IState stateMachine = new SnakeTableStateMachine();

            // using state machine pattern
            IState stateMachine = new SnakeStateMachinePattern();

            bool gameContinue = true;

            while (gameContinue)
            {
                InputType        nextInput = ReadNextEvent();
                SnakeStatesTypes nextMove  = stateMachine.NextMove(nextInput);

                gameContinue = pg.DoNextMove(nextMove);
            }

            Console.WriteLine("You loose :-( ");
        }
예제 #5
0
        public bool DoNextMove(SnakeStatesTypes move)
        {
            bool inside = true;

            switch (move)
            {
            case SnakeStatesTypes.NORTH:
                _headrow--;
                break;

            case SnakeStatesTypes.SOUTH:
                _headrow++;
                break;

            case SnakeStatesTypes.EAST:
                _headcol++;
                break;

            case SnakeStatesTypes.WEST:
                _headcol--;
                break;
            }


            // check if snake is moving outside playground
            if (_headrow == maxHeight || _headrow == -1 ||
                _headcol == maxWidth || _headcol == -1)
            {
                inside = false; // snake is outside playground
            }
            else
            {
                PrintPlayground(); // snake still inside
            }

            return(inside);
        }