2017-01-02 232 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方法永远不会结束。