CPW-Engine attacks
Home * Engines * CPW-Engine * Attacks
This page holds the functions responsible for detecting if a given square is attacked by a given player.
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; }