Exemplo n.º 1
0
        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);
            }
        }
Exemplo n.º 2
0
        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));
            }
        }