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)); }
protected BoardMinified Next(BoardMinified board, HistoryItemMinified latestMove) { if (NextRule != null) { return(NextRule.ApplyRule(board, latestMove)); } return(board); }
protected BoardMinified NextUndo(BoardMinified board, HistoryItemMinified toUndo, HistoryItemMinified lastMoveBeforeUndo) { if (NextRule != null) { return(NextRule.UndoRule(board, toUndo, lastMoveBeforeUndo)); } return(board); }
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)); }
public GameNode(IHistoryItem item, IBoard board, bool isMaxPlayer) { if (item != null) { Move = new HistoryItemMinified(); Move.Minify(item, board); IsMaxPlayer = isMaxPlayer; } Clear(); }
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)); }
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); }
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)); }
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); }
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)); }
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)); }
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)); }
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)); }
internal BoardMinified UndoMove(BoardMinified board, HistoryItemMinified move, HistoryItemMinified undoMove) { return(ChainOfRules.UndoRule(board, move, undoMove)); }
public abstract BoardMinified ApplyRule(BoardMinified board, HistoryItemMinified move);
internal BoardMinified FastForwardUndoMove(BoardMinified board, HistoryItemMinified move, HistoryItemMinified undoMove) { return(FastForwardUndoMoveRules.UndoRule(board, move, undoMove)); }
public abstract BoardMinified UndoRule(BoardMinified board, HistoryItemMinified toUndo, HistoryItemMinified lastMoveBeforeUndo);
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)); }
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)); }
public override BoardMinified ApplyRule(BoardMinified board, HistoryItemMinified latestMove) { board.SwitchPlayers(); return(Next(board, latestMove)); }
internal BoardMinified FastForwardMove(BoardMinified board, HistoryItemMinified move) { return(FastForwardMoveRules.ApplyRule(board, move)); }
public override BoardMinified UndoRule(BoardMinified board, HistoryItemMinified toUndo, HistoryItemMinified lastMoveBeforeUndo) { throw new InvalidOperationException(); }