所以,我完成了用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;
}
答案 0 :(得分:0)
你的函数引用了类中的很多成员变量,例如结束,颜色,板,这是不好的,并使功能难以在单位级别测试 你能独立测试这个功能吗?不,你不能。
但看起来你的循环不应该破坏(当他们找到一个有效的举动时?) 如果函数允许移动到(2,3)以及(2,4),那么它循环过去(2,4)到(2,3)
另外,只使用数组和整数来索引电路板并不是很好。 我本来期望一个更高级别的板级和可能是一个坐标类,所以你可以轻松地迭代和索引板。