2011-06-06 135 views
4

下面是我的战舰游戏代码。我不断收到以下错误:调试C# - 堆栈溢出异常?

Process terminated due to StackOverflowException. .

它一直指向

char[,] Grid = new char[10, 10]; 

如何这个问题能解决?

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

namespace BattleShip_Jamshid_Berdimuratov 
{ 
class BattleshipBoard 
{ 
    Player p = new Player(); 
    public void Randomize() 
    { 
     p.SetGrid(1, 2); 
     p.SetGrid(2, 2); 
     p.SetGrid(3, 2); 
    } 

    public void DisplayBoard(char[,] Board) 
    { 
     int Row; 
     int Column; 

     Console.WriteLine(" ¦ 0 1 2 3 4 5 6 7 8 9"); 
     Console.WriteLine("--+--------------------"); 
     for (Row = 0; Row <= 9; Row++) 
     { 
      Console.Write((Row).ToString() + " ¦ "); 
      for (Column = 0; Column <= 9; Column++) 
      { 
       Console.Write(Board[Column, Row] + " "); 
      } 
      Console.WriteLine(); 
     } 

     Console.WriteLine("\n"); 
    } 
} 

class Player 
{ 
    char[,] Grid = new char[10, 10]; 
    public int HitCount = 0; 
    public int MissCount = 0; 
    int x = 0; 
    int y = 0; 
    BattleshipBoard b = new BattleshipBoard(); 

    public int getHitCount() 
    { 
     return HitCount; 
    } 
    public int getMissCount() 
    { 
     return MissCount; 
    } 
    public void AskCoordinates() 
    { 
     Console.WriteLine("Enter X"); 
     string line = Console.ReadLine(); 
     int value; 
     if (int.TryParse(line, out value)) 
     { 
      x = value; 
     } 
     else 
     { 
      Console.WriteLine("Not an integer!"); 
     } 

     Console.WriteLine("Enter Y"); 
     line = Console.ReadLine(); 
     if (int.TryParse(line, out value)) 
     { 
      y = value; 
     } 
     else 
     { 
      Console.WriteLine("Not an integer!"); 
     } 

     try 
     { 
      if (Grid[x, y].Equals('S')) 
      { 
       Grid[x, y] = 'H'; 
       Console.Clear(); 
       Console.WriteLine("Hit!"); 
       HitCount += 1; 
      } 
      else 
      { 
       Grid[x, y] = 'M'; 
       Console.Clear(); 
       Console.WriteLine("Miss!"); 
      } 
     } 
     catch 
     { 
      Console.Clear(); 
      Console.WriteLine("Error: Please enter numbers between 0 and 9. (Inclusive)"); 
     } 
    } 
    public char[,] GetGrid() 
    { 
     return Grid; 
    } 
    public void SetGrid(int x, int y) 
    { 
     Grid[x, y] = 'S'; 
    } 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     Console.Title = "BerdShip!"; 
     Console.WriteLine("Welcome to Berdship!\r\n\r\n"); 
     Console.WriteLine("What is your name?"); 
     string name = System.Console.ReadLine(); 
     Console.WriteLine(); 
     BattleshipBoard b = new BattleshipBoard(); 
     Player p = new Player(); 
     b.Randomize(); 
     while (p.getHitCount() < 12) 
     { 
      b.DisplayBoard(p.GetGrid()); 
      p.AskCoordinates(); 
     } 
     Console.WriteLine("Congratulations, " + name + "! You Win!"); 
     Console.WriteLine("Thanks for playing BerdShip. Press enter to quit."); 
    } 
} 

}

+3

+1 for StackOverflowException – Mehrdad 2011-06-06 01:48:55

+0

第一个问题:为什么Player类有一个板的副本? (以及固定大小)。创建一个单独的Board类... – 2011-06-06 01:52:53

+0

WOW感谢Mitch哈哈固定它 – 2011-06-06 01:56:17

回答

10

你BattleshipBoard对象施工期间creatse一个Player对象,并且您的播放器对象创建施工期间BattleshipBoard。这反复迭代,直到你溢出堆栈。

的号召:

BattleshipBoard b = new BattleshipBoard(); 

永远不会返回,并导致溢出。

1

堆栈溢出通常是由无限回忆造成的;即函数A调用B,然后B和A和A没有终止条件。

在你的情况下,它的两个类BattleshipBoardPlayer的初始值。

你的Player创建一个新的BattleshipBoardBattleshipBoard创建一个新的Player

BattleshipBoard中删除行Player p = new Player();并且全部都应该是好的。

0

BattleShipBoardPlayer具有BattleShipBoard具有Player具有BattleShipBoard具有[ ...永远持续下去...]

因此,你有一个堆栈溢出。

1

当您尝试创建初始BattleshipBoard时,会导致无限循环交替创建两种类型。

如果你想让这两个类有对其他相应类的引用,那么你可以让你的Player类在其构造函数中使用BattleshipBoard。