我最近开始用c ++编写一个大学项目的国际象棋引擎,但我的典当运动功能有问题。我知道典当应该向前移动一个方格或者在对角线上攻击一个方格。好吧,我的功能允许pawn攻击空格,我不知道为什么。我的棋盘分为两部分:一部分记住一件作品属于哪一部分,一部分具有该作品的名称(如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;
}
答案 0 :(得分: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
职位添加支票!
答案 1 :(得分:1)
插入
break;
case ' ':
块末尾的语句。否则,如果table[move_finish_i][move_finish_j]==' '
也会执行默认块,这解释了为什么pawn可以对角移动到空白方块。
此外,不需要大小写和默认值后的花括号。将case和default语句看作跳转标签,代码从第一个匹配的情况开始执行,直到你使用break语句离开switch() {...}
块(不管是否有更多的'跳转标签')。