【发布时间】:2017-05-30 04:52:02
【问题描述】:
我正在创建一个有效的国际象棋游戏
我的国际象棋引擎有一个棋盘。棋盘是 2D 棋盘[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 pawn 的可能移动时,pawn 可以向上移动 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[][] 以便当我尝试访问超出范围的索引时,它会抛出错误消息或其他内容而不会导致我的程序崩溃?
谢谢
【问题讨论】:
-
没有办法实现
operator[][],除非同时使用两个operator[]。std::vector提供了一个at()成员函数来检查有效索引,但必须捕获异常以防止程序终止。请注意,vector<vector<Piece>> board(8*8)指定了一个包含 64 个vector<Piece>的vector,每个都没有元素。它不会创建任何形式的 8x8 数组。 -
当然,在国际象棋中,棋子不能穿过其他棋子,即使目标方格在棋盘上。
-
是的,我知道,我写了一些伪代码只是为了显示板是 8*8... 无论如何,我真的不想做 if(isValidSquare(x,y)) 每次我尝试查看或访问板.... 有没有聪明的方法来做到这一点?我想也许可以把它做成一个外层为 10*10 的板,因为 ERROR 可能会有所帮助。
-
这部分很容易检查,我只在 board[y][x] == NONE 或者它可以捕获的情况下移动棋子。
-
只需使用向量的
at()而不是[]语法编写代码(例如,一次移动),就好像数组索引是正确的一样。然后将其包装在 try/catch 块中。如果任何索引无效,则会抛出异常。