gpt4 book ai didi

c++ - 自动 vector 边界检查而不会使我的程序崩溃

转载 作者:行者123 更新时间:2023-11-30 05:18:32 25 4
gpt4 key购买 nike

我正在创建一个有效的国际象棋游戏

我的国际象棋引擎有一个棋盘。棋盘是一个二维棋盘[Y][X],里面是棋子。 Pieces 是枚举,它代表黑色、白色和 NONE。

class ChessBoard
{
vector<vector<Piece>> board(); //I made it 8*8 in the constructor
enum Piece{NONE, white pieces, black pieces etc..}
}

我的问题是验证棋盘内是否有正方形。请让我详细说明。例如,当查看 A2 兵的可能移动时,兵可以向上移动 1 2 或从左到右捕获,或者从左到右移动:

(X,Y+1), (X,Y+2), (X+1,Y+1), (X-1,Y+1), (X+1,Y+2), (X-1,Y-2)

但是,如您所知,X-1 会导致棋子出界。

是的,我可以实现一个简单的 bool isSquareValid() 函数。但这意味着,无论我试图访问或设置 board[][],我都需要调用此函数。

有没有一种实现 Board[][] 的方法,这样当我尝试访问超出绑定(bind)的索引时,它会抛出一条错误消息或其他内容而不会使我的程序崩溃?

谢谢

最佳答案

你混淆了两个不同的问题。

首先是如何确保游戏防止棋子落在棋盘外。这不是错误处理;你必须确保这件作品从一开始就不会在那里结束。换句话说,您必须将程序逻辑限制为有效的移动甚至在将选择呈现给用户(或就此而言向 AI 组件)之前。如果您喜欢捕获从 at 抛出的异常然后将板恢复到有效状态的想法,请就此打住,不要那样做。这将是最好的异常滥用。

第二个是如何处理代码中的错误导致的错误。您可能已经编写了代码来防止游戏将棋子放在棋盘之外,但您可能犯了一个错误,因为我们都这样做,所以您最终会得到非法的 vector 索引。在这种情况下,operator[] 导致的崩溃实际上是一件好事,因为立即终止错误程序通常是发生在您身上的最好的事情。另一种方法是“以某种方式继续”并继续使用损坏的数据和破坏的游戏规则,甚至可能没有足够快地注意到错误。

因为不能保证错误的 operator[] 调用会导致崩溃,并且强制运行时库执行检查可能有点麻烦(错误的 operator[] index 当然是正式的未定义行为),你可能想添加一些你自己的 assert 语句并确保 NDEBUG 不会阻止它们完成它们的工作.

如果将 std::vector 包装在您自己的类中,这会变得相当容易。当您使用它时,您可以使用 operator() 简化元素访问:

class Board
{
public:
Piece& operator()(int x, int y)
{
assert(x >= 0);
assert(x < 16);
assert(y >= 0);
assert(y < 16);
return data[y][x];
}

Piece operator()(int x, int y) const
{
assert(x >= 0);
assert(x < 16);
assert(y >= 0);
assert(y < 16);
return data[y][x];
}

Board()
{
for (int row_index = 0; row_index < 16; ++row_index)
{
data.emplace_back(16, Piece::None);
}
}

private:
std::vector<std::vector<Piece>> data;
};

另请注意,std::vector 对于棋盘而言是一个糟糕的选择,因为棋盘不会缩小或增大。考虑改用 std::array

关于c++ - 自动 vector 边界检查而不会使我的程序崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41657944/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com