Beispiel #1
0
        /// <summary>
        /// Determines if the end is in the eastern vision of the walker and if so, sends the walker directly in that direction.
        /// </summary>
        /// <param name="walker">The walker.</param>
        /// <returns>
        /// A boolean value if the end is in the vicinity and also the walker with updated values.
        /// </returns>
        private bool is_eastfinish(MazeWalker walker)
        {
            bool is_finish = false;
            int  y         = walker.Y;
            int  x         = walker.X;

            if (y < 0 || x < 0 || y >= m_maze_to_solve.Count)
            {
                return(false);
            }

            List <string> pixel_row = m_maze_to_solve[y];

            if (x >= pixel_row.Count)
            {
                return(false);
            }

            while (pixel_row[x] != "1")
            {
                if (x >= pixel_row.Count)
                {
                    break;
                }
                if (pixel_row[x] == "E")
                {
                    is_finish = true;
                    break;
                }
                else
                {
                    x++;
                }
            }

            if (is_finish)
            {
                //finish the job
                x          = walker.X;
                walker.Dir = Direction.East;
                while (pixel_row[x] != "1" && pixel_row[x] != "E")
                {
                    if (x >= pixel_row.Count)
                    {
                        break;
                    }

                    pixel_row[x] = "G";
                    x++;
                    walker.X = walker.X + 1;
                    MazeParser.color(m_maze_to_solve, walker);
                }
            }

            return(is_finish);
        }
Beispiel #2
0
        /// <summary>
        /// Determines if the end is in the southern vision of the walker and if so, sends the walker directly in that direction.
        /// </summary>
        /// <param name="walker">The walker.</param>
        /// <returns>
        /// A boolean value if the end is in the vicinity and also the walker with updated values.
        /// </returns>
        private bool is_southfinish(MazeWalker walker)
        {
            bool is_finish = false;
            int  y         = walker.Y;
            int  x         = walker.X;

            if (y < 0 || x < 0 || y >= m_maze_to_solve.Count)
            {
                return(false);
            }

            for (; y < m_maze_to_solve.Count; y++)
            {
                List <string> pixel_row = m_maze_to_solve[y];

                if (pixel_row[x] == "1")
                {
                    break;
                }

                if (pixel_row[x] == "E")
                {
                    is_finish = true;
                    break;
                }
            }

            if (is_finish)
            {
                //finish the job
                walker.Dir = Direction.South;
                for (y = walker.Y; y < m_maze_to_solve.Count; y++)
                {
                    List <string> pixel_row = m_maze_to_solve[y];

                    if (pixel_row[x] == "1")
                    {
                        break;
                    }

                    else if (pixel_row[x] == "E")
                    {
                        break;
                    }
                    else
                    {
                        pixel_row[x] = "X";
                    }
                    walker.Y = walker.Y + 1;
                    MazeParser.color(m_maze_to_solve, walker);
                }
            }

            return(is_finish);
        }
Beispiel #3
0
        static void Main(string[] args)
        {
            if (args.Length != 2)
            {
                System.Console.WriteLine("Usage: maze.exe source.[bmp,jpg,png] destination.[bmp,jpg,png]");
            }

            Bitmap b_source;
            Image  im_source;

            try
            {
                im_source = Image.FromFile(args[0]);
                b_source  = new Bitmap(im_source);
            }
            catch (ArgumentException)
            {
                System.Console.WriteLine("Check the file path...something went wrong.");
                return;
            }

            MazeParser my_parser = new MazeParser(b_source);

            my_parser.parse_map();

            MazeSolver            my_solver     = new MazeSolver(my_parser.Parsed_Map);
            List <List <string> > maze_solution = my_solver.solve_maze(Solving_Method.Right_hand);

            if (maze_solution != null)
            {
                my_parser.set_maze(args[1], b_source, maze_solution);
            }
            else
            {
                System.Console.WriteLine("A solution could not be found!! Check to make sure your bmp is not corrupted...");
            }
        }
Beispiel #4
0
        /// <summary>
        /// Solves the given maze using the right-hand wall following method.
        /// NOTE: this algorithm will not work for mazes that are not simply connected.
        /// </summary>
        /// <returns>
        /// The parsed solution to the maze.
        /// </returns>
        private List <List <string> > solve_maze_RH()
        {
            bool       pathFound = false;
            MazeWalker walker    = new MazeWalker();

            walker = findstart(walker);
            while (!pathFound)
            {
                //for each direction, test to see which directions are valid
                //we always prioritize the current direction
                //then the directions are prioritized according to the right-hand following method
                if (walker.Dir == Direction.North)
                {
                    bool move_success = false;
                    if (is_northvalid(walker.X, walker.Y))
                    {
                        move_success = walker.move_north(m_maze_to_solve);
                    }
                    else if (is_eastvalid(walker.X, walker.Y))
                    {
                        move_success = walker.move_east(m_maze_to_solve);
                    }
                    else if (is_westvalid(walker.X, walker.Y))
                    {
                        move_success = walker.move_west(m_maze_to_solve);
                    }
                    else
                    {
                        //turning back
                        move_success = walker.move_south(m_maze_to_solve);
                    }

                    if (!move_success)
                    {
                        return(null); //something went wrong somewhere
                    }
                    else
                    {
                        walker = turncorner(walker, walker.Dir);
                    }
                }
                else if (walker.Dir == Direction.South)
                {
                    bool move_success = false;
                    if (is_southvalid(walker.X, walker.Y))
                    {
                        move_success = walker.move_south(m_maze_to_solve);
                    }
                    else if (is_westvalid(walker.X, walker.Y))
                    {
                        move_success = walker.move_west(m_maze_to_solve);
                    }
                    else if (is_eastvalid(walker.X, walker.Y))
                    {
                        move_success = walker.move_east(m_maze_to_solve);
                    }
                    else
                    {
                        //turn around
                        move_success = walker.move_north(m_maze_to_solve);
                    }

                    if (!move_success)
                    {
                        return(null);
                    }
                    else
                    {
                        walker = turncorner(walker, walker.Dir);
                    }
                }
                else if (walker.Dir == Direction.East)
                {
                    bool move_success = false;
                    if (is_eastvalid(walker.X, walker.Y))
                    {
                        move_success = walker.move_east(m_maze_to_solve);
                    }
                    else if (is_southvalid(walker.X, walker.Y))
                    {
                        move_success = walker.move_south(m_maze_to_solve);
                    }
                    else if (is_northvalid(walker.X, walker.Y))
                    {
                        move_success = walker.move_north(m_maze_to_solve);
                    }
                    else
                    {
                        //turn around
                        move_success = walker.move_west(m_maze_to_solve);
                    }

                    if (!move_success)
                    {
                        return(null);
                    }
                    else
                    {
                        walker = turncorner(walker, walker.Dir);
                    }
                }
                else if (walker.Dir == Direction.West)
                {
                    bool move_success = false;
                    if (is_westvalid(walker.X, walker.Y))
                    {
                        move_success = walker.move_west(m_maze_to_solve);
                    }
                    else if (is_northvalid(walker.X, walker.Y))
                    {
                        move_success = walker.move_north(m_maze_to_solve);
                    }
                    else if (is_southvalid(walker.X, walker.Y))
                    {
                        move_success = walker.move_south(m_maze_to_solve);
                    }
                    else
                    {
                        //turn around
                        move_success = walker.move_east(m_maze_to_solve);
                    }

                    if (!move_success)
                    {
                        return(null);
                    }
                    else
                    {
                        walker = turncorner(walker, walker.Dir);
                    }
                }
                else
                {
                    //this should never be executed, but in case something goes wrong here, we will arbitrarily place the walker into a direction
                    walker.Dir = Direction.North;
                }

                MazeParser.color(m_maze_to_solve, walker);

                pathFound = is_finish(walker);

                MazeParser.color(m_maze_to_solve, walker);
            }//end while

            //MazeParser.output_parse(m_maze_to_solve); //for debugging

            return(m_maze_to_solve);
        }