Esempio n. 1
0
        public override BoardMinified UndoRule(BoardMinified board, HistoryItemMinified toUndo,
                                               HistoryItemMinified lastMoveBeforeUndo)
        {
            if (
                lastMoveBeforeUndo != null &&
                toUndo.IsKill &&
                lastMoveBeforeUndo.IsKill &&
                toUndo.Player == lastMoveBeforeUndo.Player)
            {
                var piece = board.GetPiece(toUndo.From.X, toUndo.From.Y, toUndo.Player);
                piece.ClearMoves();

                var newPiece = NeedToCaptureRule.Check(piece, board, board.GetSize());
                if (newPiece.HasAvailableMoves())
                {
                    board.ClearMoves();
                    board.UpdatePieceAvailableMoves(newPiece, toUndo.Player);

                    if (board.ActivePlayer != lastMoveBeforeUndo.Player)
                    {
                        board.SwitchPlayers();
                    }

                    return(board);
                }
            }

            return(NextUndo(board, toUndo, lastMoveBeforeUndo));
        }
Esempio n. 2
0
 protected BoardMinified Next(BoardMinified board, HistoryItemMinified latestMove)
 {
     if (NextRule != null)
     {
         return(NextRule.ApplyRule(board, latestMove));
     }
     return(board);
 }
Esempio n. 3
0
 protected BoardMinified NextUndo(BoardMinified board, HistoryItemMinified toUndo,
                                  HistoryItemMinified lastMoveBeforeUndo)
 {
     if (NextRule != null)
     {
         return(NextRule.UndoRule(board, toUndo, lastMoveBeforeUndo));
     }
     return(board);
 }
Esempio n. 4
0
        public override BoardMinified UndoRule(BoardMinified board, HistoryItemMinified toUndo,
                                               HistoryItemMinified lastMoveBeforeUndo)
        {
            if (board.ActivePlayer != toUndo.Player)
            {
                board.SwitchPlayers();
            }

            return(NextUndo(board, toUndo, lastMoveBeforeUndo));
        }
        public override BoardMinified UndoRule(BoardMinified board, HistoryItemMinified toUndo,
                                               HistoryItemMinified lastMoveBeforeUndo)
        {
            if (toUndo.IsKill)
            {
                var captured = toUndo.Captured;
                board.RestorePiece(captured, !toUndo.Player);
            }

            return(NextUndo(board, toUndo, lastMoveBeforeUndo));
        }
Esempio n. 6
0
        public GameNode(IHistoryItem item, IBoard board, bool isMaxPlayer)
        {
            if (item != null)
            {
                Move = new HistoryItemMinified();
                Move.Minify(item, board);
                IsMaxPlayer = isMaxPlayer;
            }

            Clear();
        }
Esempio n. 7
0
        public override BoardMinified ApplyRule(BoardMinified board, HistoryItemMinified latestMove)
        {
            board.ClearMoves();
            var(newBoard, noNeedToCallNext) = CheckRule(board);

            if (!noNeedToCallNext)
            {
                return(Next(newBoard, latestMove));
            }

            return(newBoard);
        }
        private BoardMinified CheckRule(BoardMinified board, HistoryItemMinified latestMove)
        {
            var size = board.GetSize();

            var activeSetPtr = board.ActivePlayer ? board.Player1Pieces : board.Player2Pieces;

            for (var i = 0; i < BoardMinified.BufferSize; i++)
            {
                var currentPtr = activeSetPtr + i;
                var piece      = (PieceMinified)(*currentPtr);
                if (piece.IsEmpty())
                {
                    break;
                }
                if (piece.IsCaptured)
                {
                    continue;
                }

                if (piece.CanGoUp && piece.Y > 0)
                {
                    //left
                    if (piece.X > 0)
                    {
                        piece = Check(piece, board, -1, -1);
                    }
                    //right
                    if (piece.X < size - 1)
                    {
                        piece = Check(piece, board, -1, 1);
                    }
                }

                if (piece.CanGoDown && piece.Y < size - 1)
                {
                    //left
                    if (piece.X > 0)
                    {
                        piece = Check(piece, board, 1, -1);
                    }
                    //right
                    if (piece.X < size - 1)
                    {
                        piece = Check(piece, board, 1, 1);
                    }
                }

                *currentPtr = piece;
            }

            return(board);
        }
        public override BoardMinified ApplyRule(BoardMinified board, HistoryItemMinified latestMove)
        {
            var size           = board.GetSize();
            var player1Figures = new PieceMinified[20];
            var player2Figures = new PieceMinified[20];

            if (size < 4)
            {
                throw new NotImplementedException("Game size smaller than 4");
            }

            // todo - refactor this
            var  isWhite = true;
            byte i       = 0;

            for (var y = (byte)(size - 1); y > size / 2; y--)
            {
                var startX = (byte)(1 - y % 2);
                for (var x = startX; x < size; x += 2)
                {
                    var piece = new PieceMinified(x, y, isWhite, true, false);
                    player1Figures[i] = piece;
                    board.SetBoardCell(x, y, new BoardCell(i, isWhite));
                    i++;
                }
            }

            i = 0;
            for (byte y = 0; y < size / 2 - 1; y++)
            {
                var startX = (byte)(1 - y % 2);
                for (var x = startX; x < size; x += 2)
                {
                    var piece = new PieceMinified(x, y, !isWhite, false, true);
                    player2Figures[i] = piece;
                    board.SetBoardCell(x, y, new BoardCell(i, isWhite));
                    i++;
                }
            }

            for (byte j = 0; j < player1Figures.Length; j++)
            {
                board.Player1Pieces[j] = player1Figures[j];
            }

            for (byte j = 0; j < player2Figures.Length; j++)
            {
                board.Player2Pieces[j] = player2Figures[j];
            }

            return(Next(board, null));
        }
        public override BoardMinified ApplyRule(BoardMinified board, HistoryItemMinified latestMove)
        {
            if (latestMove.IsKill)
            {
                var capturedPieceX = (latestMove.From.X + latestMove.To.X) / 2;
                var capturedPieceY = (latestMove.From.Y + latestMove.To.Y) / 2;

                latestMove.Captured =
                    board.RemovePiece((byte)capturedPieceX, (byte)capturedPieceY, !board.ActivePlayer);
            }

            return(Next(board, latestMove));
        }
Esempio n. 11
0
        public override BoardMinified UndoRule(BoardMinified board, HistoryItemMinified toUndo,
                                               HistoryItemMinified lastMoveBeforeUndo)
        {
            board.ClearMoves();
            var(newBoard, noNeedToCallNext) = CheckRule(board);

            if (!noNeedToCallNext)
            {
                return(NextUndo(newBoard, toUndo, lastMoveBeforeUndo));
            }

            return(newBoard);
        }
Esempio n. 12
0
        public override BoardMinified ApplyRule(BoardMinified board, HistoryItemMinified latestMove)
        {
            if (latestMove.IsKill)
            {
                var piece = board.GetPiece(latestMove.To.X, latestMove.To.Y, latestMove.Player);
                piece.ClearMoves();

                var newPiece = NeedToCaptureRule.Check(piece, board, board.GetSize());
                if (newPiece.HasAvailableMoves())
                {
                    board.ClearMoves();
                    board.UpdatePieceAvailableMoves(newPiece, board.ActivePlayer);
                    return(board);
                }
            }

            return(Next(board, latestMove));
        }
Esempio n. 13
0
        public void Undo(IBoard board, IHistoryItem toUndo, IHistoryItem lastMoveBeforeUndo)
        {
            var minBoard = board.ToMinified();

            var minToUndo = new HistoryItemMinified();

            minToUndo.Minify(toUndo, board);

            HistoryItemMinified minLastMove = null;

            if (lastMoveBeforeUndo != null)
            {
                minLastMove = new HistoryItemMinified();
                minLastMove.Minify(lastMoveBeforeUndo, board);
            }

            minBoard = ChainOfRules.UndoRule(minBoard, minToUndo, minLastMove);
            minBoard.ToMaximized(board);
        }
Esempio n. 14
0
        public override BoardMinified UndoRule(BoardMinified board, HistoryItemMinified toUndo,
                                               HistoryItemMinified lastMoveBeforeUndo)
        {
            if (toUndo.IsPieceChangeType)
            {
                var piece = board.GetPiece(toUndo.From.X, toUndo.From.Y, toUndo.Player);

                piece.IsQueen = false;
                if (toUndo.To.Y > toUndo.From.Y)
                {
                    board.ChangePieceType(piece.X, piece.Y, true, false, false, toUndo.Player);
                }
                else
                {
                    board.ChangePieceType(piece.X, piece.Y, false, true, false, toUndo.Player);
                }
            }

            return(NextUndo(board, toUndo, lastMoveBeforeUndo));
        }
Esempio n. 15
0
        public override BoardMinified ApplyRule(BoardMinified board, HistoryItemMinified latestMove)
        {
            var x = latestMove.To.X;
            var y = latestMove.To.Y;

            var piece = board.GetPiece(x, y, latestMove.Player);

            if (!piece.IsQueen)
            {
                var v1 = piece.CanGoDown && y == board.GetSize() - 1;
                var v2 = piece.CanGoUp && y == 0;

                if (v1 || v2)
                {
                    board.ChangePieceType(x, y, true, true, true, board.ActivePlayer);
                    latestMove.IsPieceChangeType = true;
                }
            }

            return(Next(board, latestMove));
        }
Esempio n. 16
0
        public IPlayer MakeMove(IBoard board, IHistoryItem move)
        {
            var minBoard = board.ToMinified();

            var minMove = new HistoryItemMinified();

            minMove.Minify(move, board);

            minBoard = MakeMove(minBoard, minMove);
            minBoard.ToMaximized(board);
            minMove.Maximize(move);

            if (minBoard.Player1PiecesCount == 0)
            {
                return(board.Player1);
            }

            if (minBoard.Player2PiecesCount == 0)
            {
                return(board.Player2);
            }
            return(null);
        }
 public override BoardMinified ApplyRule(BoardMinified board, HistoryItemMinified latestMove)
 {
     board = CheckRule(board, latestMove);
     return(Next(board, latestMove));
 }
Esempio n. 18
0
 internal BoardMinified MakeMove(BoardMinified board, HistoryItemMinified move)
 {
     return(ChainOfRules.ApplyRule(board, move));
 }
 public override BoardMinified UndoRule(BoardMinified board, HistoryItemMinified toUndo,
                                        HistoryItemMinified lastMoveBeforeUndo)
 {
     board = CheckRule(board, toUndo);
     return(NextUndo(board, toUndo, lastMoveBeforeUndo));
 }
Esempio n. 20
0
 internal BoardMinified UndoMove(BoardMinified board, HistoryItemMinified move, HistoryItemMinified undoMove)
 {
     return(ChainOfRules.UndoRule(board, move, undoMove));
 }
Esempio n. 21
0
 public abstract BoardMinified ApplyRule(BoardMinified board, HistoryItemMinified move);
Esempio n. 22
0
 internal BoardMinified FastForwardUndoMove(BoardMinified board, HistoryItemMinified move,
                                            HistoryItemMinified undoMove)
 {
     return(FastForwardUndoMoveRules.UndoRule(board, move, undoMove));
 }
Esempio n. 23
0
 public abstract BoardMinified UndoRule(BoardMinified board, HistoryItemMinified toUndo,
                                        HistoryItemMinified lastMoveBeforeUndo);
Esempio n. 24
0
 public override BoardMinified ApplyRule(BoardMinified board, HistoryItemMinified latestMove)
 {
     board.MovePiece(latestMove.From.X, latestMove.From.Y, latestMove.To.X, latestMove.To.Y, board.ActivePlayer);
     return(Next(board, latestMove));
 }
Esempio n. 25
0
 public override BoardMinified UndoRule(BoardMinified board, HistoryItemMinified toUndo,
                                        HistoryItemMinified lastMoveBeforeUndo)
 {
     board.MovePiece(toUndo.To.X, toUndo.To.Y, toUndo.From.X, toUndo.From.Y, toUndo.Player);
     return(NextUndo(board, toUndo, lastMoveBeforeUndo));
 }
Esempio n. 26
0
 public override BoardMinified ApplyRule(BoardMinified board, HistoryItemMinified latestMove)
 {
     board.SwitchPlayers();
     return(Next(board, latestMove));
 }
Esempio n. 27
0
 internal BoardMinified FastForwardMove(BoardMinified board, HistoryItemMinified move)
 {
     return(FastForwardMoveRules.ApplyRule(board, move));
 }
Esempio n. 28
0
 public override BoardMinified UndoRule(BoardMinified board, HistoryItemMinified toUndo,
                                        HistoryItemMinified lastMoveBeforeUndo)
 {
     throw new InvalidOperationException();
 }