【问题标题】:Chess Validation Move input wanted国际象棋验证移动输入需要
【发布时间】: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 示例,以及您在调试器中所做的观察。

标签: c++ chess


【解决方案1】:

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

但看起来你的循环没有在应该的时候打破(当他们找到一个有效的移动时?) 如果函数允许移动到 (2,3) 和 (2,4),那么它会循环过去 (2,4) 到 (2,3)

此外,仅使用数组和整数来索引板也不是很好。 我本来希望有一个更高级别的板类,也许还有一个坐标类,这样您就可以轻松地迭代和索引板。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-11
    • 1970-01-01
    • 1970-01-01
    • 2016-07-06
    • 2015-07-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多