<分区>
我是 C 和一般编程的新手。我已经实现了 C 并且快完成了,但是看起来检查一 block 是否被攻击的函数是错误的。如果有人能看一眼并发现一些我看不到的东西,我将不胜感激:
int isAttacked(game_t* game, int x, int y, int color)
{
/*printf("entered IA");*/
int i, j,m, curX, curY, range;
int dx[] = { 0, 1, 0, -1 };
int dy[] = { 1, 0, -1, 0 };
char en = BLACK_N, eb = BLACK_B, er = BLACK_R, eq = BLACK_Q, ek = BLACK_K, ep = BLACK_P;
if (!color)
{
en = WHITE_N;
eb = WHITE_B;
er = WHITE_R;
eq = WHITE_Q;
ek = WHITE_K;
ep = WHITE_P;
}
for (i = -2; i <= 2; i++) /* KNIGHT ATTACKING */
for (j = -2; j <= 2; j++)
if (ABS(i) + ABS(j) == 3 && isValidCoords(x + i, y + j) && game->board[x + i][y + j] == en)
return 1;
for (i = -1; i <= 1; i += 2)
{
for (j = -1; j <= 1; j += 2)
{
curX = x;
curY = y;
range = 0;
while (isValidCoords(curX + i, curY + j) == 1)
{
range++;
curX += i;
curY += j;
if(game->board[curX][curY] != EMPTY)
break;
}
if (game->board[curX][curY] == eq) /*BISHOP OR QUEEN ATTACKING*/
return 1;
if(game->board[curX][curY] == eb)
{
return 1;
}
if (range == 1 && game->board[curX][curY] == ek) /*KING ATTACKING*/
return 1;
if (range == 1 && color && j == 1 && game->board[curX][curY] == ep)
{
return 1;
}
if (range == 1 && !color && j == -1 && game->board[curX][curY] == ep)
{
return 1;
}
}
}
for (m = 0; m<4; m++)
{
curX = x;
curY = y;
range = 0;
while (isValidCoords(curX + dx[m], curY + dy[m]))
{
curX += dx[m];
curY += dy[m];
range++;
if(game->board[curX][curY] != EMPTY)
break;
}
if (game->board[curX][curY] == eq)
return 1;
if(game->board[curX][curY] == er) /*ROOK OR QUEEN ATTACKING*/
{
/*printf("x %d y %d\n",x,y);*/
return 1;
}
if (range == 1 && game->board[curX][curY] == ek)
return 1;
}
return 0;
}
非常转,我有一个 Action 列表。只有在移动完成后,玩家的国王没有受到攻击,即 isAttacked 返回 0,才能将移动添加到该列表中。为了检查玩家的国王是否受到攻击,我收到了国王的坐标 (i,j)[这些是从 0 到 7 的数字] 和颜色 [0 或 1]。然后我检查棋盘内是否有敌方骑士 (ek)(isValidCoords 检查 0<=x,y<=7)可以攻击国王。然后我去对角线检查是否有可以攻击国王的敌人棋子、主教、国王或王后。我对白嘴鸦的 Action 也这样做。后两个是错误的……我认为—— 检查未能检测到主教攻击国王的示例棋盘:
|-------------------------------|
8| R | N | B | | | B | N | R |
|-------------------------------|
7| P | P | P | | P | K | P | P |
|-------------------------------|
6| | | | Q | | | | |
|-------------------------------|
5| | | | | | | | |
|-------------------------------|
4| | | b | | P | | | |
|-------------------------------|
3| | | | | | | | |
|-------------------------------|
2| p | p | p | p | | p | p | p |
|-------------------------------|
1| r | n | b | | k | | n | r |
|-------------------------------|
黑色部分大写,白色部分小写。
颜色由黑色 - 0 和白色 - 1 表示。我在检测象/车检查时遇到问题,但我似乎无法查明错误。任何帮助都将不胜感激!