我正在为我的课程制作战舰游戏,我在其中一个类中使用get函数遇到了一些问题。我的游戏的基本思想是创建一个2D 10X10阵列,称为网格,填充空指针来表示板。我创建了2个类,Board和Ship。网格数组是Ship类型,我使用算法随机填充数组。我使用Board类访问网格数组和命中数组(我用它来跟踪命中)。
但是我无法弄清楚getShips函数如何返回网格数组。命中数组只是布尔值,所以这很容易,但我对C ++的熟练程度不足以使getShips函数正确返回网格数组,这是一个Ship指针类型。我非常感谢任何帮助。
class Board
{
private:
Ship *grid[10][10];
bool hits[10][10];
public:
// get functions
Ship *getShips()
{
return grid;
}
bool getHits()
{
return hits;
}
};
我还想知道是否可以通过调用getShips
函数来操纵其他函数中的数组。类似的东西:
for (int x=0; x<10; x++)
{
for (int y=0; y<10; y++)
{
board.getShips()[x][y]=nullptr;
}
}
答案 0 :(得分:0)
确定。首先,我将修改getShips和getHits函数。有类似的东西:
Ship *getShips(int x, int y){ return grid[x+y*10]; }
bool getHits(int x, int y){return hits[x+y*10];}
这样您就可以简化代码并避免一些错误。 当您像使用
一样声明多维数组时Ship *grid[10][10];
bool hits[10][10];
你基本上是在指向指向船舶指针的指针。
如果您使用C ++编写,我会尝试使用最少量的指针。尝试使用stl容器代替。他们为您进行自动内存管理,这可以为您节省一些时间。
答案 1 :(得分:0)
我建议将您的界面更改为:
class Board
{
private:
Ship *grid[10][10];
bool hits[10][10];
public:
Ship* getShip(int x, int y) const { return grid[x][y]; }
Ship*& getShip(int x, int y) { return grid[x][y]; }
bool getHit(int x, int y) const { return hits[x][y]; }
bool& getHit(int x, int y) { return hits[x][y]; }
};
如果您确实想要返回grid
和hits
,建议您使用std::array<std::array<Ship*, 10>, 10> grid;
(需要C ++ 11)而不是Ship *grid[10][10];
。
如果无法使用C ++ 11,请转回std::vector
。
然后
private:
std::array<std::array<Ship*, 10>, 10> grid;
public:
const std::array<std::array<Ship*, 10>, 10>& getShips() const { return grid; }
std::array<std::array<Ship*, 10>, 10>& getShips() { return grid; }
答案 2 :(得分:0)
目前,看起来getShips正在返回Ship*
的整个10x10数组 - 您需要更改getShips
函数返回的内容:
Ship*** getShips() { ...
但是,我建议不要混合使用指针和数组。指针可能很棘手,与数组结合可能很难调试。相反,您可以使用所有指针:Ship ***grid;
并使用new初始化(我将初始化作为练习,但这是一个有示例的网站:http://pleasemakeanote.blogspot.com/2010/07/2d-arrays-in-c-using-new.html)。
实际上,Ship
类可能更好地存储它存在的索引,可能是这样的:
class Ship
{
public:
<<member func>>
private:
int nspaces_;
int start_[2];
int end_[2];
}
存储起始索引和找到发货的最终索引的位置。您需要处理代码以识别它们之间的空间,但这是微不足道的。此设置允许您将Ship *grid[10][10]
替换为Ship
s。
getShips
函数将成为:
...
Ship ships_[<<number of ships>>];
Ship *getShips()
{
return ships_;
}
...
将被使用:
board.getShips()[x][y]
或者......您可以添加getShip(int x, int y)
方法。