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); }
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!!"); }
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); }
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(); }