【发布时间】:2017-05-03 21:18:47
【问题描述】:
所以,我已经完成了用 C++ 完成国际象棋游戏的任务。但是,我遇到了一个小问题,我想请教一下。
情况:
我的 PAWN、KING、KNIGHT 移动验证工作完美。但; 移动棋子(例如白色 ROOK)时,它遵循大多数规则。例如,它只会垂直或水平移动,它不会通过另一个白色棋子,它不会替换一个白色棋子,最后它会替换一个黑色(对面)棋子。
问题是当它移动经过另一个黑色块时,它允许通过以替换经过它的块。假设我们在 x=2,y=6 处有一个白色块,在 x=2,y=4 处有一个黑色块,在 x=2,y=3 处有另一个黑色块。白棋将被允许移动到 x=2,y=3,这是不允许的。希望获得有关如何解决此问题的一些意见。当前代码如下。
bool Rook:: canMove(int startx, int starty, int endx, int endy)
{
int i;
if(board[endx][endy] !=NULL && board[endx][endy]->color==color)
return false;
if (startx == ends) //Collision Detection...
{
// Horizontal move
if (starty < endy)
{
// Move down
for (i = starty + 1; i <= endy; ++i)
if (board[startx][i] != NULL && board[startx][i]->color==color)
return false;
}
else
{
// Move up
for (i = starty - 1; i >= endy; --i)
if (board[startx][i] != NULL && board[startx][i]->color==color) //cant allow passing of non color piece
return false;
}
}
else if (starty == endy)
{
// Vertical move
if (startx < endx)
{
// Move right
for (i = startx + 1; i <= endx; ++i)
if (board[i][starty] != NULL && board[i][starty]->color==color)
return false;
}
else
{
// Move left
for (i = startx - 1; i >= endx; --i)
if (board[i][starty] != NULL && board[i][starty]->color==color)
return false;
}
}
else
{
// Not a valid rook move (neither horizontal nor vertical)
return false;
}
return true;
}
【问题讨论】:
-
调试器。使用调试器执行每条语句,并识别变量中的值。
-
我不太清楚如何调试这个,我认为我的问题是无法想到一个不允许这样的时刻的限制
-
调试器是解决此类问题的正确工具。 在询问 Stack Overflow 之前,您应该逐行逐行检查您的代码。如需更多帮助,请阅读How to debug small programs (by Eric Lippert)。至少,您应该 [编辑] 您的问题,以包含一个重现您的问题的 Minimal, Complete, and Verifiable 示例,以及您在调试器中所做的观察。