以下是我的战舰游戏代码。我一直收到以下错误:
由于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.");
}
}
}
答案 0 :(得分:10)
您的BattleshipBoard对象在构造期间创建一个Player对象,并且您的Player对象在构造期间创建BattleshipBoard。这会来回迭代,直到你溢出堆栈。
致电:
BattleshipBoard b = new BattleshipBoard();
永远不会返回并导致溢出。
答案 1 :(得分:1)
堆栈溢出通常是由无限重复引起的;即函数A调用B然后调用B,A和A没有终止条件。
在您的情况下,它是您的两个班级BattleshipBoard
和Player
的初始化。
您的Player
创建了一个新的BattleshipBoard
,BattleshipBoard
创建了一个新的Player
!
从Player p = new Player();
删除行BattleshipBoard
,一切都很好。
答案 2 :(得分:1)
当您尝试创建最初的BattleshipBoard时,会导致无限循环交替创建您的两种类型。
如果您希望这两个类具有对另一个对应类的引用,那么您可以让您的Player类在其构造函数中使用BattleshipBoard。
答案 3 :(得分:0)
您的BattleShipBoard
有一个Player
,BattleShipBoard
的{{1}} Player
BattleShipBoard
有一个[ ...永远地继续...... ]
因此,您有堆栈溢出。