Exemplo n.º 1
0
 /// <summary>
 /// Clears previous stored solutions
 /// </summary>
 public void ClearSolutions()
 {
     SolutionPath = null;
     if (MouseAlgSolutionProcedure != null)
     {
         MouseAlgSolutionProcedure.Clear();
     }
     if (FluidAlgSolutionProcedure != null)
     {
         FluidAlgSolutionProcedure.Clear();
     }
 }
Exemplo n.º 2
0
        /// <summary>
        /// Solves the maze using mouse solving algorithm and reports success
        /// </summary>
        /// <param name="moveRandomly"></param>
        /// <returns></returns>
        public bool SolveUsingMouseAlg(bool moveRandomly)
        {
            bool solved = false;

            SolutionPath = null;
            if (MouseAlgSolutionProcedure == null)
            {
                MouseAlgSolutionProcedure = new List <ElementPosition>();
            }
            MouseAlgSolutionProcedure.Clear();

            // Stack solve process
            Stack <ElementPosition> solutionStack = new Stack <ElementPosition>();

            getElement(StartPos).Status = ElementStatus.MARKED;
            solutionStack.Push(StartPos);
            MouseAlgSolutionProcedure.Add(StartPos);

            // Choose direction by random
            if (moveRandomly)
            {
                while (getElement(FinishPos).Status != ElementStatus.MARKED && solutionStack.Count != 0)
                {
                    // Construct solution procedure
                    if (solutionStack.Peek() != MouseAlgSolutionProcedure[MouseAlgSolutionProcedure.Count - 1])
                    {
                        MouseAlgSolutionProcedure.Add(solutionStack.Peek());
                    }
                    // Check for neighbors
                    if (!hasEmptyNeighbor(solutionStack.Peek()))
                    {
                        solutionStack.Pop();
                    }
                    else
                    {
                        byte rand  = (byte)rnd.Next(0, emptyNeighborsCount(solutionStack.Peek()));
                        byte index = 0;
                        if (isRightNeghborEmpty(solutionStack.Peek()))
                        {
                            if (rand == index)
                            {
                                Element t = getElement(solutionStack.Peek().Row, (byte)(solutionStack.Peek().Col + 1));
                                t.Status = ElementStatus.MARKED;
                                solutionStack.Push(t.Position);
                                continue;
                            }
                            else
                            {
                                index++;
                            }
                        }
                        if (isBottomNeghborEmpty(solutionStack.Peek()))
                        {
                            if (rand == index)
                            {
                                Element t = getElement((byte)(solutionStack.Peek().Row + 1), solutionStack.Peek().Col);
                                t.Status = ElementStatus.MARKED;
                                solutionStack.Push(t.Position);
                                continue;
                            }
                            else
                            {
                                index++;
                            }
                        }
                        if (isLeftNeghborEmpty(solutionStack.Peek()))
                        {
                            if (rand == index)
                            {
                                Element t = getElement(solutionStack.Peek().Row, (byte)(solutionStack.Peek().Col - 1));
                                t.Status = ElementStatus.MARKED;
                                solutionStack.Push(t.Position);
                                continue;
                            }
                            else
                            {
                                index++;
                            }
                        }
                        if (isTopNeghborEmpty(solutionStack.Peek()))
                        {
                            Element t = getElement((byte)(solutionStack.Peek().Row - 1), solutionStack.Peek().Col);
                            t.Status = ElementStatus.MARKED;
                            solutionStack.Push(t.Position);
                        }
                    }
                }
            }
            // Choose directions in order of "right, bottom, left, top"
            else
            {
                while (getElement(FinishPos).Status != ElementStatus.MARKED && solutionStack.Count != 0)
                {
                    // Construct solution procedure
                    if (solutionStack.Peek() != MouseAlgSolutionProcedure[MouseAlgSolutionProcedure.Count - 1])
                    {
                        MouseAlgSolutionProcedure.Add(solutionStack.Peek());
                    }
                    // Check for neighbors
                    if (isRightNeghborEmpty(solutionStack.Peek()))
                    {
                        Element t = getElement(solutionStack.Peek().Row, (byte)(solutionStack.Peek().Col + 1));
                        t.Status = ElementStatus.MARKED;
                        solutionStack.Push(t.Position);
                    }
                    else if (isBottomNeghborEmpty(solutionStack.Peek()))
                    {
                        Element t = getElement((byte)(solutionStack.Peek().Row + 1), solutionStack.Peek().Col);
                        t.Status = ElementStatus.MARKED;
                        solutionStack.Push(t.Position);
                    }
                    else if (isLeftNeghborEmpty(solutionStack.Peek()))
                    {
                        Element t = getElement(solutionStack.Peek().Row, (byte)(solutionStack.Peek().Col - 1));
                        t.Status = ElementStatus.MARKED;
                        solutionStack.Push(t.Position);
                    }
                    else if (isTopNeghborEmpty(solutionStack.Peek()))
                    {
                        Element t = getElement((byte)(solutionStack.Peek().Row - 1), solutionStack.Peek().Col);
                        t.Status = ElementStatus.MARKED;
                        solutionStack.Push(t.Position);
                    }
                    else
                    {
                        solutionStack.Pop();
                    }
                }
            }

            if (getElement(FinishPos).Status == ElementStatus.MARKED)
            {
                solved = true;
                MouseAlgSolutionProcedure.Add(FinishPos);
                SolutionPath = new ElementPosition[((ushort)solutionStack.Count)];
                SolutionPath = solutionStack.ToArray();
                Array.Reverse(SolutionPath);
            }
            // Restore elements status
            restoreMazeElementsStatus();

            return(solved);
        }