/// <summary> /// Clears previous stored solutions /// </summary> public void ClearSolutions() { SolutionPath = null; if (MouseAlgSolutionProcedure != null) { MouseAlgSolutionProcedure.Clear(); } if (FluidAlgSolutionProcedure != null) { FluidAlgSolutionProcedure.Clear(); } }
/// <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); }