示例#1
0
        private BoardHistory DoMove(BoardHistory boardHistory, BoardMove boardMove)
        {
            var newBoard = boardHistory.Board.Copy();

            newBoard.MovePiece(boardMove.Piece, boardMove.MoveType);

            var identifier = newBoard.Identifier();

            if (_map.Contains(identifier))
            {
                return(boardHistory);
            }

            _map.Add(identifier);

            var newMoveList = new List <BoardMove>();

            newMoveList.AddRange(boardHistory.Moves);
            newMoveList.Add(boardMove);

            var positionForTargetPiece = newBoard.GetPointOf(_targetPiece);
            var isSolved = Equals(positionForTargetPiece, Point.For(1, 0));

            var newBoardHistory = new BoardHistory(newBoard, newMoveList, isSolved);

            _queue.Enqueue(newBoardHistory);

            return(newBoardHistory);
        }
示例#2
0
        public BoardHistory SolvePuzzle(Board board)
        {
            var pieces = board.Pieces;

            _targetPiece = ResolveTargetPiece(pieces);

            _map.Add(board.Identifier());

            var boardHistory = new BoardHistory(board, new List <BoardMove>(), false);

            _queue.Enqueue(boardHistory);

            while (_queue.Count > 0)
            {
                var item            = _queue.Dequeue();
                var newBoardHistory = ApplyAllMoves(item);

                if (newBoardHistory != null)
                {
                    if (newBoardHistory.IsSolved)
                    {
                        Console.WriteLine(DateTimeOffset.UtcNow);
                        Console.WriteLine("Number of boards analyzed: {0}", _map.Count);
                        Console.WriteLine("Press the ANY key");
                        Console.ReadLine();
                        return(newBoardHistory);
                    }
                }
            }

            throw new DramaticalFailure("No solution!!");
        }
示例#3
0
        private BoardHistory ApplyAllMoves(BoardHistory boardHistory)
        {
            var list = boardHistory.Board.GetMovesBoard();

            foreach (var puzzleMove in list)
            {
                var newBoardHistory = DoMove(boardHistory, puzzleMove);
                if (newBoardHistory.IsSolved)
                {
                    return(newBoardHistory);
                }
            }

            return(boardHistory);
        }
示例#4
0
        public void ShowSolution(Board puzzle, BoardHistory solution)
        {
            var index = 1;

            foreach (var puzzleMove in solution.Moves)
            {
                Console.WriteLine("{0}. {1}", index++, puzzleMove);
            }
            Console.WriteLine();
            Console.WriteLine("Press the ANY key");
            Console.ReadLine();


            var map = new Dictionary <Piece, ConsoleColor>();

            var queue = new Queue <ConsoleColor>();

            queue.Enqueue(ConsoleColor.Green);
            queue.Enqueue(ConsoleColor.DarkGreen);
            queue.Enqueue(ConsoleColor.DarkBlue);
            queue.Enqueue(ConsoleColor.Blue);
            queue.Enqueue(ConsoleColor.Cyan);
            queue.Enqueue(ConsoleColor.DarkCyan);
            queue.Enqueue(ConsoleColor.Magenta);
            queue.Enqueue(ConsoleColor.DarkMagenta);
            queue.Enqueue(ConsoleColor.Yellow);
            queue.Enqueue(ConsoleColor.DarkYellow);

            foreach (var piece in puzzle.Pieces)
            {
                if (piece.Size.Equals(new Size(2, 2)))
                {
                    map.Add(piece, ConsoleColor.Red);
                }
                else
                {
                    map.Add(piece, queue.Dequeue());
                }
            }

            Console.Clear();
            Console.BackgroundColor = ConsoleColor.Black;

            Console.CursorTop = 0;
            WriteBoard(puzzle, map);
            Console.ReadLine();

            Console.CursorTop = 0;

            foreach (var puzzleMove in solution.Moves)
            {
                puzzle.MovePiece(puzzleMove.Piece, puzzleMove.MoveType);
                WriteBoard(puzzle, map);
                Console.CursorTop       = 0;
                Console.BackgroundColor = ConsoleColor.Black;
                //Thread.Sleep(200);
                Console.ReadLine();
            }

            Console.ReadLine();
        }