2014-04-09 101 views
1

我在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; 
    } 
+0

這意味着您的算法無法按預期工作。 –

+0

第一次打電話時,「diskNumber」的值是多少? –

+0

問題到底是什麼?你不知道爲什麼它拋出堆棧溢出異常,或者你想知道如何重新安排程序以避免它或其他? – Chris

回答

2

這可能發生,如果diskCounter小於1。我真的不明白的邏輯,因爲你收到的參數,你方法(diskNumber)在第一行覆蓋。

我認爲這是你的問題的原因。作爲一個建議:請檢查輸入的參數與預期範圍內,像這樣:

Debug.Assert(diskCounter > 0, "Disk counter should be more than 0"); 

現在,當你把這個在你的方法調試你的時候,你會看到第一行收到警告信息,告訴你意想不到的事情發生。

+0

感謝您的幫助,但我找不到Debug.Assert。對不起,我只是這個領域的新手。我得到的這個錯誤的詳細信息是「無法評估表達式,因爲當前線程處於堆棧溢出狀態」 – user3471140

+0

您應該在cs文件的頂部添加'using System.Diagnostics;'。 –

+0

解決此問題的運氣如何?需要更多幫助? –