public void DynamicTreeSplittingSearchTest_7()
        {
            // ARRANGE
            var sourceBoardStr = new[]
            {
                "_b_b_b",
                "______",
                "___w_b",
                "______",
                "______",
                "______"
            };
            var sourceBoard = new BoardMock(sourceBoardStr, 6, false);

            sourceBoard.SwitchPlayers();

            var root = new GameNode();

            root.IsMaxPlayer = false;

            var practiceBoard = sourceBoard.ToMinified();

            _search.Search(root, 3, sbyte.MinValue, sbyte.MaxValue, practiceBoard, _cts.Token);
            var bestMove = root.GetBestMove();

            root.Result.Should().Be(sbyte.MinValue);
            bestMove.Should().BeEquivalentTo(new Move(1, 0, 0, 1));
        }
        public void DynamicDeepeningSequentialTest_7()
        {
            // ARRANGE
            var sourceBoardStr = new[]
            {
                "_b_b_b",
                "______",
                "___w_b",
                "______",
                "______",
                "______"
            };
            var sourceBoard = new BoardMock(sourceBoardStr, 6, false);

            sourceBoard.SwitchPlayers();

            var root = new GameNode();

            root.IsMaxPlayer = false;

            var practiceBoard = sourceBoard.ToMinified();

            var(result, maxPly) = _wrapper.Run(practiceBoard, root, sbyte.MinValue, sbyte.MaxValue, 3, _cts.Token);
            var bestMove = result.Peek().Move;

            bestMove.From.Should().BeEquivalentTo(new Cell(1, 0));
            bestMove.To.Should().BeEquivalentTo(new Cell(0, 1));
        }
Example #3
0
        public void GlobalSetup()
        {
            _search1 = ServiceLocator.CreateSerialGameTreeSearch();
            _search2 = ServiceLocator.CreateDynamicTreeSplittingGameTreeSearch();

            _wrapper1 = ServiceLocator.CreateProgressiveDeepeningWrapper(_search1);
            _wrapper2 = ServiceLocator.CreateProgressiveDeepeningWrapper(_search2);

            var sourceBoardStr = new[]
            {
                "_b_b_b",
                "b_b_b_",
                "______",
                "______",
                "_w_w_w",
                "w_w_w_"
            };
            var sourceBoard1 = new BoardMock(sourceBoardStr, 6, false);
            var sourceBoard2 = new BoardMock(sourceBoardStr, 6, false);

            _practiceBoard1 = sourceBoard1.ToMinified();
            _practiceBoard2 = sourceBoard2.ToMinified();

            _cts = new CancellationTokenSource();

            _node1 = new GameNode();
            _node2 = new GameNode();
        }
Example #4
0
        protected void AssertBoardsAreEqual(BoardMock targetBoard, BoardMock sourceBoard)
        {
            targetBoard.Player1.Figures
            .Should()
            .BeEquivalentTo(sourceBoard.Player1.Figures);

            targetBoard.Player2.Figures
            .Should()
            .BeEquivalentTo(sourceBoard.Player2.Figures);

            targetBoard.ActivePlayer.Name.Should().BeEquivalentTo(sourceBoard.ActivePlayer.Name);
        }
Example #5
0
        public void UndoMovesTest_4()
        {
            // ARRANGE
            var sourceBoardStr = new[]
            {
                "__W__",
                "_____",
                "_____",
                "_____",
                "____B"
            };
            var sourceBoard = new BoardMock(sourceBoardStr, 5, false);

            sourceBoard.SwitchPlayers();

            var capturedPiece = new Piece(1, 1, false, false, false, true);

            capturedPiece.IsCaptured = true;
            sourceBoard.Player2.Figures.Add(capturedPiece);

            var targetBoardStr = new[]
            {
                "_____",
                "_B___",
                "w____",
                "_____",
                "____B"
            };
            var targetBoard = new BoardMock(targetBoardStr, 5, false);

            targetBoard.Player1.Figures.First(f => f.X == 0 && f.Y == 2).AvailableMoves =
                new List <Cell> {
                new Cell(2, 0)
            };

            var move = new HistoryItem(sourceBoard.AwaitingPlayer, new Move(0, 2, 2, 0));

            move.Captured          = new Piece(1, 1, false, false, true, true);
            move.IsPieceChangeType = true;

            var latestMoveBeforeUnto = new HistoryItem(sourceBoard.AwaitingPlayer, new Move(2, 4, 0, 2));

            latestMoveBeforeUnto.Captured = new Piece(1, 3, false, false, true, true);

            // ACT
            _rules.Undo(sourceBoard, move, latestMoveBeforeUnto);

            // ASSERT
            AssertBoardsAreEqual(targetBoard, sourceBoard);
        }
Example #6
0
        public void UndoMovesTest_2()
        {
            // ARRANGE
            var sourceBoardStr = new[]
            {
                "___b",
                "w___",
                "____",
                "w___"
            };
            var sourceBoard = new BoardMock(sourceBoardStr, 4, false);

            sourceBoard.SwitchPlayers();

            var capturedPiece = new Piece(1, 2, false, false, false);

            capturedPiece.IsCaptured = true;
            sourceBoard.Player2.Figures.Add(capturedPiece);

            var targetBoardStr = new[]
            {
                "___b",
                "____",
                "_b__",
                "w_w_"
            };
            var targetBoard = new BoardMock(targetBoardStr, 4, false);

            targetBoard.Player1.Figures.First(f => f.X == 0 && f.Y == 3).AvailableMoves =
                new List <Cell> {
                new Cell(2, 1)
            };
            targetBoard.Player1.Figures.First(f => f.X == 2 && f.Y == 3).AvailableMoves =
                new List <Cell> {
                new Cell(0, 1)
            };

            var move = new HistoryItem(sourceBoard.AwaitingPlayer, new Move(new Cell(2, 3), new Cell(0, 1)));

            move.Captured = new Piece(1, 2, false, false, true);

            // ACT
            _rules.Undo(sourceBoard, move, null);

            // ASSERT
            AssertBoardsAreEqual(targetBoard, sourceBoard);
        }
        public void CheckersRulesTest_2()
        {
            // ARRANGE
            var sourceBoardStr = new[]
            {
                "_b_b",
                "____",
                "_b__",
                "w_w_"
            };
            var sourceBoard = new BoardMock(sourceBoardStr, 4, false);

            var targetBoardStr = new[]
            {
                "_b_b",
                "__w_",
                "____",
                "__w_"
            };
            var targetBoard = new BoardMock(targetBoardStr, 4, false);

            targetBoard.SwitchPlayers();
            targetBoard.Player2.Figures.First(f => f.X == 3 && f.Y == 0).AvailableMoves =
                new List <Cell> {
                new Cell(1, 2)
            };
            targetBoard.Player2.Figures.First(f => f.X == 1 && f.Y == 0).AvailableMoves =
                new List <Cell> {
                new Cell(3, 2)
            };

            var capturedPiece = new Piece(1, 2, false, false, false);

            capturedPiece.IsCaptured = true;
            targetBoard.Player2.Figures.Add(capturedPiece);

            var move = new HistoryItem(sourceBoard.ActivePlayer, new Move(new Cell(0, 3), new Cell(2, 1)));

            // ACT
            _rules.MakeMove(sourceBoard, move);

            // ASSERT
            AssertBoardsAreEqual(sourceBoard, targetBoard);
        }
Example #8
0
        public void StateTransitionsTest_1()
        {
            // ARRANGE
            var sourceBoardStr = new[]
            {
                "____",
                "____",
                "__b_",
                "_w__"
            };
            var sourceBoard = new BoardMock(sourceBoardStr, 4, false);

            sourceBoard.SwitchPlayers();

            var targetBoardStr = new[]
            {
                "____",
                "____",
                "__b_",
                "_w__"
            };
            var targetBoard = new BoardMock(targetBoardStr, 4, false);

            var practiceBoardSource = sourceBoard.ToMinified();

            practiceBoardSource.ActivePlayer = true;

            var practiceBoardTarget = targetBoard.ToMinified();

            var gameNode = new GameNode();

            gameNode.Move       = new HistoryItemMinified(new Cell(1, 3), new Cell(3, 1), true);
            practiceBoardSource = _stateTransitions.GoDown(practiceBoardSource, gameNode);
            practiceBoardSource = _stateTransitions.GoUp(practiceBoardSource, gameNode);

            practiceBoardSource.ClearMoves();

            var pieceSource = (PieceMinified)practiceBoardSource.Player1Pieces[0];
            var pieceTarget = (PieceMinified)practiceBoardTarget.Player1Pieces[0];

            pieceSource.Should().BeEquivalentTo(pieceTarget);
            pieceSource.Should().BeEquivalentTo(pieceTarget);
        }
        public void DynamicTreeSplittingSearchTest_1()
        {
            var sourceBoardStr = new[]
            {
                "B___",
                "____",
                "__w_",
                "____"
            };
            var sourceBoard = new BoardMock(sourceBoardStr, 4, false);

            var root = new GameNode();

            var practiceBoard = sourceBoard.ToMinified();

            _search.Search(root, 2, sbyte.MinValue, sbyte.MaxValue, practiceBoard, _cts.Token);
            var bestMove = root.GetBestMove();

            bestMove.Should().BeEquivalentTo(new Move(2, 2, 3, 1));
        }
        public void CheckersRulesTest_5()
        {
            // ARRANGE
            var sourceBoardStr = new[]
            {
                "_____",
                "_b___",
                "_____",
                "_b___",
                "__w__"
            };
            var sourceBoard = new BoardMock(sourceBoardStr, 5, false);

            var targetBoardStr = new[]
            {
                "_____",
                "_b___",
                "w____",
                "_____",
                "_____"
            };
            var targetBoard = new BoardMock(targetBoardStr, 5, false);

            targetBoard.Player1.Figures.First(f => f.X == 0 && f.Y == 2).AvailableMoves =
                new List <Cell> {
                new Cell(2, 0)
            };

            var capturedPiece = new Piece(1, 3, false, false, false);

            capturedPiece.IsCaptured = true;
            targetBoard.Player2.Figures.Add(capturedPiece);

            var move = new HistoryItem(sourceBoard.ActivePlayer, new Move(new Cell(2, 4), new Cell(0, 2)));

            // ACT
            _rules.MakeMove(sourceBoard, move);

            // ASSERT
            AssertBoardsAreEqual(targetBoard, sourceBoard);
        }
        public void DynamicDeepeningSequentialTest_1()
        {
            var sourceBoardStr = new[]
            {
                "B___",
                "____",
                "__w_",
                "____"
            };
            var sourceBoard = new BoardMock(sourceBoardStr, 4, false);

            var root = new GameNode();

            var practiceBoard = sourceBoard.ToMinified();

            var(result, maxPly) = _wrapper.Run(practiceBoard, root, sbyte.MinValue, sbyte.MaxValue, 2, _cts.Token);
            var bestMove = result.Peek().Move;

            bestMove.From.Should().BeEquivalentTo(new Cell(2, 2));
            bestMove.To.Should().BeEquivalentTo(new Cell(3, 1));
        }
Example #12
0
        public void GameTreeSequentialSearch_3()
        {
            // ARRANGE
            var sourceBoardStr = new[]
            {
                "b_b_",
                "____",
                "____",
                "_w_w"
            };
            var sourceBoard = new BoardMock(sourceBoardStr, 4, false);

            var root = new GameNode();

            var practiceBoard = sourceBoard.ToMinified();

            _search.Search(root, 12, sbyte.MinValue, sbyte.MaxValue, practiceBoard, _cts.Token);
            var bestMove = root.GetBestMove();

            bestMove.Should().BeEquivalentTo(new Move(3, 3, 2, 2));
        }
Example #13
0
        public void UndoMovesTest_1()
        {
            // ARRANGE
            var sourceBoardStr = new[]
            {
                "_b_b",
                "____",
                "___w",
                "w___"
            };
            var sourceBoard = new BoardMock(sourceBoardStr, 4, false);

            sourceBoard.SwitchPlayers();

            var targetBoardStr = new[]
            {
                "_b_b",
                "____",
                "____",
                "w_w_"
            };
            var targetBoard = new BoardMock(targetBoardStr, 4, false);

            targetBoard.Player1.Figures.First(f => f.X == 0 && f.Y == 3).AvailableMoves =
                new List <Cell> {
                new Cell(1, 2)
            };
            targetBoard.Player1.Figures.First(f => f.X == 2 && f.Y == 3).AvailableMoves =
                new List <Cell> {
                new Cell(1, 2), new Cell(3, 2)
            };

            var move = new HistoryItem(sourceBoard.AwaitingPlayer, new Move(new Cell(2, 3), new Cell(3, 2)));

            // ACT
            _rules.Undo(sourceBoard, move, null);

            // ASSERT
            AssertBoardsAreEqual(targetBoard, sourceBoard);
        }
        public void CheckersRulesTest_4()
        {
            // ARRANGE
            var sourceBoardStr = new[]
            {
                "____",
                "____",
                "_W_b",
                "____"
            };
            var sourceBoard = new BoardMock(sourceBoardStr, 4, false);

            sourceBoard.SwitchPlayers();

            var targetBoardStr = new[]
            {
                "____",
                "____",
                "_W__",
                "__B_"
            };
            var targetBoard = new BoardMock(targetBoardStr, 4, false);

            targetBoard.Player1.Figures.First(f => f.X == 1 && f.Y == 2).AvailableMoves =
                new List <Cell> {
                new Cell(0, 3), new Cell(0, 1), new Cell(2, 1)
            };

            var move = new HistoryItem(sourceBoard.ActivePlayer, new Move(new Cell(3, 2), new Cell(2, 3)));

            // ACT
            _rules.MakeMove(sourceBoard, move);

            // ASSERT
            AssertBoardsAreEqual(targetBoard, sourceBoard);
        }
Example #15
0
        public void GameTreeSequentialSearch_6()
        {
            // ARRANGE
            var sourceBoardStr = new[]
            {
                "______",
                "______",
                "______",
                "w_b___",
                "______",
                "w_w_w_"
            };
            var sourceBoard = new BoardMock(sourceBoardStr, 6, false);

            var root = new GameNode();

            var practiceBoard = sourceBoard.ToMinified();

            _search.Search(root, 3, sbyte.MinValue, sbyte.MaxValue, practiceBoard, _cts.Token);
            var bestMove = root.GetBestMove();

            root.Result.Should().Be(sbyte.MaxValue);
            bestMove.Should().BeEquivalentTo(new Move(2, 5, 3, 4));
        }
Example #16
0
        public void ComputerPlayerTest_1()
        {
            var computerPlayer = new ComputerPlayer("P1", _wrapper, _treeManager);
            var anotherPlayer  = new PlayerMock("P2");

            var board1Str = new[]
            {
                "_____",
                "_b___",
                "_____",
                "_b___",
                "w____"
            };
            var board1 = new BoardMock(board1Str, 5, false);

            board1.ActivePlayer.Figures
            .First(f => f.X == 0 && f.Y == 4)
            .AvailableMoves = new List <Cell> {
                new Cell(1, 3)
            };

            var board2Str = new[]
            {
                "_____",
                "_b___",
                "__w__",
                "_____",
                "_____"
            };
            var board2 = new BoardMock(board2Str, 5, false);

            board2.ActivePlayer.Figures
            .First(f => f.X == 2 && f.Y == 2)
            .AvailableMoves = new List <Cell> {
                new Cell(0, 0)
            };

            var board3Str = new[]
            {
                "W____",
                "_____",
                "_____",
                "_____",
                "_____"
            };
            var board3 = new BoardMock(board3Str, 5, false);

            board3.SwitchPlayers();

            var gameMock = new GameMock(
                new[] { board1, board2, board3 },
                new IPlayer[] { computerPlayer, computerPlayer, anotherPlayer });

            var cts = new CancellationTokenSource();

            computerPlayer.MakeMove(gameMock, cts.Token).Wait();

            gameMock.Moves
            .Should()
            .BeEquivalentTo(new[]
            {
                new Move(0, 4, 1, 3),
                new Move(2, 2, 0, 0)
            });
        }