【问题标题】:Pawn movement error棋子移动错误
【发布时间】:2016-02-03 14:54:03
【问题描述】:

我最近开始为一个大学项目使用 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;
}

【问题讨论】:

  • move_start_i - 1 == move_finish_i -1+1 不取决于颜色吗?
  • 哦忘了说我有一个功能可以反转(倒置)桌子,所以动作总是向上
  • 你也可以考虑添加en passant Capture,如果他在他的起始行列,可以移动两个方格。
  • 感谢@AntiHeadshot,但目前我正在努力使其简单且有效。将来我会考虑添加更复杂的规则,也许还有一个界面。

标签: c++


【解决方案1】:

您的玩家检查错误,

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 位置添加支票!

【讨论】:

  • @aalin 我更新了答案,你错过了更多,如果他想移动对角线并且它是空的,你使用第一个 checkt
【解决方案2】:

插入一个

break; 

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

另外,case 和 default 后面的大括号也不需要。将 case 和 default 语句视为跳转标签,代码从第一个匹配的 case 开始执行,直到您使用 break 语句离开 switch() {...} 块(不管进一步的“跳转标签”)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-16
    • 2020-12-06
    • 1970-01-01
    相关资源
    最近更新 更多