It returns:
* 4 - rook side wins
* 2 - draw
* 0 - pawn side wins
* 999 unknown
I have translated it to english, but the comments.
If anyone wants to use it, change this:
int rook_color = color_of_the_rook;
wk = position_of_the_king_that_has_rook;
bk = position_of_the_other_king;
t = position_of_the_rook;
p = position_of_the_pawn;
and provide some arrays/functions: king_attacks, pawn_attacks, rook_attacks, knight_attacks that return a bitboard.
The function generalizes as if white was the one with the rook, and also that the pawn is in the queenside.
I have not validated it after the translation from catalan, so maybe there is some minor syntax error.
Code: Select all
int eval_KRKP_llarg(...) {
int bk, wk, t, p, c, x;
int rook_color = color_of_the_rook;
wk = position_of_the_king_that_has_rook;
bk = position_of_the_other_king;
t = position_of_the_rook;
p = position_of_the_pawn;
c = who_moves;
if (rook_color == black) {
//passar a com si fossin white
wk = (7 - ROW(wk)) * 8 + COL(wk);
bk = (7 - ROW(bk)) * 8 + COL(bk);
t = (7 - ROW(t)) * 8 + COL(t);
p = (7 - ROW(p)) * 8 + COL(p);
c = opponent(c);
}
if (COL(p) > 3) {
wk = wk ^ 7; // Mirror a1 -> h1
bk = bk ^ 7;
t = t ^ 7;
p = p ^ 7;
}
Bitboard atwk = king_attacks[wk];
Bitboard atbk = king_attacks[bk];
Bitboard atp = pawn_attacks[black][p];
Bitboard btw = Bit(t);
Bitboard bbk = Bit(bk);
Bitboard bwk = Bit(wk);
Bitboard bbp = Bit(p);
Bitboard whitepieces = btw | bwk;
Bitboard rattacks = rook_attacks(t, (Bitboard)(bwk | bbk | bbp));
Bitboard atwhite = rattacks | atwk;
Bitboard atblack = atbk | atp;
Bitboard allpieces = whitepieces | bbk | bbp;
bool bkingincheck = (atwhite & bbk);
if (c == black && (atbk & atwhite) == atbk && !(atp & btw)) {
//mat
if ((atwhite & bbk)
&& !(ROW(bk) == ROW(t) && ROW(p) == ROW(bk) + 1) //que no es pugui tapar de l'escac amb el peó
)
return 4;
else //rei negre ofegat, i peó bloquejat
if (!(atwhite & bbk) && (whitepieces & Bit(p - 8)))
return 2;
}
//cas concret d'ofegat
if (bk == 0 && wk == 2 && t == 9 && p == 11)
return 2;
//torre captura peó negre no defensat
if ((c == white || (Distance(bk, p) - (ROW(p) == 6) > 3 && !(atbk & btw) && !(ROW(p) == 1)))
&& (rattacks & bbp) && !(atbk & bbp)) {
return 999;
}
//rei captura peó negre no defensat
if (c == white && (atwk & bbp) && !(atbk & bbp)) {
return 999;
}
//rei negre pot capturar torre
if ((atbk & btw) && !(atwk & btw)) {
if (c == black)
//mirar resultat final kpk
return 999;
//peo fa escac i rei no pot defensar torre ni torre pot menjar peó
if ((atp & bwk) && Distance(wk, t) > 1 && !(rattacks & bbp))
//mirar resultat final kpk
return 999;
}
//peo negre pot capturar torre
if (c == black && (atp & btw)) {
//mirar resultat final kpk
return 999;
}
//per fila: torre clava peó o fa escac amenaçant peó i el menjarà
if (ROW(p) != 1 && ROW(p) == ROW(t) && ROW(t) == ROW(bk) && Distance(bk, p) - (c == black) > 1 && ROW(wk) != ROW(bk)) {
return 4;
}
//peo clavat i se'l menjaran
if (ROW(t) == ROW(bk) && ROW(p) == ROW(bk)){
if (Distance(bk, p) - (c == black) > 1) {
if ((bk == 8 && wk == 2) || (bk == 15 && wk == 5)) {
if (bk == 8 && t == 9)
return 4;
else {
if (bk == 15 && t == 14)
return 4;
}
if (bk == 15 && p == 11 && t != 12)
return 4;
if (Distance(t, p) > 1 && COL(t) != COL(wk))
return 4; //podrà parar el peó anant a 1a amb la torre
//if (own == 999)
return 2; //taules perquè s'autoofegarà
}
else {
//si rei entre mig de torre i rei negre, no se sap
if (ROW(wk) != ROW(bk)) //mirar excepcions quan rei entre mig però guanya
return 4;
}
}
else {
if (Distance(wk, p) == 1 && ROW(t) != ROW(wk)) {
if (Distance(bk, 0) == 1 && p == 9 && c == black)
return 2; //rei s'ofega a a1
else
return 4;
}
}
}
//casos especials rei negre en un extrem i rei blanc a c3
if (p == 9 && (bk == 8 || bk == 0 || bk == 1) && wk == 18 && ROW(t) > 1 && !(atwhite & bbk)
&& (c == black || COL(t) != 1)
) {
if (ROW(t) == 2 && t != 17 && c == black) {
if (t == 16 || bk == 1)
return 2;
else
return 0;
}
else {
if (t == 17 && bk == 1)
return 4;
else {
if ((ROW(t) > 2 || COL(t) == 0) && c == white)
return 4;
else {
if (bk == 1) {
if (c == white)
return 4;
else {
if (COL(t) == 0 || COL(t) == 3)
return 2;
else
return 4;
}
}
else
return 2;
}
}
}
}
//peó parat i sel menjarà
if ((atwhite & Bit(p - 8)) && Distance(bk, p) - (c == black) > 2 && ROW(p) != 6) {
if (bk == 0 && c == black && wk == 2 && t == 9 && p == 19)
return 2; //cas especial ofegat
else {
if (bk == 0 && wk == 16 && t == 9 && (p == 25 || (p == 33 && c == black)))
return 2; //cas especial ofegat
else {
if (bk == 7 && c == black && wk == 5 && ROW(t) == 1 && ROW(p) == 2 && COL(t) == COL(wk) && COL(p) < 3)
return 2; //cas especial ofegat
else {
if (bk == 56 && wk == 40 && p == 9 && c == black)
return 2; //cas especial ofegat
else
return 4;
}
}
}
}
//cas especial
if (bk == 0 && wk == 2 && p == 9) {
if (ROW(t) == 0 || COL(t) == 1)
return 4;
else {
if (ROW(t) == 1 || COL(t) == 2 || COL(t) == 4 || ROW(t) > 2)
return 2; //ofegat o ha de donar torre per dama
else
return 0;
}
}
//cas especial
if (bk == 0 && wk == 2 && p == 9 + 8 && ((c == black && ROW(t) == 1) || (c == white && t == 10))) {
return 2;
}
//ofegat o mat
if (c == black && bk + 8 == p && !(atbk & ~(atwhite | Bit(p)))) {
if (atwhite & Bit(bk))
return 4; //mat
else
return 2;
}
//tisores rei i torre
if ((atp & bwk) && (atp & Bit(t)) && (atbk & Bit(p)))
return 2;
//tisores rei i torre
if (c == black && (pawn_attacks[black][p - 8] & bwk) && (pawn_attacks[black][p - 8] & Bit(t)) && (atbk & Bit(p - 8)) &&
!(atwhite & bbk))
return 2;
//tisores rei i torre
if (c == black && ROW(p) == 6 && (pawn_attacks[black][p - 16] & bwk) && (pawn_attacks[black][p - 16] & Bit(t)) && (atbk & Bit(p - 16)) &&
!(atwhite & bbk)) {
if (bk + 8 == p)
return 4; //rein bloqueja peó
else
return 2;
}
//rei ha parat peó
if (ROW(p) > ROW(wk)) {
if (COL(wk) == COL(p) ||
((COL(wk) - (c == white) == COL(p) || COL(wk) + (c == white) == COL(p))
&& ((atwk & Columnes[COL(p)]) & ~atblack)) //hi ha alguna casella no atacada pel negre davant del peo on pugui anar el rei blanc
) {
if (c == black && COL(bk) == 0 && wk + 16 == bk && bk + 8 == p && COL(t) == 1)
return 2; //ofegat
else
return 4;
}
else {
//rei pararà peó
if (ROW(bk) - (c == black) > ROW(wk)
&& ((atwk & Columnes[COL(p)]) & ~atblack) //hi ha alguna casella no atacada pel negre davant del peo on pugui anar el rei blanc
&& ROW(bk) != 2
)
return 4;
}
}
//ofegat o coronarà
if ((p == 8 || (p == 16 && c == black) || (p == 19 && c == black)) && bk == 0 && wk == 2 && COL(t) < 2) {
if (p == 19) {
if (t == 9)
return 2;
else
return 4;
}
else {
if (p == 16 && t == 1)
return 4; //fent escac
else
return 2;
}
}
//cas especial taules ofegat
if ((p == 17 || p == 25) && (bk == 0 || bk == 1) && wk == 16 && t == 9)
return 2;
//peo coronant i rein no en escac
bool coronaambescac = (!!((PrecalculTorre[p - 8] | PrecalculAlfil[p - 8]) & bwk)) && bk != p - 8 && t != p - 8;
if (c == black && ROW(p) == 1 && !bkingincheck) {
if (wk == p - 8)
return 4; //reib bloquejant peo
else {
if (atwk & (Bit(p - 8))) { //reib atacant avanç p
if (!(atbk & (Bit(p - 8)))) {
if (atbk & btw) {
if (rattacks & Bit(bk))
return 4;
else {
if ((rattacks & Bit(p - 8)) || (COL(t) == COL(p) && COL(t) != COL(wk)))
return 4; //torre para coronació
else
return 2; //rei negre menjarà torre doncs quedarà sense defensar en desviar el reib amb coronació
}
}
else {
if (bk == 0 && p == 10 && ROW(t) == 1)
return 2; //reib a c1 ofegarà amb torre a 2a
else
return 4;
}
}
else {
if (COL(t) == COL(p))
return 4; //rei i torre evitant coronació
}
}
}
if (coronaambescac) {
if (Distance(wk, p - 8) == 1 && !(rattacks & Bit(p - 8)))
return 0;
else {
if ((COL(t) < COL(p) && COL(wk) > COL(p)) || (COL(t) > COL(p) && COL(wk) < COL(p))) {
//no pot tapar de torre
if ((ROW(t) == 1 || ROW(t) == 0) && ROW(bk) == 1) {
//peo clavat o torre controlant coronació
if (Distance(wk, p - 8) == 1)
return 4; //controla coronació amb torre i rei
else {
if ((rattacks & Bit(p - 8)) && Distance(wk, p - 8) == 2) {
if (Distance(bk, p - 8) == 1)
return 2;
else
return 4; //arriba a controlar coronació amb rei i ja la controla amb torre
}
else
return 2;
}
}
else {
if (t == 0 && c == black && p == 10 && (Distance(bk, p) < Distance(wk, p) || (ROW(wk) == 0 && ROW(bk) == 3 && COL(bk) == COL(p) + 1)))
return 2; //cas especial torre no pot guanyar un temps
else {
if ((rattacks & Bit(p - 8))) {
if (Distance(bk, p - 8) - (c == black) == 1) {
if (atbk & (~atwk) & (FILA2 ^ Bit(p))) {
if ((COL(wk) < COL(p) && COL(bk) < COL(p)) || (COL(wk) > COL(p) && COL(bk) > COL(p)))
return 2; //rein pot anar a 2a
else {
if (Distance(t, p - 8) == 2)
return 2; //al baixa amb el rei toca la torre guanyant un temps
else {
if (Distance(wk, p - 8) > 2)
return 2; //reib no arriba a temps d'ajudar la torre a parar el peó
else
return 4; //si que arriba a temps
}
}
}
else {
return 4;
}
}
else {
if ((t == 0 || t == 1) && c == black && (p == 10 || p == 11) && (bk == 21 || bk == 22) && COL(wk) > COL(bk))
return 2; //reib massa lluny
else {
if (t == 0 && c == black && p == 10 && (bk == 25 || bk == 26) && COL(wk) >= 4 && wk != 20)
return 2; //cas especial
else {
if (COL(wk) == 7 && COL(t) < COL(bk) && ROW(bk) < 4)
return 2; //rein arriba a suportar peo
else {
if (c == black && Distance(bk, p + 8) == 1 && Distance(wk, p - 8) > 2 && Distance(t, p - 8) == 2)
return 2; //rein arriba pq guanya un temps sobre torre
else {
if (ROW(wk) >= ROW(bk) && Distance(bk, p) < Distance(t, p)
&& ((COL(wk) > COL(bk) && COL(bk) >= COL(p)) || (COL(wk) < COL(bk) && COL(bk) <= COL(p))))
return 2;
/*else
return 4;*/
}
}
}
}
}
}
}
//return 0;
}
}
else {
if (ROW(bk) == 0) {
if (ROW(wk) == 0 && Distance(wk, t) < 3 && ROW(t) == 0)
return 2;
else {
if (ROW(wk) == 0 && COL(t) == COL(wk) - 1) {
if (Distance(p, bk) > 2) {
if (COL(bk) < COL(p))
return 2; //bo
/*else
return 4; //rein no pot defensar coronació*/
}
/*else
return 2;*/
}
}
}
}
}
}
}
//cas especial
if (bk == 0 && p == 9 && wk == 16) {
if (bkingincheck) {
if (ROW(t) == 0)
return 2;
else
return 4;
}
else {
if (c == black) {
if (COL(t) == 1)
return 2;
else
return 0;
}
else {
if (c == white && COL(t) == 0)
return 4;
else
return 2;
}
}
}
//torre parant peó per columna davant peo
if (COL(t) == COL(p) && ROW(t) < ROW(p)) {
//cas especial taules
if (ROW(p) == 1 && t == p - 8 && (bk == p + 8 || bk == p + 9) && wk == t + 2) {
if (COL(p) < 3 && ((bk == p + 9 && c == white) || (bk == p + 8 && c == black)))
return 2;
else
return 4;
}
else {
if (Distance(wk, t) < 2)
return 4;
else {
if (Distance(wk, t) - (c == white) < Distance(bk, t) - (c == black))
return 4;
else {
if (Distance(bk, p) - (c == black) > 1 || Distance(t, p) < Distance(bk, p) - (c == black)) {
if (!(c == black && ROW(p) == 6 && ROW(bk) == 3))
return 4;
}
}
}
}
}
//rei ajudarà coronació peo amb torre parant peó per columna
if (ROW(p) == 1 && COL(t) == COL(p)) {
//if (c == white && Distance(wk, p - 8) < 2)
if (c == white && (atwk & Bit(p + 1)) && !(atbk & Bit(p + 1)) && !(atbk & Bit(t)))
return 4;
else {
if (c == white && COL(p) != 0 && (atwk & Bit(p - 1)) && !(atbk & Bit(p - 1)) && !(atbk & Bit(t)))
return 4;
else
/*if (Distance(bk, p - 8) - (c == black) < 2)
own = 2*/;
}
}
//torre tallant accés del rein al peó
if (ROW(p) > 2 && ROW(bk) > 4 && ROW(t) > ROW(p) && ROW(t) < ROW(bk)
&& !(ROW(wk) == ROW(t) && (COL(t) > COL(wk) && COL(wk) > COL(p))) //que reib no estigui tallant "tall" de torre
)
return 4;
//torre tallant accés del rein al peó per sota
if (ROW(p) > 2 && ROW(bk) + (c == black) < ROW(t) - 1 && ROW(t) < ROW(p) && ROW(t) > ROW(bk) + 1 && ROW(p) != 6
&& !(ROW(wk) == ROW(t) && (COL(t) > COL(wk) && COL(wk) > COL(p))) //que reib no estigui tallant "tall" de torre
)
return 4;
//torre tallant accés del rein al peó per sota
if (COL(bk) < COL(t) && COL(t) <= COL(p) && ROW(t) < ROW(p)) {
if (Distance(bk, t) > 2 && Distance(bk, p) - (c == black) > 2 - (c == black && COL(t) == COL(bk) + 1 && COL(t) < COL(p) - 1)) {
return 4;
}
else {
if (Distance(wk, t) == 1)
return 4;
else {
if (Distance(bk, p) - (c == black) > 2) {
if (c == black && (wk == 48 || wk == 56) && bk == 17) {
if (t == 34 && p == 51)
return 4;
else
return 2;
}
else
return 4;
}
else {
if (ROW(p) > ROW(wk) && bk == wk - 16) {
if (p == 50 && wk == 40)
; // own == 2;
else {
if (p == 51 && wk == 41)
; //own == 2;
else
return 4;
}
}
}
}
}
}
//reib impedeix rein a arribar al peo
if (wk == bk + 16 && ROW(p) > ROW(wk)) {
if (bk == 24 && p == 50 && (t == 9 || (c == black && t == 19)))
return 2;
else {
if (bk == 25 && p == 51 && (t == 10 || (c == black && t == 20)))
return 2;
else {
if (bk == 27 && p == 49 && (t == 10 || t == 16) && c == black)
return 2;
else {
if (bk == 28 && p == 50 && (t == 11 || t == 17) && c == black)
return 2;
else {
if (bk == 29 && p == 51 && (t == 12 || t == 18) && c == black)
return 2;
else
return 4;
}
}
}
}
}
//reib impedeix rein a arribar al peo
if (ROW(bk) < ROW(wk) - 2 && ROW(p) > ROW(wk) &&
((COL(p) > COL(wk) && COL(bk) <= COL(wk)) || (COL(p) < COL(wk) && COL(bk) >= COL(wk)))
) {
return 4;
}
//torre tallant accés del rein al peó per sota
if (COL(bk) > COL(t) && COL(t) >= COL(p) && ROW(t) < ROW(p) && ROW(p) > 1 && !(ROW(p) == 6 && Distance(bk, p - 16) - (c == black) < 2)) {
if (Distance(bk, t) > 2 && Distance(bk, p) - (c == black) > 2 - (c == black && COL(t) == COL(bk) - 1 && COL(t) > COL(p) - 1)) {
return 4;
}
else {
if (Distance(wk, t) == 1 && (ROW(p) > 2 || Distance(wk, p) < Distance(t, p)))
return 4;
}
}
//torre podrà tallar accés rei a peo o guanyar peo
if (c == white && (rattacks & Bit(ROW(t) * 8 + COL(p)))
&& !(atbk & Bit(ROW(t) * 8 + COL(p)))
&& ROW(t) < ROW(p) && ROW(p) > 1 && !(ROW(p) == 6 && Distance(bk, p - 16) - (c == black) < 2)) {
if (Distance(bk, t) > 2 && Distance(bk, p) > 2) {
return 4;
}
}
//torre pot menjar peó
if (abs(COL(p) - COL(bk)) > 3 - (c == white && COL(wk) != COL(p)) && ROW(p) - (c == black) > 1
&& !(ROW(wk) == ROW(t) && (COL(t) > COL(wk) && COL(wk) > COL(p)))) //que reib no estigui tallant "tall" de torre
return 4;
//cas especial ofegat
if (wk == 40 && (bk == 57 || bk == 56) && t == 49 && (p == 9 || (p == 17 && c == black && bk == 56)))
return 2;
//cas especial ofegat
if (wk == 5 && bk == 7 && ROW(t) == 1 && ROW(p) == 1) {
if (c == black)
return 0;
else {
if (abs(COL(t) - COL(p)) == 1) {
if (p == 11) {
if (t == 12)
return 2;
else
return 4;
}
else
return 2;
}
else {
if (COL(t) == COL(wk)) {
if (p == 11)
return 4;
else
return 2;
}
else
return 4;
}
}
}
//torre fent escac i guanya peó
if (bkingincheck && (rattacks & Bit(p)) &&
(Distance(bk, p) > 2 || (Distance(wk, t) < 3) && Distance(wk, p) < 3 && ROW(wk) <= ROW(p))) {
//excepcio taules
if (wk == 0 && t == 8 && (bk == 16 || bk == 24) && p == 10)
return 2;
else {
if ((wk == 0 || wk == 8) && t == 9 && (bk == 17 || bk == 25) && p == 10)
return 2; //excepcio taules
else {
if (wk < 2 && t == 9 && (bk == 17 || bk == 25) && p == 11)
return 2; //excepcio taules
else {
if (wk == 2 && t == 9 && (bk == 17 || bk == 25) && p == 8)
return 2; //excepcio taules
else {
if ((wk == 1 || wk == 9) && t == 10 && (bk == 18 || bk == 26) && p == 11)
return 2; //excepcio taules
else {
if (wk == 2 && t == 10 && (bk == 18 || bk == 26) && p == 8)
return 2; //excepcio taules
else {
if ((wk == 3 || wk == 11) && t == 10 && (bk == 18 || bk == 26) && p == 9)
return 2; //excepcio taules
else {
if (wk == 3 && t == 11 && (bk == 19 || bk == 27) && p == 9)
return 2; //excepcio taules
else {
if ((wk == 4 || wk == 12) && t == 11 && (bk == 19 || bk == 27) && p == 10)
return 2; //excepcio taules
else {
if (wk == 4 && t == 12 && (bk == 20 || bk == 28) && p == 10)
return 2; //excepcio taules
else {
if ((wk == 5 || wk == 13) && t == 12 && (bk == 20 || bk == 28) && p == 11)
return 2; //excepcio taules
else {
if (wk == 5 && t == 13 && (bk == 21 || bk == 29) && p == 11)
return 2; //excepcio taules
else
return 4;
}
}
}
}
}
}
}
}
}
}
}
}
//peo corona
if (Entre[p - 8][wk] & Bit(bk))
coronaambescac = false;
if (ROW(p) == 1 && !(atwhite & Bit(p - 8))) {
if (c == black) {
if (bk != p - 8) {
if (ROW(bk) == 0 && (rattacks & FILA1 & atwk)) {
if (COL(t) - COL(wk) > 2) {
if (COL(bk) > COL(p))
return 2;
else
return 0;
}
else {
if (ROW(wk) == 0) {
if (ROW(t) == 0) {
if (COL(bk) > COL(t))
return 4;
else
return 2;
}
}
else {
if (abs(COL(p) - COL(bk)) < 3)
return 2;
else {
if (COL(bk) > COL(p)) {
if (ROW(t) == 0 && abs(COL(p) - COL(bk)) == 3)
return 2;
/*else {
if (ROW(t) == 1) {
if (ROW(wk) == 1) {
if (COL(t) < COL(wk))
return 4;
}
}
}*/
}
/* else
return 2;*/
}
}
}
}
else {
if (!bkingincheck && coronaambescac) {
if (COL(t) != COL(p)) {
if (ROW(p) == ROW(bk) && ROW(bk) == ROW(t))
return 2;
else
return 0;
}
}
}
}
}
}
//torre guanya peo
if ((rattacks & Bit(p)))
{
if (Distance(bk, p) + (c == white) > 3 - !(Distance(bk, p - 8) == 2)
&& (ROW(p) > 1 || c == white) && (ROW(p) != 6 || Distance(bk, p) + (c == white) > 4))
return 4;
}
//cas especial, fa mat quan negre corona
if (bk == 0 && p == 16 && ROW(t) == 1 && Distance(wk, p) - (c == white) - (wk == 19) < 2 + (ROW(wk) != 0 && ROW(wk) < 4))
return 4;
//cas especial, fa mat quan negre corona
if (bk == 16 && p == 17 && COL(t) == 1 &&
(wk == 33 || (Distance(wk, 9) - (c == white) + (COL(wk) == 0 || (Distance(bk, t) == 1 && Distance(wk, t) > 1)) < 3))
&& ROW(t) > ROW(p))
return 4;
//alguns casos coronació
if (!bkingincheck && ROW(p) == 2 && c == black && Distance(wk, COL(p)) > 2 && COL(t) == COL(wk) && abs(ROW(t) - ROW(bk)) == 1 && abs(COL(bk) - COL(p)) <= 1
&& ROW(bk) >= ROW(p)
) {
if (bk == 17 && ROW(t) > 2 && (wk == 12 || wk == 13 || wk == 14 || wk == 15 || (wk >= 20 && ROW(t) > ROW(wk))))
return 0; //no pot parar el peó
else {
if (bk == 18 && ROW(t) > 2 && (wk == 8 || wk == 13 || wk == 14 || wk == 15 || (wk >= 21 && ROW(t) > ROW(wk))))
return 0;
else {
if (bk == 19 && ROW(t) > 2 && (wk == 13 || wk == 14 || wk == 15 || (wk >= 22 && ROW(t) > ROW(wk))))
return 0;
else {
if (bk == 20 && ROW(t) > 2 && (wk == 8 || wk == 14 || wk == 15 || wk == 16 || (wk >= 23 && ROW(t) > ROW(wk))))
return 0;
/*else
return 2;*/
}
}
}
}
//menja peo
if ((atwk & Bit(p)) && (rattacks & Bit(p)) && (bk == p + 8 || bk == p - 8 || c == white)) {
if (bk == 0 && p == 9) {
if (COL(t) == 1)
return 4; //farà mate
else
return 2;
}
else {
if (bk == 1 && p == 9 && c == black && COL(t) != 0)
return 2; //ofegarà
else
return 4;
}
}
if (c == black && ss->tau.c[p - 8] != CasellaBuida && !(atbk & (~(atwhite | Bit(p))))) {
return 4; //mat o guanya
}
else {
if (p == 8 && bk == 0 && wk == 2 /*&& (COL(t) == 1 || ROW(t) == 1 || COL(t) == 0)*/) {
if (c == white && ROW(t) == 0)
return 4; //mat
else
return 2; //ofegat o taules
}
else {
if (p == 16 && bk == 0 && wk == 2 /*&& (ROW(t) == 1 || COL(t) == 1 || COL(t) == 0) && c == black*/) {
if (ROW(t) == 0 || c == white)
return 4;
else
return 2;
}
}
}
//rei surt de casella 0 i vol coronar
if (bk == 0 && p == 8) {
if (c == black) {
if (ROW(t) == 2 &&
((!(atwk & (Bit(18) | Bit(17) | Bit(10)))) || (wk == 27))
) { //si reib no defensa casella on torre pugui fer escac, negre corona i guanya
if (COL(t) == 0 || (COL(t) != 2 && COL(t) != COL(wk)))
return 2; //txp o escac i txp
else {
if (ROW(wk) != 1 && COL(t) > 2)
return 2;
else
return 0;
}
}
else {
if (wk == 16 || wk == 17 || wk == 18) {
if (wk == 18 && (COL(t) == 0 || (COL(t) == 2 && ROW(t) > 2)))
return 2;
else
return 4; //farà mat
}
else {
if (COL(t) > 2 && (wk == 24 || wk == 25 || (wk == 26 && ROW(t) == 1)))
return 4;
else {
if (COL(wk) >= 2)
return 2;
else {
if (COL(t) == 2 && ROW(t) > 3 && wk == t - 1)
return 0;
else
return 2;
}
}
}
}
}
else { //c == white
//if (Distance(wk, p) < 3) //4248065
if (((t == 9 || t == 17) && (wk == t + 1 || wk == 10)) || (ROW(wk) == 0 && t == 9))
return 2;
else {
if (COL(wk) > 3 || ROW(wk) > 4)
return 2;
else {
if ((Distance(wk, 10) < 2 && ROW(t) == 0) || (wk == 10))
return 4; //mat
else {
if ((COL(t) > 2 || t == 10) && Distance(wk, 18) < 2)
return 4;
else {
if (wk == 16 || wk == 17 || wk == 18)
return 4;
else {
if (Distance(wk, 17) < 2 && (t != 17 || (ROW(wk) > 1 && wk != 26)))
return 4;
else {
if (ROW(wk) == 4 && Distance(wk, 17) < 3 && ROW(t) == 1 && t > 10)
return 4;
//return 2;
}
}
}
}
}
}
}
}
//cas especial taules
if (p == 17 && wk == 0 && t == 16 && Distance(bk, 10) - (c == black) < 1) {
if ((bk == 2 || bk == 10) && c == black)
return 0;
else
return 2;
}
//cas especial taules
if (p == 16 && c == black) {
if (bk == 24 || bk == 26) {
if (wk == 2 && t == 1)
return 2;
else {
if (wk == 18 && t == 17)
return 2;
}
}
else {
if (bk == 32 && t == 25 && wk == 18)
return 2;
else {
if (bk == 33 && t == 26 && wk == 18)
return 2;
}
}
}
//cas especial taules
if (p == 8 && t == 1 && bk == 24 && wk == 2) {
return 2;
}
//casos especials
if (ROW(p) == 1 && (atp & Bit(t)) && Distance(bk, p + 8) < 2) {
if ((atbk & Bit(p - 8)) && abs(wk - bk) != 2 && (bk == 8 || (wk != bk + 10 && wk != bk + 6)))
return 2;
else {
if (atwk & Bit(p + 8)) {
if (ROW(wk) == 2 || ROW(wk) == 1 || ROW(wk) == ROW(bk)) {
return 4;
}
else
return 2;
}
else {
if (Distance(wk, p + 1) < 2 && (Distance(bk, p + 9) > 1 || (atwk & Bit(p + 9))))
return 4;
else {
//return 2;
}
}
}
}
if (ROW(bk) >= ROW(p) && ROW(p) > 1) {
struct InfoEval ie;
ie.rei[white] = lsb(bwk);
ie.rei[black] = lsb(bbk);
int antmou = ss->estat_actual->mou;
ss->estat_actual->mou = c;
int kpk = -eval_KPK(ss, &ie, black);
ss->estat_actual->mou = antmou;
if (kpk == 0) {
return 4;
}
}
//rei ha parat peó
if (ROW(p) > ROW(wk) - (c == white) && ROW(bk) >= ROW(p) && Distance(wk, p) - (c == white) < Distance(bk, p) && ROW(p) - (c == black) >= 2)
return 4;
//cas especial
if (COL(bk) == 0 && COL(p) == 0 && ROW(p) > 2 - (c == black) && (wk == 2 || wk == 10)) {
if (p == 16 && t == 17 && wk == 10 & bk == 0 && c == black)
return 2;
else
return 4;
}
//rei parant peo
if (COL(wk) == COL(p) + 1 && c == white && ROW(wk) < ROW(p)) {
if (ROW(p) == 1 && p == wk + 7) {
if (ROW(t) == 0)
return 4;
else {
if (COL(t) == COL(wk) || COL(t) == COL(wk) + 2) {
if (ROW(bk) == 0)
return 2; //clavarà dama amb torre
else {
if (COL(bk) == 0) {
if (ROW(t) > ROW(bk) + 2)
return 2; //fent escac canvia dama per torre
else
return 0;
}
else
return 0;
}
}
else {
if (ROW(bk) == 0 && COL(bk) - COL(t) > 1)
return 2; //farà escac per primera canviant dama x torre
else {
if (COL(bk) == 0) {
if (ROW(t) > ROW(bk) + 2)
return 2; //fent escac canvia dama per torre
else
return 0;
}
else
return 0;
}
}
}
}
else {
if (bk == 8 && (t == 18 || t == 2) && p == 17)
return 2;
else {
if (bk == 9 && (t == 16 || t == 19) && p == 18)
return 2;
else {
if (bk == 10 && (t == 17 || t == 20) & p == 19)
return 2;
else
return 4;
}
}
}
}
//rei parant peo
if (COL(wk) == COL(p) - 1 && c == white && ROW(wk) < ROW(p)) {
if (ROW(p) == 1 && p == wk + 9) {
if (ROW(t) == 0)
return 4;
else {
if (COL(wk) == 0)
return 0;
else {
if (COL(t) == COL(wk) || COL(t) == COL(wk) - 2) {
if (ROW(bk) == 0)
return 2; //clavarà dama amb torre
else {
return 0;
}
}
else {
if (ROW(bk) == 0 && COL(t) - COL(bk) > 1)
return 2; //farà escac per primera canviant dama x torre
else {
return 0;
}
}
}
}
}
else {
if (bk == 10 && t == 19 && p == 17)
return 2;
else {
if (bk == 11 && (t == 17 || t == 20) && p == 18)
return 2;
else {
if (bk == 12 && (t == 18 || t == 21) & p == 19)
return 2;
else
return 4;
}
}
}
}
//rei i torre podran parar peo
if (c == black && COL(wk) == COL(p) + 1 && ROW(p) > ROW(wk) + 1) {
if (ROW(p) > ROW(wk) + 2 || ROW(p) > 2) {
if (t == 10 && p == 25 && bk == 0)
return 2;
else {
if (t == 2 && p == 25 && bk == 8)
return 2;
else
return 4;
}
}
else {
if (bk == 0 && p == 17 && t == 18)
return 2;
else {
if (ROW(t) == 1 || ROW(t) == 0 || COL(t) == COL(p) || (COL(t) == COL(bk) && ROW(t) > 2)
|| (COL(p) - COL(bk) >= 2 && (COL(t) > COL(p) + 1 || ROW(t) > ROW(p)))
|| (COL(bk) - COL(p) > 1)
)
return 4;
else {
if (ROW(bk) > 1) {
if (t == p + 1)
return 2;
else
return 4;
}
else
if (ROW(bk) == 0) {
if (COL(bk) + 1 == COL(p)) {
if (COL(t) == COL(bk) - 1)
return 0;
else {
if (COL(t) == COL(wk) + 1) {
if (ROW(t) == 2)
return 0;
else {
if (COL(bk) == 0)
return 2;
else
return 0;
}
}
else {
if (COL(t) == COL(wk) + 2 || COL(t) == COL(wk) || (ROW(t) > 2 && COL(bk) == 0) || COL(bk) - COL(t) > 1)
return 2;
else
return 0;
}
}
}
else {
if (bk == 0 && (t == 16 || t == 19))
return 2;
else {
if (bk == 1 && (t == 17 || t == 20))
return 2;
else
return 4;
}
}
}
else {
//ROW(bk) == 1
if (ROW(t) == 2) {
if (COL(bk) + 2 == COL(p))
return 2;
else
return 0;
}
else {
if (ROW(t) == 3)
return 0;
else {
if (COL(bk) == 0)
return 2;
else
return 0;
}
}
}
}
}
}
}
//rei i torre podran parar peo
if (c == black && COL(wk) == COL(p) - 1 && ROW(p) > ROW(wk) + 1) {
if (ROW(p) > ROW(wk) + 2 || ROW(p) > 2) {
return 4;
}
else {
if (ROW(t) == 1 || ROW(t) == 0 || COL(t) == COL(p) || (COL(t) == COL(bk) && ROW(t) > 2)
|| (COL(bk) - COL(p) >= 2 && (COL(t) < COL(p) - 1 || ROW(t) > ROW(p)))
|| (COL(p) - COL(bk) > 1)
)
return 4;
else {
if (ROW(bk) > 1) {
if (t == p - 1)
return 2;
else
return 4;
}
else
if (ROW(bk) == 0) {
if (COL(p) + 1 == COL(bk)) {
if (COL(t) == COL(bk) + 1)
return 0;
else {
if (COL(wk) == COL(t) + 1) {
if (ROW(t) == 2)
return 0;
else
return 0;
}
else {
if (COL(wk) == 0)
return 0;
else {
if (COL(wk) == COL(t) + 2 || COL(t) == COL(wk) || COL(t) - COL(bk) > 1)
return 2;
else
return 0;
}
}
}
}
else {
if (bk == 3 && t == 19)
return 2;
else {
if (bk == 4 && (t == 17 || t == 20))
return 2;
else {
if (bk == 5 && (t == 18 || t == 21))
return 2;
else
return 4;
}
}
}
}
else {
//ROW(bk) == 1
if (ROW(t) == 3) {
return 0;
}
else {
if (COL(p) + 1 < COL(bk)) {
if (t + 1 == p)
return 2;
else
return 4;
}
else
return 0;
}
}
}
}
}
//reib apropant-se al peó per parar-lo
if (ROW(p) > 3 && ROW(wk) < ROW(p) && Distance(wk, p) < ROW(p)) {
if (c == white)
return 4;
else {
if (Distance(wk, COL(p)) < ROW(p) - (ROW(p) == 6)) {
if (p == 35 && wk == 8 && bk == 10 && t == 0)
return 2;
else {
if (COL(p) > 0 && ROW(p) == 4 && bk == p - 23 && wk == bk + 2 && t == wk - 8)
return 2;
else {
if (COL(wk) == 0 && COL(p) == 3 && bk == 10) {
if (p == 35 && wk == 24 && (t == 4 || t == 5 || t == 6 || t == 7 || t == 20 || t == 21 || t == 22 || t == 23))
return 2;
else
return 4;
}
else {
if (ROW(bk) == 1 && COL(p) + 1 == COL(bk)) {
if (wk == bk + 18 && ROW(p) < 5 && COL(t) < COL(p) && (ROW(t) == 0 || ROW(t) == 2))
return 2;
else {
if (COL(wk) > COL(bk) + 2 && ROW(wk) > 3 && COL(t) < COL(p) && (ROW(t) == 0 || ROW(t) == 2))
return 2;
else
return 4;
}
}
else {
if (bk == 18 && wk == 24 && p == 35 && ((ROW(t) == 1 || ROW(t) == 3) && COL(t) > COL(p)))
return 2;
else {
if (bk == 18 && p == 33 && wk == 28 && t == 8)
return 2;
else {
if (!(COL(t) < COL(p) && (ROW(t) == 1 || ROW(t) == 3))) //torre mal posada
return 4;
else {
if ((p == 41 || p == 49) && bk == 18 && wk == 37)
return 2;
else {
if (p == 34 && wk == 29 && bk == 19)
return 2;
else {
if ((p == 42 || p == 50) && wk == 38 && bk == 19)
return 2;
else {
if (p == 35 && wk == 30 && bk == 20)
return 2;
else {
if ((p == 43 || p == 51) && wk == 39 && bk == 20)
return 2;
else
return 4;
}
}
}
}
}
}
}
}
}
}
}
}
}
}
//reib apropant-se al peó per parar-lo
if (ROW(p) > 3 && Distance(wk, COL(p)) - (c == white) - bkingincheck < 3)
return 4;
//reib apropant - se al peó per parar-lo
if (ROW(p) > 3 && ROW(wk) == 0 &&
((ROW(t) == 0 && ROW(p) > 4 && COL(wk) - (c == white) < 6)
|| (Distance(wk, COL(p)) - (c == white) - bkingincheck < 5)
)
) {
if (wk == 5 && p == 33 && ((bk == 18 && t == 8) || (bk == 10 && (t == 0 || t == 10 || t == 16)) || (bk == 0 && t == 10) || (bk == 8 && (t == 2 || t == 18))) && c == black)
return 2;
else {
if (wk == 4 && p == 32 && ((bk == 1 && t == 11) || (bk == 9 && (t == 3 || t == 19))) && c == black)
return 2;
else {
if (wk == 6 && p == 34 && ((bk == 19 && t == 9) || (bk == 17 && t == 11) || (bk == 11 && (t == 1 || t == 17)) || (bk == 1 && t == 11) || (bk == 9 && (t == 3 || t == 19))) && c == black)
return 2;
else {
if (wk == 7 && p == 35 && ((bk == 20 && t == 10) || (bk == 18 && t == 12) || (bk == 12 && (t == 2 || t == 18)) || (bk == 2 && t == 12) || (bk == 10 && (t == 4 || t == 20))) && c == black)
return 2;
else {
return 4;
}
}
}
}
}
//torre amenaça peó i se'l menjarà
if (COL(t) == COL(p) && Distance(bk, p) - (c == black) > 1 && (rattacks & Bit(p))) {
if (!(c == black && ROW(p) == 6 && (p - bk == 25 || p - bk == 23))) { //que avançant dos caselles no quedi defensat
if (c == black) {
if (wk == 57 && bk == 24 && p == 48 && t == 56)
return 2;
else {
if ((wk == 61 || wk == 62 || wk == 63) && bk == 25 && p == 49 && t == 57)
return 2;
else {
if ((wk == 62 || wk == 63) && bk == 26 && p == 50 && t == 58)
return 2;
else {
if (wk == 63 && bk == 27 && p == 51 && t == 59)
return 2;
else {
if (wk == 40 && bk == 56 && p == 9 && (t == 17 || t == 25 || t == 33 || t == 41))
return 2;
else
return 4;
}
}
}
}
}
else
return 4;
}
}
//peo retrassat
if (ROW(p) + (c == white) > 3 && Distance(bk, p) - (c == black) > 4) {
if (rattacks & rook_attacks(p + 8, allpieces)) //torre podrà anar davant peó i menjar-lo
return 4;
else {
if ((rattacks & rook_attacks(COL(p), allpieces)) && Distance(bk, COL(p)) + (c == white) > 2) //torre podrà anar davant peó i menjar-lo
return 4;
}
}
//peo retrassat a columna A
if (COL(p) == 0 && ROW(p) > 3) {
if (Distance(wk, COL(p)) - (c == white) - (ROW(bk) == 0) < 4) {
if (wk == 36 && bk == 17 && t == 10)
return 2;
else {
if (wk == 4 && bk == 1 && t == 11 && p == 32)
return 2;
else
return 4;
}
}
else {
/*if (Distance(wk, COL(p)) > 6)
return 2;*/
}
}
//cas especial mat
//5310956
if (!bkingincheck && bk == 7 && (wk == 13 || wk == 22)) {
if (c == white)
return 4;
else {
if (wk == 13) {
if (ROW(t) == 1) {
if (t == 12)
return 2;
else
return 0;
}
else {
if (p == 11 && (t == 18 || t == 20)) {
return 2; //tisores de caball
}
else
if (ROW(p) == 1) {
if ((rattacks & COLUMNAH) & PrecalculAlfil[p - 8]) { //dama al coronar evitarà mat per columna H
if (COL(t) == 4)
return 2; //escac a e1
else
return 0; //dama evita mat
}
else
return 4; //mat
}
else
return 4; //mat
}
}
else {
//wk == 22
if (ROW(p) == 1)
return 0;
else {
if (ROW(p) == 1) {
if ((rattacks & COLUMNAH) & PrecalculAlfil[p - 8]) { //dama al coronar evitarà mat per columna H
return 0; //dama evita mat
}
else
return 4; //mat
}
else
return 4; //mat
}
}
}
}
//cas especial mat
if (bk == 63 && !bkingincheck && (wk == 46 || wk == 53)) {
if (c == white)
return 4;
else {
if (wk == 46) {
if (p == 9)
return 0;
else {
if (COL(t) == 6 && ROW(p) == 1)
return 0;
else
return 4;
}
}
else
{ //wk == 53
if (ROW(t) == 6 && ROW(p) == 1)
return 0;
else {
if (p == 9)
return 2; //tapa escac amb dama
else {
if (ROW(p) == 1) {
if ((rattacks & COLUMNAH) & PrecalculAlfil[p - 8]) { //dama al coronar evitarà mat per columna H
return 0; //dama evita mat
}
else
return 4; //mat
}
else
return 4; //mat
}
}
}
}
}
if (ROW(p) == 1 && ROW(bk) == 0 && c == black && !(atwhite & Bit(p - 8)) && bk != p - 8 && !bkingincheck) {
Bitboard b = (rattacks & atwk) & FILA1; //casella on torre pot anar a 1a defensat per rei
bool torreatacapeo = rattacks & Bit(p);
if (b) {
if (ROW(wk) == 1) {
if (COL(t) > COL(bk) && COL(t) > COL(p)) {
if (COL(bk) > COL(p) + 3 || (COL(bk) > COL(p) + 1 && torreatacapeo))
return 4;
else
return 2;
}
else {
if (COL(t) < COL(bk) && COL(t) < COL(p)) {
return 2;
}
else
if (COL(t) > COL(p) && COL(bk) == COL(t) + 1)
return 0;
}
}
}
}
//corona i potser guanya
if (c == black && !bkingincheck && ROW(p) == 1 && ROW(t) != 0 && COL(t) < COL(p) && bk != p - 8) {
//return 0;
if (ROW(t) == ROW(bk)) {
if (ROW(wk) == ROW(t)) {
if (COL(wk) < COL(p) && COL(t) < COL(wk))
return 0;
else {
if (Distance(bk, p) > 2) {
if (ROW(wk) == ROW(bk) && wk < bk && p < wk)
return 0;
else
return 4;
}
else {
return 2;
}
}
}
else {
return 2;
}
}
else {
if (COL(p) == COL(wk)) {
//aquí COL(bk) == COL(p))
if (ROW(t) < ROW(bk) || ROW(t) >= ROW(wk))
return 0;
else {
if (ROW(wk) > ROW(t) + 1) {
if (ROW(t) > ROW(bk) + 1)
return 2;
else
return 0;
}
else {
if (Distance(bk, p) > 3)
return 4;
else
return 2;
}
}
}
else {
if (COL(bk) == 0 && wk == bk + 2) { //casos especials mat
if (abs(ROW(t) - ROW(bk)) == 1)
return 0;
else {
if ((p == 11 && wk == 18) || (p == 11 && wk == 34 && ROW(t) < ROW(bk)))
return 2;
else {
if (p == 11 && (bk == 40 || bk == 48 || bk == 56) && ROW(t) == 3)
return 0;
else
return 4;
}
}
}
else {
//return 0;
if (COL(p) == 2 && COL(bk) < 2 && ROW(t) > ROW(bk) && ROW(wk) == ROW(t) + 1) {
if (ROW(t) < 3)
return 0;
else {
if (COL(wk) == 0)
return 0;
else {
if (COL(wk) > 1)
return 0;
else
return 2;
}
}
}
else {
if (p == 11 && COL(t) == 1 && wk == 0)
return 2;
else {
if (wk == 8 && bk == 2) {
if (ROW(t) == 2)
return 0;
else
return 2;
}
else {
if (bk == p - 7 && wk == bk + 10) {
if (ROW(t) < 3)
return 0;
else
return 2;
}
else
{
if (COL(t) == 0 && bk == 2 && p == 11 && !(COL(wk) == 0 && wk < t) && !(wk == t + 1) && !(wk == t + 2 && wk != 18))
return 2;
else {
if (p == 10 && (wk == 0 || wk == 8) && COL(t) == 1 && ROW(bk) == 0)
return 2;
else {
if (p == 11 && (wk == 1 || wk == 9) && COL(t) == 2 && ROW(bk) == 0)
return 2;
else {
if (wk == 8 && bk == 10) {
if (ROW(t) == 2 || ROW(t) == 3)
return 0;
else
return 2;
}
else {
if (wk == bk + 2 && COL(bk) == COL(p) + 1) {
if (ROW(t) <= ROW(bk) + 2 || ROW(wk) == 0)
return 0;
else
return 2;
}
else {
if (COL(bk) == 7 && wk == bk - 2 && abs(ROW(t) - ROW(bk)) > 1 &&
!((rattacks & COLUMNAH) & PrecalculAlfil[p - 8]) //dama al coronar evitarà mat per columna H
) {
if (ROW(t) > ROW(bk) && (PrecalculAlfil[p - 8] & Bit(bk + 8)))
return 2; //tapa de dama
else {
if (ROW(t) < ROW(bk) && (PrecalculAlfil[p - 8] & Bit(bk - 8)))
return 2; //tapa de dama
else
return 4;
}
}
else {
if (COL(bk) == COL(p)) {
if (ROW(t) > ROW(bk) + 2) {
if (Distance(wk, p) < 3) {
if (Distance(bk, p) < 3)
return 2;
else {
if (knight_attacks[p - 8] & bwk) { //fa escac de caball al coronar
if ((wk == 11 || wk == 18) && bk == 33)
return 4;
else
return 2;
}
else
return 4;
}
}
else {
if (Distance(wk, p) < 3 && Distance(bk, p) == 3)
return 4;
else {
if (ROW(t) == ROW(wk) && COL(wk) <= COL(p) && COL(t) < COL(wk))
return 0;
else {
if (bk == p + 24 && (wk == p + 3 || wk == p - 3))
return 4;
else
return 2;
}
}
}
}
else {
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
return 999;
}