/// <summary> /// Recursive Method to solve Towers of Hanoi /// </summary> /// <param name="n">Disk to move</param> /// <param name="startPeg">Peg to take disk from</param> /// <param name="endPeg">Peg to move disk to</param> /// <param name="tempPeg">auxiliary peg</param> private void solveTowers(int n, char startPeg, char endPeg, char tempPeg) { if (n > 0) { solveTowers(n - 1, startPeg, tempPeg, endPeg); Disks currentDisk = _TowerDisks.Find(x => x.DiskNo == n); currentDisk.peg = endPeg; //Animate animate.moveUp(currentDisk.box, 50); if (startPeg < endPeg)//Move Right { animate.moveRight(currentDisk.box, getDiskX(currentDisk)); } else //move Left { animate.moveLeft(currentDisk.box, getDiskX(currentDisk)); } animate.moveDown(currentDisk.box, getDiskY(currentDisk)); //Format line string line = string.Format("Move disk {0} from {1} to {2}", n, startPeg, endPeg); Console.WriteLine(line); moves.Add(line); solveTowers(n - 1, tempPeg, endPeg, startPeg); } }
/// <summary> /// Get Disk Y position /// </summary> /// <param name="disk">Disk to check</param> /// <returns>Y Position for Disk</returns> private int getDiskY(Disks disk) { int Y = 0; int stackNo = _TowerDisks.Count(x => x.peg == disk.peg); Y = panel1.Height - baseHeight - (diskHeight * stackNo); return(Y); }
/// <summary> /// Get X position for Disk /// </summary> /// <param name="disk">Disk to check</param> /// <returns>X position for Disk</returns> private int getDiskX(Disks disk) { int X = 0; int Peg = 0; switch (disk.peg) { case 'A': Peg = 1; break; case 'B': Peg = 2; break; case 'C': Peg = 3; break; } X = ((panel1.Width / 4) * Peg) - (int)(disk.width / 2); return(X); }
private Color colorSelector(Disks disk) { switch (disk.DiskNo) { case 1: return(Color.Red); case 2: return(Color.OrangeRed); case 3: return(Color.Yellow); case 4: return(Color.Green); case 5: return(Color.Blue); case 6: return(Color.Purple); case 7: return(Color.LightBlue); default: return(Color.Black); } }