我正在使用 Ncurses 库用 C 语言编写游戏跳棋程序,并且我将所有棋子存储在矩阵、g.board 中,并且在寻找可能的移动时,我需要确保程序不会尝试访问由于分割错误,元素位于矩阵之外。我有一个解决方案,但感觉相当粗糙,我感觉有一种更优雅的方法可以做到这一点,但我找不到或想到它。
int x
和int y
引用该矩阵中的 x 和 y 位置,我想在该矩阵中寻找可能的移动。 char ck
只是告诉我,如果这件作品是一种颜色的国王,那么正常的颜色只能向一个方向移动。 g.board[y][x].possible
只是结构中的 bool 变量告诉我这是否是可能的移动。
void checkPossible(int y, int x, char ck);
{
bool left = false, right = false, top = false, bottem = false;
// Dertimes if a tile is out of bounds
if (y != 0)
{
top = true;
}
if (y != 8)
{
bottem = true;
}
if (x != 0)
}
left = true;
}
if (x != 8)
{
right = true;
{
// Sets g.board.possible to true if possible move
if ((top == true && left == true) && (ck == 'k' || ck == 'w'))
{
g.board[y - 1][x - 1].possible = true;
}
if ((top == true && right == true) && (ck == 'k' || ck == 'w'))
{
g.board[y - 1][x + 1].possible = true;
}
if ((bottem == true && left == true) && (ck == 'k' || ck == 'r'))
{
g.board[y + 1][x - 1].possible = true;
}
if ((bottem == true && right == true) && (ck == 'k' || ck == 'r'))
{
g.board[y + 1][x + 1].possible = true;
}
}
据我所知它有效,我没有对其进行太多测试,但感觉很粗糙。 对于任何错误或不太理想的编码,我深表歉意,我对此很陌生。
最佳答案
有一件事看起来很可疑。 g.board[y - 1][x - 1].possible == true
应该是 g.board[y - 1][x - 1].possible = true
>。当前代码不执行任何操作。
代码也非常复杂。看看这个:
void checkPossible(int y, int x, char ck);
{
bool left = x != 0,
right = x != 8,
top = y !=8,
bottem = y!=0;
// Sets g.board.possible to true if possible move
if(ck == 'k' || ck == 'w') {
g.board[y - 1][x - 1].possible = (top && left);
g.board[y - 1][x + 1].possible = (top && right);
g.board[y + 1][x - 1].possible = (bottem && left);
g.board[y + 1][x + 1].possible = (bottem && right);
}
}
一般情况下,不要将 bool 变量与 bool 常量 true 和 false 或其他值进行比较。直接按原样使用它们,并为它们指定描述性名称。
另外,我会(可能是因为我还没有看到代码的其余部分)对坐标和字符进行分开检查。在单个函数中放置的功能越少,它就越容易理解、维护和命名。像这样:
bool isValidCoordinate(int y, int x) {
return y>=0 && y<=8 && x>=0 && x<=8;
}
bool isValidCharacter(char ck) {
return ck == 'k' || ck == 'w';
}
我不知道这是否适合您的项目,但它提供了您如何做到这一点的想法。
关于c - 有没有更好的方法来确保矩阵之外的元素不被访问?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55946497/