2017-01-02 275 views
-5

我的代碼隨機生成字符'L'到二維數組中,但我需要程序來檢查是否已經沒有'L',如果它存在,程序應該經過生成過程再次。但是出現了這個問題,因爲出現了Stackoverflowexception。有沒有人有想法如何改變我的代碼,或者如何增加堆棧大小? (我不得不提到,我已經嘗試使用Project Properties增加堆棧大小,但是我沒有Linker選項,而且我也是編程新手,所以我不知道如何使用editbin或命令) 。提前致謝。增加堆棧大小c#

編輯:

public void Generate() 
      { 
       Fill(); 
       Fleet(); 
      } 

    public void Fleet() 
     { 
      Ship2(Utility.R(1,9),Utility.R(1,9),Utility.R(4)); 
      Ship3(Utility.R(1,9),Utility.R(1,9),Utility.R(4)); 
      Ship3(Utility.R(1,9),Utility.R(1,9),Utility.R(4)); 
      Ship4(Utility.R(1,9),Utility.R(1,9),Utility.R(4)); 
      Ship5(Utility.R(1,9),Utility.R(1,9),Utility.R(4)); 
     } 

public void Ship2(int x, int y, int r) 
     { 
      if (r == 0) 
      { 
       CreateShip(x, y); 
       CreateShip(x, (y + 1)); 
      } 

      if (r == 1) 
      { 
       CreateShip(x, y); 
       CreateShip(x, (y + -1)); 
      } 
      if (r == 2) 
      { 
       CreateShip(x, y); 
       CreateShip((x-1), (y)); 
      } 
      if (r == 3) 
      { 
       CreateShip(x, y); 
       CreateShip((x+1), (y)); 
      } 
     } 

public void CreateShip(int x, int y) 
     { 
      if (x <= 9 && y <= 9 && x >= 0 && y >= 0) 
      { 
       if (Board[x, y] == 'L') 
       { 
        Generate(); 
       } 
       else 
       { 
        Board[x, y] = 'L'; 
       } 
      } 
      else 
      { 
       Generate(); 
      } 

     } 

這是代碼的重要組成部分。

+1

*有誰知道如何更改我的代碼*您需要先發布您的代碼。 –

+2

向我們展示您的代碼會很有幫助。我不認爲增加堆棧大小會有所幫助。我很肯定你有一些有錯誤的最終條件遞歸。這是這種例外最常見的原因。該算法顯示爲 –

+0

。那麼有人可能有一個想法如何改變它 –

回答

-1

你可以做的是:如果創建失敗返回一個布爾,並從頭開始再試一次。

public void Generate() 
{ 
    Fill(); 
    while(!Fleet()) 
    { 
     // I assume Fill clears your board again?! 
     Fill(); 
    } 
} 

public bool Fleet() 
{ 
    return Ship2(Utility.R(1,9),Utility.R(1,9),Utility.R(4)) && 
      Ship3(Utility.R(1,9),Utility.R(1,9),Utility.R(4)) && 
      Ship3(Utility.R(1,9),Utility.R(1,9),Utility.R(4)) && 
      Ship4(Utility.R(1,9),Utility.R(1,9),Utility.R(4)) && 
      Ship5(Utility.R(1,9),Utility.R(1,9),Utility.R(4)); 
} 

public bool Ship2(int x, int y, int r) 
{ 
    if (r == 0) 
    { 
     return CreateShip(x, y) && 
       CreateShip(x, (y + 1)); 
    } 

    if (r == 1) 
    { 
     return CreateShip(x, y) && 
       CreateShip(x, (y + -1)); 
    } 

    if (r == 2) 
    { 
     return CreateShip(x, y) && 
       CreateShip((x-1), (y)); 
    } 

    if (r == 3) 
    { 
     return CreateShip(x, y) && 
       CreateShip((x+1), (y)); 
    } 

    return false; 
} 

public bool CreateShip(int x, int y) 
{ 
    if (x <= 9 && y <= 9 && x >= 0 && y >= 0) 
    { 
     if (Board[x, y] == 'L') 
     { 
      return false; 
     } 
     else 
     { 
      Board[x, y] = 'L'; 
     } 
    } 
    else 
    { 
     return false; 
    } 

    return true; 
} 

注意:如果CreateShip的輸入參數永不改變,這仍然不起作用。您現在不會看到任何異常,但Generate方法永遠不會結束。