国际象棋验证移动输入需要

时间:2016-12-18 19:40:03

标签: c++ chess

所以,我完成了用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;
}

1 个答案:

答案 0 :(得分:0)

你的函数引用了类中的很多成员变量,例如结束,颜色,板,这是不好的,并使功能难以在单位级别测试 你能独立测试这个功能吗?不,你不能。

但看起来你的循环不应该破坏(当他们找到一个有效的举动时?) 如果函数允许移动到(2,3)以及(2,4),那么它循环过去(2,4)到(2,3)

另外,只使用数组和整数来索引电路板并不是很好。 我本来期望一个更高级别的板级和可能是一个坐标类,所以你可以轻松地迭代和索引板。