Beispiel #1
0
        public void SolveTrivialBoardWithMultipleMoves()
        {
            GameBoard gameBoard = new GameBoard(1, 4);

            gameBoard.CreateGameBlock(GameBoard.GameBlockType.Player, 0, 0);
            gameBoard.CreateGameBlock(GameBoard.GameBlockType.MultipleMoves, 0, 1);
            gameBoard.CreateGameBlock(GameBoard.GameBlockType.MultipleMoves, 0, 2);
            gameBoard.CreateGameBlock(GameBoard.GameBlockType.Player, 0, 3);

            bool             aborted;
            List <GameBoard> solutions = GameBoardReverseSolver.ReverseSolve(gameBoard, 2, 1, 0, 60000, out aborted);

            Assert.AreEqual(1, solutions.Count);

            foreach (GameBoard solution in solutions)
            {
                Console.WriteLine("Game board: Difficulty={0} \n{1}\n", solution.GetDifficulty(), solution.GetBoardString());
                Console.WriteLine("Solution: \n{0}\n", solution.GetSolutionString());

                Assert.IsTrue(solution.IsUntouchedPuzzle());
                Assert.IsTrue(solution.PlaySolution());
            }

            Console.WriteLine("Number of Solutions: {0}", solutions.Count);
        }
Beispiel #2
0
        public void SolveMiniWithMultiplePuzzleWithLoop()
        {
            GameBoard gameBoard = new GameBoard(1, 4);

            gameBoard.CreateGameBlock(GameBoard.GameBlockType.Player, 0, 0);
            gameBoard.CreateGameBlock(GameBoard.GameBlockType.Normal, 0, 1);
            gameBoard.CreateGameBlock(GameBoard.GameBlockType.MultipleMoves, 0, 2);
            gameBoard.CreateGameBlock(GameBoard.GameBlockType.ChangeDirection, 0, 3, MovementDirection.Left);

            bool             aborted;
            List <GameBoard> solutions = GameBoardReverseSolver.ReverseSolve(gameBoard, 3, 10, 0, 60000, out aborted);

            Assert.GreaterOrEqual(solutions.Count, 1);

            foreach (GameBoard solution in solutions)
            {
                Console.WriteLine("Game board: Difficulty={0} \n{1}\n", solution.GetDifficulty(), solution.GetBoardString());
                Console.WriteLine("Solution: \n{0}\n", solution.GetSolutionString());

                Assert.IsTrue(solution.IsUntouchedPuzzle());
                Assert.IsTrue(solution.PlaySolution());
            }

            Console.WriteLine("Number of Solutions: {0}", solutions.Count);
        }
Beispiel #3
0
        public void SolveLooped()
        {
            GameBoard gameBoard = new GameBoard(2, 4);

            gameBoard.CreateGameBlock(GameBoard.GameBlockType.Null, 0, 0);
            gameBoard.CreateGameBlock(GameBoard.GameBlockType.ChangeDirection, 0, 1, MovementDirection.Right);
            gameBoard.CreateGameBlock(GameBoard.GameBlockType.Normal, 0, 2);
            gameBoard.CreateGameBlock(GameBoard.GameBlockType.ChangeDirection, 0, 3, MovementDirection.Down);
            gameBoard.CreateGameBlock(GameBoard.GameBlockType.Player, 1, 0);
            gameBoard.CreateGameBlock(GameBoard.GameBlockType.ChangeDirection, 1, 1, MovementDirection.Up);
            gameBoard.CreateGameBlock(GameBoard.GameBlockType.Normal, 1, 2);
            gameBoard.CreateGameBlock(GameBoard.GameBlockType.ChangeDirection, 1, 3, MovementDirection.Left);

            bool             aborted;
            List <GameBoard> solutions = GameBoardReverseSolver.ReverseSolve(gameBoard, 3, 10, 0, 30000, out aborted);

            // There should only be 1 solution
            Assert.AreEqual(1, solutions.Count);

            foreach (GameBoard solution in solutions)
            {
                Console.WriteLine("Game board: Difficulty={0} \n{1}\n", solution.GetDifficulty(), solution.GetBoardString());
                Console.WriteLine("Solution: \n{0}\n", solution.GetSolutionString());

                Assert.IsTrue(solution.IsUntouchedPuzzle());
                Assert.IsTrue(solution.PlaySolution());
            }
        }
Beispiel #4
0
        public void SolveSmallWithMultiplePuzzle()
        {
            /***************************
            * N = null
            * P = player
            * G = normal game block
            * X = extra block
            * M = multiple move block
            *   0 1 2 3 4
            * 0 N P N P N
            * 1 P G D G P
            * 2 N M X G P
            * 3 N G G P N
            * 4 N P G G N
            *
            ***************************/
            GameBoard gameBoard = new GameBoard(5, 5);

            gameBoard.CreateGameBlock(GameBoard.GameBlockType.Player, 0, 1);
            gameBoard.CreateGameBlock(GameBoard.GameBlockType.Player, 0, 3);
            gameBoard.CreateGameBlock(GameBoard.GameBlockType.Player, 1, 0);
            gameBoard.CreateGameBlock(GameBoard.GameBlockType.Player, 1, 4);
            gameBoard.CreateGameBlock(GameBoard.GameBlockType.Player, 2, 4);
            gameBoard.CreateGameBlock(GameBoard.GameBlockType.Player, 3, 3);
            gameBoard.CreateGameBlock(GameBoard.GameBlockType.Player, 4, 1);

            gameBoard.CreateGameBlock(GameBoard.GameBlockType.Normal, 1, 1);
            gameBoard.CreateGameBlock(GameBoard.GameBlockType.Normal, 1, 3);
            gameBoard.CreateGameBlock(GameBoard.GameBlockType.MultipleMoves, 2, 1, numberOfMultipleMoves: 2);
            gameBoard.CreateGameBlock(GameBoard.GameBlockType.ExtraMove, 2, 2);
            gameBoard.CreateGameBlock(GameBoard.GameBlockType.Normal, 2, 3);
            gameBoard.CreateGameBlock(GameBoard.GameBlockType.Normal, 3, 1);
            gameBoard.CreateGameBlock(GameBoard.GameBlockType.Normal, 3, 2);
            gameBoard.CreateGameBlock(GameBoard.GameBlockType.Normal, 4, 2);
            gameBoard.CreateGameBlock(GameBoard.GameBlockType.Normal, 4, 3);

            GameBlockChangeDirection changeDirection =
                gameBoard.CreateGameBlock(GameBoard.GameBlockType.ChangeDirection, 1, 2) as GameBlockChangeDirection;

            changeDirection.ForceDirection = MovementDirection.Down;
            bool             aborted;
            List <GameBoard> solutions = GameBoardReverseSolver.ReverseSolve(gameBoard, 5, 10, 0, 60000, out aborted);

            Assert.GreaterOrEqual(solutions.Count, 1);

            foreach (GameBoard solution in solutions)
            {
                Console.WriteLine("Game board: Difficulty={0} \n{1}\n", solution.GetDifficulty(), solution.GetBoardString());
                Console.WriteLine("Solution: \n{0}\n", solution.GetSolutionString());

                Assert.IsTrue(solution.IsUntouchedPuzzle());
                Assert.IsTrue(solution.PlaySolution());
            }

            Console.WriteLine("Number of Solutions: {0}", solutions.Count);
        }
Beispiel #5
0
        public void SolveSmallPuzzle()
        {
            /***************************
            * N = null
            * P = player
            * G = normal game block
            *   0 1 2 3
            * 0 N P N N
            * 1 P G G P
            * 2 N G N N
            * 3 N G G P
            * 4 N P G G
            *
            ***************************/
            GameBoard gameBoard = new GameBoard(5, 4);

            gameBoard.CreateGameBlock(GameBoard.GameBlockType.Player, 0, 1);
            gameBoard.CreateGameBlock(GameBoard.GameBlockType.Player, 1, 0);
            gameBoard.CreateGameBlock(GameBoard.GameBlockType.Player, 1, 3);
            gameBoard.CreateGameBlock(GameBoard.GameBlockType.Player, 3, 3);
            gameBoard.CreateGameBlock(GameBoard.GameBlockType.Player, 4, 1);

            gameBoard.CreateGameBlock(GameBoard.GameBlockType.Normal, 1, 1);
            gameBoard.CreateGameBlock(GameBoard.GameBlockType.Normal, 1, 2);
            gameBoard.CreateGameBlock(GameBoard.GameBlockType.Normal, 2, 1);
            gameBoard.CreateGameBlock(GameBoard.GameBlockType.Normal, 3, 1);
            gameBoard.CreateGameBlock(GameBoard.GameBlockType.Normal, 3, 2);
            gameBoard.CreateGameBlock(GameBoard.GameBlockType.Normal, 4, 2);
            gameBoard.CreateGameBlock(GameBoard.GameBlockType.Normal, 4, 3);

            bool             aborted;
            List <GameBoard> solutions = GameBoardReverseSolver.ReverseSolve(gameBoard, 5, 10, 0, 60000, out aborted);

            Assert.GreaterOrEqual(solutions.Count, 1);
            Assert.LessOrEqual(solutions.Count, 10);

            foreach (GameBoard solution in solutions)
            {
                Console.WriteLine("Game board: Difficulty={0} \n{1}\n", solution.GetDifficulty(), solution.GetBoardString());
                Console.WriteLine("Solution: \n{0}\n", solution.GetSolutionString());

                Assert.IsTrue(solution.IsUntouchedPuzzle());
                Assert.IsTrue(solution.PlaySolution());
            }

            Console.WriteLine("Number of Solutions: {0}", solutions.Count);
        }
Beispiel #6
0
        public void SolveTwoMultiBlock()
        {
            /***************************
            * N = null
            * P = player
            * M = multiple game block
            *   0 1
            * 0 P P
            * 1 P M
            * 2 P M
            * 3 P P
            *
            ***************************/
            GameBoard gameBoard = new GameBoard(4, 2);

            gameBoard.CreateGameBlock(GameBoard.GameBlockType.Player, 0, 0);
            gameBoard.CreateGameBlock(GameBoard.GameBlockType.Player, 0, 1);
            gameBoard.CreateGameBlock(GameBoard.GameBlockType.Player, 1, 0);
            gameBoard.CreateGameBlock(GameBoard.GameBlockType.Player, 2, 0);
            gameBoard.CreateGameBlock(GameBoard.GameBlockType.Player, 3, 0);
            gameBoard.CreateGameBlock(GameBoard.GameBlockType.Player, 3, 1);

            gameBoard.CreateGameBlock(GameBoard.GameBlockType.MultipleMoves, 1, 1);
            gameBoard.CreateGameBlock(GameBoard.GameBlockType.MultipleMoves, 2, 1);

            bool             aborted;
            List <GameBoard> solutions = GameBoardReverseSolver.ReverseSolve(gameBoard, 2, 20, 0, 60000, out aborted);

            Assert.AreEqual(8, solutions.Count);

            foreach (GameBoard solution in solutions)
            {
                Console.WriteLine("Game board: Difficulty={0} \n{1}\n", solution.GetDifficulty(), solution.GetBoardString());
                Console.WriteLine("Solution: \n{0}\n", solution.GetSolutionString());

                Assert.IsTrue(solution.IsUntouchedPuzzle());
                Assert.IsTrue(solution.PlaySolution());
            }

            Console.WriteLine("Number of Solutions: {0}", solutions.Count);
        }
Beispiel #7
0
        public void SolveLargePuzzle()
        {
            /***************************
            * N = null
            * P = player
            * G = normal game block
            *   0 1 2 3 4 5
            * 0 N P N N P N
            * 1 P G G G G P
            * 2 N G N N G N
            * 3 N G G G G P
            * 4 N P G G G N
            * 5 N N G N G N
            * 6 N N P N P N
            *
            ***************************/
            GameBoard gameBoard = new GameBoard(7, 6);

            gameBoard.CreateGameBlock(GameBoard.GameBlockType.Player, 0, 1);
            gameBoard.CreateGameBlock(GameBoard.GameBlockType.Player, 0, 4);
            gameBoard.CreateGameBlock(GameBoard.GameBlockType.Player, 1, 0);
            gameBoard.CreateGameBlock(GameBoard.GameBlockType.Player, 1, 5);
            gameBoard.CreateGameBlock(GameBoard.GameBlockType.Player, 3, 5);
            gameBoard.CreateGameBlock(GameBoard.GameBlockType.Player, 4, 1);
            gameBoard.CreateGameBlock(GameBoard.GameBlockType.Player, 6, 2);
            gameBoard.CreateGameBlock(GameBoard.GameBlockType.Player, 6, 4);

            gameBoard.CreateGameBlock(GameBoard.GameBlockType.Normal, 1, 1);
            gameBoard.CreateGameBlock(GameBoard.GameBlockType.Normal, 1, 2);
            gameBoard.CreateGameBlock(GameBoard.GameBlockType.Normal, 1, 3);
            gameBoard.CreateGameBlock(GameBoard.GameBlockType.Normal, 1, 4);
            gameBoard.CreateGameBlock(GameBoard.GameBlockType.Normal, 2, 1);
            gameBoard.CreateGameBlock(GameBoard.GameBlockType.Normal, 2, 4);
            gameBoard.CreateGameBlock(GameBoard.GameBlockType.Normal, 3, 1);
            gameBoard.CreateGameBlock(GameBoard.GameBlockType.Normal, 3, 2);
            gameBoard.CreateGameBlock(GameBoard.GameBlockType.Normal, 3, 3);
            gameBoard.CreateGameBlock(GameBoard.GameBlockType.Normal, 3, 4);
            gameBoard.CreateGameBlock(GameBoard.GameBlockType.Normal, 4, 2);
            gameBoard.CreateGameBlock(GameBoard.GameBlockType.Normal, 4, 3);
            gameBoard.CreateGameBlock(GameBoard.GameBlockType.Normal, 4, 4);
            gameBoard.CreateGameBlock(GameBoard.GameBlockType.Normal, 5, 2);
            gameBoard.CreateGameBlock(GameBoard.GameBlockType.Normal, 5, 4);

            GameBoardReverseSolver.SetMaxCombinationsSolve(1);
            int fails = 0;

            GameBoardReverseSolver.SolutionFailedEvent += (sender, args) => fails++;

            bool             aborted;
            List <GameBoard> solutions = GameBoardReverseSolver.ReverseSolve(gameBoard, 5, 10, 0, 15000, out aborted);

            Console.WriteLine("Failures: {0}\n", fails);

            Assert.GreaterOrEqual(solutions.Count, 1);
            Assert.LessOrEqual(solutions.Count, 10);

            foreach (GameBoard solution in solutions)
            {
                Console.WriteLine("Game board: Difficulty={0} \n{1}\n", solution.GetDifficulty(), solution.GetBoardString());
                Console.WriteLine("Solution: \n{0}\n", solution.GetSolutionString());

                Assert.IsTrue(solution.IsUntouchedPuzzle());
                Assert.IsTrue(solution.PlaySolution());
            }

            Console.WriteLine("Number of Solutions: {0}", solutions.Count);

            GameBoardReverseSolver.SetMaxCombinationsSolve(0);
        }