public static IEnumerable <Tuple <ViewerBoard, BoardHistoryItem> > EnumerateWithBoard(this BoardHistory boardHistory, ViewerBoard currentBoard) { // Create a copy of the current board ViewerBoard board = new ViewerBoard(currentBoard.ToString()); List <BoardHistoryItem> reversedHistory = new List <BoardHistoryItem>(boardHistory); reversedHistory.Reverse(); // "Undo" moves in the boardHistory foreach (BoardHistoryItem item in reversedHistory) { board.SimulateUndo(item); } // "Play" forward returning the board state along the way foreach (BoardHistoryItem item in boardHistory) { yield return(new Tuple <ViewerBoard, BoardHistoryItem>(board, item)); board.SimulatePlay(item.Move); } }
public static string ToBoardSpaceMoveString(ViewerBoard board, Move move) { if (null == board) { throw new ArgumentNullException("board"); } if (null == move) { throw new ArgumentNullException("move"); } if (move.IsPass) { return("pass"); } if (move.Color != board.CurrentTurnColor) { return(null); } string startPiece = ToBoardSpacePieceName(move.PieceName); if (board.CurrentTurn == 0) { return(startPiece); } else { string endPiece = ""; if (move.Position.Stack > 0) { // On top of board PieceName pieceBelow = board.GetPiece(move.Position.GetBelow()); endPiece = ToBoardSpacePieceName(pieceBelow); } else { // Find neighbor to move.Position foreach (Direction dir in EnumUtils.Directions) { // Found a neighbor! Position pos = move.Position.NeighborAt(dir); PieceName neighbor = board.GetPieceOnTop(pos); if (neighbor == move.PieceName) { Position posBelow = board.GetPiecePosition(neighbor).GetBelow(); neighbor = null != posBelow?board.GetPiece(posBelow) : PieceName.INVALID; } if (neighbor != PieceName.INVALID) { endPiece = ToBoardSpacePieceName(neighbor); switch (dir) { case Direction.Up: endPiece = endPiece + @"\"; break; case Direction.UpRight: endPiece = @"/" + endPiece; break; case Direction.DownRight: endPiece = @"-" + endPiece; break; case Direction.Down: endPiece = @"\" + endPiece; break; case Direction.DownLeft: endPiece = endPiece + @"/"; break; case Direction.UpLeft: endPiece = endPiece + @"-"; break; } break; } } } return(string.IsNullOrWhiteSpace(endPiece) ? startPiece : string.Format("{0} {1}", startPiece, endPiece)); } }