Home * Engines * CPW-Engine * Attacks
This page holds the functions responsible for detecting if a given square is attacked by a given player.
Contents
isAttacked
#include "stdafx.h"
#include "0x88_math.h"
int isAttacked(char byColor, S8 sq) {
/* pawns */
if (byColor == WHITE) {
if (IS_SQ(sq + SE) &&
isPiece(WHITE, PAWN, sq + SE)
)
return 1;
if (IS_SQ(sq + SW) &&
isPiece(WHITE, PAWN, sq + SW)
)
return 1;
}
else {
if (IS_SQ(sq + NE) &&
isPiece(BLACK, PAWN, sq + NE)
)
return 1;
if (IS_SQ(sq + NW) &&
isPiece(BLACK, PAWN, sq + NW)
)
return 1;
}
/* knights */
if (leaperAttack(byColor, sq, KNIGHT))
return 1;
/* kings */
if (leaperAttack(byColor, sq, KING))
return 1;
/* straight line sliders */
if (straightAttack(byColor, sq, NORTH) ||
straightAttack(byColor, sq, SOUTH) ||
straightAttack(byColor, sq, EAST) ||
straightAttack(byColor, sq, WEST)
)
return 1;
/* diagonal sliders */
if (diagAttack(byColor, sq, NE) ||
diagAttack(byColor, sq, SE) ||
diagAttack(byColor, sq, NW) ||
diagAttack(byColor, sq, SW)
)
return 1;
return 0;
}
leaperAttack
int leaperAttack(char byColor, S8 sq, char byPiece) {
S8 nextSq;
for (int dir = 0; dir < 8; dir++) {
nextSq = sq + vector[byPiece][dir];
if (IS_SQ(nextSq) &&
isPiece(byColor, byPiece, nextSq)
)
return 1;
}
return 0;
}
straightAttack
int straightAttack(char byColor, S8 sq, int vect) {
int nextSq = sq + vect;
while (IS_SQ(nextSq)) {
if (b.color[nextSq] != COLOR_EMPTY) {
if ((b.color[nextSq] == byColor) &&
(b.pieces[nextSq] == ROOK || b.pieces[nextSq] == QUEEN)
)
return 1;
return 0;
}
nextSq = nextSq + vect;
}
return 0;
}
diagAttack
int diagAttack(int byColor, S8 sq, int vect) {
int nextSq = sq + vect;
while (IS_SQ(nextSq)) {
if (b.color[nextSq] != COLOR_EMPTY) {
if ((b.color[nextSq] == byColor) &&
(b.pieces[nextSq] == BISHOP || b.pieces[nextSq] == QUEEN)
)
return 1;
return 0;
}
nextSq = nextSq + vect;
}
return 0;
}