棋子移动错误

Pawn movement error

本文关键字:错误 移动 棋子      更新时间:2023-10-16

我最近开始为一个大学项目开发 c++ 国际象棋引擎,但我的棋子移动函数遇到了问题。我知道棋子应该向前移动一个方格或攻击一个对角线的方格。好吧,我的函数允许棋子攻击空格,我不知道为什么。我的棋盘分为两块:一块记住棋子属于哪个玩家,另一块有棋子的名称(如q,Q,p,P...和空格)。一个提示将非常受欢迎。(对不起,我的英语水平很差)

代码如下所示:

bool move_P(int move_start_i, int move_start_j, int move_finish_i, int move_finish_j, char table[][9])
{
    switch (table[move_finish_i][move_finish_j])
    {
        case ' ':
        {
            if (move_start_i - 1 == move_finish_i) // move pawn
            {
                return true;
            }
        }
        default:
        {
            if (move_finish_i == move_start_i - 1 && move_finish_j == move_start_j - 1) // atack pawn ^<-
            {
                if (player[move_finish_i][move_finish_j] == player[move_start_i - 1][move_start_j - 1])
                {
                    return false;
                }
                else
                {
                    return true;
                }
            }
            else if (move_finish_i == move_start_i - 1 && move_finish_j == move_start_j + 1) // atack pawn ->^
            {
                if (player[move_finish_i][move_finish_j] == player[move_start_i - 1][move_start_j + 1])
                {
                    return false;
                }
                else
                {
                    return true;
                }
            }
        }
    }
    return false;
}

您的玩家检查错误,

player[move_finish_i][move_finish_j] == player[move_start_i - 1][move_start_j - 1]

必须是

player[move_finish_i][move_finish_j] == player[move_start_i][move_start_j]

你也应该使用

return player[move_finish_i][move_finish_j] != player[move_start_i][move_start_j];

主要问题是检查

move_start_i - 1 == move_finish_i

您必须为j位置添加支票!

插入一个

break; 

case ' ':块末尾的语句。否则,如果table[move_finish_i][move_finish_j]==' ',也会执行默认块,这就解释了为什么棋子可以对角移动到空白方块。

此外,不需要大小写和默认值后面的大括号。将 case 和默认语句视为跳转标签,代码从第一个匹配的大小写开始执行,直到您用 break 语句离开switch() {...}块(无论进一步的"跳转标签"如何)。