我在wpf做河內塔。我希望它有一個關於如何用給定數量的磁盤解決難題的動畫。但是當我點擊該按鈕解決它給出了一個錯誤河內塔動畫
「類型‘System.StackOverflowException’發生在TowerOfHanoi.exe未處理的異常的」繼承人的代碼:
private void SolveTower(int diskNumber, Needle origin, Needle tempDest, Needle destination)
{
diskNumber = diskCounter;
if (diskNumber == 1)
{
bgWorker.ReportProgress(0, new Solution(origin, destination)); // move this disk from needle1 to needle3
System.Threading.Thread.Sleep(100);
}
else
{
SolveTower(diskNumber - 1, origin, tempDest, destination); // move n-1 disks from needle1 to needle2
bgWorker.ReportProgress(0, new Solution(origin, destination)); // move the last disk from needle1 to needle3
System.Threading.Thread.Sleep(100);
SolveTower(diskNumber - 1, tempDest, destination, origin); // move n-1 disks from needle2 to needle3
}
}
diskCounter是磁盤的數量面板/針具有。我只是不知道如何重新排列它。
下面是在面板/針添加磁盤代碼:
private void btnAdd_Click(object sender, RoutedEventArgs e)
{
Rectangle disk = new Rectangle();
disk.Height = 25;
disk.Stroke = Brushes.BlueViolet;
disk.RadiusX = 7;
disk.RadiusY = 7;
RadialGradientBrush rgBrush = new RadialGradientBrush();
GradientStopCollection gsc = new GradientStopCollection();
gsc.Add(new GradientStop(Colors.AliceBlue, 0));
gsc.Add(new GradientStop(Colors.BlueViolet, 1));
rgBrush.GradientStops = gsc;
rgBrush.GradientOrigin = new Point(0.1, 0.9);
rgBrush.RadiusX = 1;
rgBrush.RadiusY = 1;
disk.Fill = rgBrush;
disk.MouseLeftButtonDown += disk_MouseLeftButtonDown;
if (needle1.Children.Count < 10)
{
needle1.AddDisk(disk);
btnSolve.IsEnabled = true;
btnStart.IsEnabled = true;
}
else
{
MessageBox.Show("Maximum of 10 disks only");
}
diskCounter = needle1.Children.Count;
}
這意味着您的算法無法按預期工作。 –
第一次打電話時,「diskNumber」的值是多少? –
問題到底是什麼?你不知道爲什麼它拋出堆棧溢出異常,或者你想知道如何重新安排程序以避免它或其他? – Chris