示例#1
0
        public void Player1IsFirst()
        {
            _player1.GetAction(Arg.Any <Board>()).Returns(new TicTacToeAction {
                Position = 0, Tile = BoardTile.X
            });

            _game.DoNextTurn();

            _player1.Received(1).GetAction(Arg.Any <Board>());
            _player2.DidNotReceive().GetAction(Arg.Any <Board>());
        }
示例#2
0
        public void Setup()
        {
            _opponent = Substitute.For <ITicTacToePlayer>();
            _opponent.Tile.Returns(BoardTile.O);
            _opponent.GetAction(Arg.Any <Board>())
            .Returns(new TicTacToeAction
            {
                Position = 0,
                Tile     = BoardTile.O
            });

            _env = new TicTacToeEnvironment(_opponent);
        }
示例#3
0
        public TicTacToeEnvironmentStep Step(TicTacToeAction action)
        {
            try
            {
                DoAction(action);
            }
            catch (Exception e)
            {
                throw new InvalidOperationException(e.Message);
            }

            if (!CurrentState.IsValid())
            {
                throw new InvalidOperationException($"Action caused invalid state: '{CurrentState}'");
            }

            if (!CurrentState.IsGameOver)
            {
                DoAction(_opponent.GetAction(CurrentState));
            }

            var reward = 0.0;

            if (CurrentState.Winner() == BoardTile.X)
            {
                reward = 1.0;
            }
            if (CurrentState.Winner() == BoardTile.O)
            {
                reward = -1.0;
            }

            return(new TicTacToeEnvironmentStep
            {
                Board = CurrentState,
                Reward = reward
            });
        }
示例#4
0
        public void Step_DoesAgentAndOpponentMoves()
        {
            var placeXAtTopLeft = new TicTacToeAction {
                Position = 0, Tile = BoardTile.X
            };
            var placeOAtTopMiddle = new TicTacToeAction {
                Position = 1, Tile = BoardTile.O
            };

            _opponent.GetAction(Arg.Any <Board>())
            .Returns(placeOAtTopMiddle);

            var expectedBoard = Board
                                .CreateEmptyBoard()
                                .DoAction(placeXAtTopLeft)
                                .DoAction(placeOAtTopMiddle);

            // act
            var observation = _env.Step(placeXAtTopLeft);

            // assert
            Assert.AreEqual(expectedBoard.ToString(), observation.Board.ToString());
        }
示例#5
0
 public TicTacToeAction GetAction(TicTacToeEnvironment environment)
 => _ticTacToePlayer.GetAction(environment.CurrentState);