## advanced krkp function

Discussion of chess software programming and technical issues.

Moderators: hgm, Harvey Williamson, bob

Forum rules
This textbox is used to restore diagrams posted with the [d] tag before the upgrade.
cdani
Posts: 2095
Joined: Sat Jan 18, 2014 9:24 am
Location: Andorra
Contact:

### advanced krkp function

I want to share the krkp function I have done. It solves a big part (if I remember well + than 50%) of the positions with tablebase like resolution.

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&#40;...) &#123;
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 &#40;rook_color == black&#41; &#123;
//passar a com si fossin white
wk = &#40;7 - ROW&#40;wk&#41;) * 8 + COL&#40;wk&#41;;
bk = &#40;7 - ROW&#40;bk&#41;) * 8 + COL&#40;bk&#41;;
t = &#40;7 - ROW&#40;t&#41;) * 8 + COL&#40;t&#41;;
p = &#40;7 - ROW&#40;p&#41;) * 8 + COL&#40;p&#41;;
c = opponent&#40;c&#41;;
&#125;

if &#40;COL&#40;p&#41; > 3&#41; &#123;
wk = wk ^ 7; // Mirror a1 -> h1
bk = bk ^ 7;
t = t ^ 7;
p = p ^ 7;
&#125;

Bitboard atwk = king_attacks&#91;wk&#93;;
Bitboard atbk = king_attacks&#91;bk&#93;;
Bitboard atp = pawn_attacks&#91;black&#93;&#91;p&#93;;
Bitboard btw = Bit&#40;t&#41;;
Bitboard bbk = Bit&#40;bk&#41;;
Bitboard bwk = Bit&#40;wk&#41;;
Bitboard bbp = Bit&#40;p&#41;;
Bitboard whitepieces = btw | bwk;
Bitboard rattacks = rook_attacks&#40;t, &#40;Bitboard&#41;&#40;bwk | bbk | bbp&#41;);
Bitboard atwhite = rattacks | atwk;
Bitboard atblack = atbk | atp;
Bitboard allpieces = whitepieces | bbk | bbp;

bool bkingincheck = &#40;atwhite & bbk&#41;;

if &#40;c == black && &#40;atbk & atwhite&#41; == atbk && !&#40;atp & btw&#41;) &#123;
//mat
if (&#40;atwhite & bbk&#41;
&& !&#40;ROW&#40;bk&#41; == ROW&#40;t&#41; && ROW&#40;p&#41; == ROW&#40;bk&#41; + 1&#41; //que no es pugui tapar de l'escac amb el peó
)
return 4;
else //rei negre ofegat, i peó bloquejat
if (!&#40;atwhite & bbk&#41; && &#40;whitepieces & Bit&#40;p - 8&#41;))
return 2;
&#125;

//cas concret d'ofegat
if &#40;bk == 0 && wk == 2 && t == 9 && p == 11&#41;
return 2;

//torre captura peó negre no defensat
if (&#40;c == white || &#40;Distance&#40;bk, p&#41; - &#40;ROW&#40;p&#41; == 6&#41; > 3 && !&#40;atbk & btw&#41; && !&#40;ROW&#40;p&#41; == 1&#41;))
&& &#40;rattacks & bbp&#41; && !&#40;atbk & bbp&#41;) &#123;
return 999;
&#125;

//rei captura peó negre no defensat
if &#40;c == white && &#40;atwk & bbp&#41; && !&#40;atbk & bbp&#41;) &#123;
return 999;
&#125;

//rei negre pot capturar torre
if (&#40;atbk & btw&#41; && !&#40;atwk & btw&#41;) &#123;
if &#40;c == black&#41;
//mirar resultat final kpk
return 999;
//peo fa escac i rei no pot defensar torre ni torre pot menjar peó
if (&#40;atp & bwk&#41; && Distance&#40;wk, t&#41; > 1 && !&#40;rattacks & bbp&#41;)
//mirar resultat final kpk
return 999;
&#125;

//peo negre pot capturar torre
if &#40;c == black && &#40;atp & btw&#41;) &#123;
//mirar resultat final kpk
return 999;
&#125;

//per fila&#58; torre clava peó o fa escac amenaçant peó i el menjarà
if &#40;ROW&#40;p&#41; != 1 && ROW&#40;p&#41; == ROW&#40;t&#41; && ROW&#40;t&#41; == ROW&#40;bk&#41; && Distance&#40;bk, p&#41; - &#40;c == black&#41; > 1 && ROW&#40;wk&#41; != ROW&#40;bk&#41;) &#123;
return 4;
&#125;

//peo clavat i se'l menjaran
if &#40;ROW&#40;t&#41; == ROW&#40;bk&#41; && ROW&#40;p&#41; == ROW&#40;bk&#41;)&#123;
if &#40;Distance&#40;bk, p&#41; - &#40;c == black&#41; > 1&#41; &#123;
if (&#40;bk == 8 && wk == 2&#41; || &#40;bk == 15 && wk == 5&#41;) &#123;
if &#40;bk == 8 && t == 9&#41;
return 4;
else &#123;
if &#40;bk == 15 && t == 14&#41;
return 4;
&#125;
if &#40;bk == 15 && p == 11 && t != 12&#41;
return 4;
if &#40;Distance&#40;t, p&#41; > 1 && COL&#40;t&#41; != COL&#40;wk&#41;)
return 4; //podrà parar el peó anant a 1a amb la torre
//if &#40;own == 999&#41;
return 2; //taules perquè s'autoofegarà
&#125;
else &#123;
//si rei entre mig de torre i rei negre, no se sap
if &#40;ROW&#40;wk&#41; != ROW&#40;bk&#41;) //mirar excepcions quan rei entre mig però guanya
return 4;
&#125;
&#125;
else &#123;
if &#40;Distance&#40;wk, p&#41; == 1 && ROW&#40;t&#41; != ROW&#40;wk&#41;) &#123;
if &#40;Distance&#40;bk, 0&#41; == 1 && p == 9 && c == black&#41;
return 2; //rei s'ofega a a1
else
return 4;
&#125;
&#125;
&#125;

//casos especials rei negre en un extrem i rei blanc a c3
if &#40;p == 9 && &#40;bk == 8 || bk == 0 || bk == 1&#41; && wk == 18 && ROW&#40;t&#41; > 1 && !&#40;atwhite & bbk&#41;
&& &#40;c == black || COL&#40;t&#41; != 1&#41;
) &#123;
if &#40;ROW&#40;t&#41; == 2 && t != 17 && c == black&#41; &#123;
if &#40;t == 16 || bk == 1&#41;
return 2;
else
return 0;
&#125;
else &#123;
if &#40;t == 17 && bk == 1&#41;
return 4;
else &#123;
if (&#40;ROW&#40;t&#41; > 2 || COL&#40;t&#41; == 0&#41; && c == white&#41;
return 4;
else &#123;
if &#40;bk == 1&#41; &#123;
if &#40;c == white&#41;
return 4;
else &#123;
if &#40;COL&#40;t&#41; == 0 || COL&#40;t&#41; == 3&#41;
return 2;
else
return 4;
&#125;
&#125;
else
return 2;
&#125;
&#125;
&#125;
&#125;

//peó parat i sel menjarà
if (&#40;atwhite & Bit&#40;p - 8&#41;) && Distance&#40;bk, p&#41; - &#40;c == black&#41; > 2 && ROW&#40;p&#41; != 6&#41; &#123;
if &#40;bk == 0 && c == black && wk == 2 && t == 9 && p == 19&#41;
return 2; //cas especial ofegat
else &#123;
if &#40;bk == 0 && wk == 16 && t == 9 && &#40;p == 25 || &#40;p == 33 && c == black&#41;))
return 2; //cas especial ofegat
else &#123;
if &#40;bk == 7 && c == black && wk == 5 && ROW&#40;t&#41; == 1 && ROW&#40;p&#41; == 2 && COL&#40;t&#41; == COL&#40;wk&#41; && COL&#40;p&#41; < 3&#41;
return 2; //cas especial ofegat
else &#123;
if &#40;bk == 56 && wk == 40 && p == 9 && c == black&#41;
return 2; //cas especial ofegat
else
return 4;
&#125;
&#125;
&#125;
&#125;

//cas especial
if &#40;bk == 0 && wk == 2 && p == 9&#41; &#123;
if &#40;ROW&#40;t&#41; == 0 || COL&#40;t&#41; == 1&#41;
return 4;
else &#123;
if &#40;ROW&#40;t&#41; == 1 || COL&#40;t&#41; == 2 || COL&#40;t&#41; == 4 || ROW&#40;t&#41; > 2&#41;
return 2; //ofegat o ha de donar torre per dama
else
return 0;
&#125;
&#125;

//cas especial
if &#40;bk == 0 && wk == 2 && p == 9 + 8 && (&#40;c == black && ROW&#40;t&#41; == 1&#41; || &#40;c == white && t == 10&#41;)) &#123;
return 2;
&#125;

//ofegat o mat
if &#40;c == black && bk + 8 == p && !&#40;atbk & ~&#40;atwhite | Bit&#40;p&#41;))) &#123;
if &#40;atwhite & Bit&#40;bk&#41;)
return 4; //mat
else
return 2;
&#125;

//tisores rei i torre
if (&#40;atp & bwk&#41; && &#40;atp & Bit&#40;t&#41;) && &#40;atbk & Bit&#40;p&#41;))
return 2;

//tisores rei i torre
if &#40;c == black && &#40;pawn_attacks&#91;black&#93;&#91;p - 8&#93; & bwk&#41; && &#40;pawn_attacks&#91;black&#93;&#91;p - 8&#93; & Bit&#40;t&#41;) && &#40;atbk & Bit&#40;p - 8&#41;) &&
!&#40;atwhite & bbk&#41;)
return 2;

//tisores rei i torre
if &#40;c == black && ROW&#40;p&#41; == 6 && &#40;pawn_attacks&#91;black&#93;&#91;p - 16&#93; & bwk&#41; && &#40;pawn_attacks&#91;black&#93;&#91;p - 16&#93; & Bit&#40;t&#41;) && &#40;atbk & Bit&#40;p - 16&#41;) &&
!&#40;atwhite & bbk&#41;) &#123;
if &#40;bk + 8 == p&#41;
return 4; //rein bloqueja peó
else
return 2;
&#125;

//rei ha parat peó
if &#40;ROW&#40;p&#41; > ROW&#40;wk&#41;) &#123;
if &#40;COL&#40;wk&#41; == COL&#40;p&#41; ||
(&#40;COL&#40;wk&#41; - &#40;c == white&#41; == COL&#40;p&#41; || COL&#40;wk&#41; + &#40;c == white&#41; == COL&#40;p&#41;)
&& (&#40;atwk & Columnes&#91;COL&#40;p&#41;&#93;) & ~atblack&#41;) //hi ha alguna casella no atacada pel negre davant del peo on pugui anar el rei blanc
) &#123;
if &#40;c == black && COL&#40;bk&#41; == 0 && wk + 16 == bk && bk + 8 == p && COL&#40;t&#41; == 1&#41;
return 2; //ofegat
else
return 4;
&#125;
else &#123;
//rei pararà peó
if &#40;ROW&#40;bk&#41; - &#40;c == black&#41; > ROW&#40;wk&#41;
&& (&#40;atwk & Columnes&#91;COL&#40;p&#41;&#93;) & ~atblack&#41; //hi ha alguna casella no atacada pel negre davant del peo on pugui anar el rei blanc
&& ROW&#40;bk&#41; != 2
)
return 4;
&#125;
&#125;

//ofegat o coronarà
if (&#40;p == 8 || &#40;p == 16 && c == black&#41; || &#40;p == 19 && c == black&#41;) && bk == 0 && wk == 2 && COL&#40;t&#41; < 2&#41; &#123;
if &#40;p == 19&#41; &#123;
if &#40;t == 9&#41;
return 2;
else
return 4;
&#125;
else &#123;
if &#40;p == 16 && t == 1&#41;
return 4; //fent escac
else
return 2;
&#125;
&#125;

//cas especial taules ofegat
if (&#40;p == 17 || p == 25&#41; && &#40;bk == 0 || bk == 1&#41; && wk == 16 && t == 9&#41;
return 2;

//peo coronant i rein no en escac
bool coronaambescac = (!!(&#40;PrecalculTorre&#91;p - 8&#93; | PrecalculAlfil&#91;p - 8&#93;) & bwk&#41;) && bk != p - 8 && t != p - 8;

if &#40;c == black && ROW&#40;p&#41; == 1 && !bkingincheck&#41;  &#123;
if &#40;wk == p - 8&#41;
return 4; //reib bloquejant peo
else &#123;
if &#40;atwk & &#40;Bit&#40;p - 8&#41;)) &#123; //reib atacant avanç p
if (!&#40;atbk & &#40;Bit&#40;p - 8&#41;))) &#123;
if &#40;atbk & btw&#41; &#123;
if &#40;rattacks & Bit&#40;bk&#41;)
return 4;
else &#123;
if (&#40;rattacks & Bit&#40;p - 8&#41;) || &#40;COL&#40;t&#41; == COL&#40;p&#41; && COL&#40;t&#41; != COL&#40;wk&#41;))
return 4;  //torre para coronació
else
return 2; //rei negre menjarà torre doncs quedarà sense defensar en desviar el reib amb coronació
&#125;
&#125;
else &#123;
if &#40;bk == 0 && p == 10 && ROW&#40;t&#41; == 1&#41;
return 2; //reib a c1 ofegarà amb torre a 2a
else
return 4;
&#125;
&#125;
else &#123;
if &#40;COL&#40;t&#41; == COL&#40;p&#41;)
return 4; //rei i torre evitant coronació
&#125;
&#125;
&#125;

if &#40;coronaambescac&#41; &#123;
if &#40;Distance&#40;wk, p - 8&#41; == 1 && !&#40;rattacks & Bit&#40;p - 8&#41;))
return 0;
else &#123;
if (&#40;COL&#40;t&#41; < COL&#40;p&#41; && COL&#40;wk&#41; > COL&#40;p&#41;) || &#40;COL&#40;t&#41; > COL&#40;p&#41; && COL&#40;wk&#41; < COL&#40;p&#41;)) &#123;
//no pot tapar de torre
if (&#40;ROW&#40;t&#41; == 1 || ROW&#40;t&#41; == 0&#41; && ROW&#40;bk&#41; == 1&#41; &#123;
//peo clavat o torre controlant coronació
if &#40;Distance&#40;wk, p - 8&#41; == 1&#41;
return 4; //controla coronació amb torre i rei
else &#123;
if (&#40;rattacks & Bit&#40;p - 8&#41;) && Distance&#40;wk, p - 8&#41; == 2&#41; &#123;
if &#40;Distance&#40;bk, p - 8&#41; == 1&#41;
return 2;
else
return 4; //arriba a controlar coronació amb rei i ja la controla amb torre
&#125;
else
return 2;
&#125;
&#125;
else &#123;
if &#40;t == 0 && c == black && p == 10 && &#40;Distance&#40;bk, p&#41; < Distance&#40;wk, p&#41; || &#40;ROW&#40;wk&#41; == 0 && ROW&#40;bk&#41; == 3 && COL&#40;bk&#41; == COL&#40;p&#41; + 1&#41;))
return 2; //cas especial torre no pot guanyar un temps
else &#123;
if (&#40;rattacks & Bit&#40;p - 8&#41;)) &#123;
if &#40;Distance&#40;bk, p - 8&#41; - &#40;c == black&#41; == 1&#41; &#123;
if &#40;atbk & (~atwk&#41; & &#40;FILA2 ^ Bit&#40;p&#41;)) &#123;
if (&#40;COL&#40;wk&#41; < COL&#40;p&#41; && COL&#40;bk&#41; < COL&#40;p&#41;) || &#40;COL&#40;wk&#41; > COL&#40;p&#41; && COL&#40;bk&#41; > COL&#40;p&#41;))
return 2; //rein pot anar a 2a
else &#123;
if &#40;Distance&#40;t, p - 8&#41; == 2&#41;
return 2; //al baixa amb el rei toca la torre guanyant un temps
else &#123;
if &#40;Distance&#40;wk, p - 8&#41; > 2&#41;
return 2; //reib no arriba a temps d'ajudar la torre a parar el peó
else
return 4; //si que arriba a temps
&#125;
&#125;
&#125;
else &#123;
return 4;
&#125;
&#125;
else &#123;
if (&#40;t == 0 || t == 1&#41; && c == black && &#40;p == 10 || p == 11&#41; && &#40;bk == 21 || bk == 22&#41; && COL&#40;wk&#41; > COL&#40;bk&#41;)
return 2; //reib massa lluny
else &#123;
if &#40;t == 0 && c == black && p == 10 && &#40;bk == 25 || bk == 26&#41; && COL&#40;wk&#41; >= 4 && wk != 20&#41;
return 2; //cas especial
else &#123;
if &#40;COL&#40;wk&#41; == 7 && COL&#40;t&#41; < COL&#40;bk&#41; && ROW&#40;bk&#41; < 4&#41;
return 2; //rein arriba a suportar peo
else &#123;
if &#40;c == black && Distance&#40;bk, p + 8&#41; == 1 && Distance&#40;wk, p - 8&#41; > 2 && Distance&#40;t, p - 8&#41; == 2&#41;
return 2; //rein arriba pq guanya un temps sobre torre
else &#123;
if &#40;ROW&#40;wk&#41; >= ROW&#40;bk&#41; && Distance&#40;bk, p&#41; < Distance&#40;t, p&#41;
&& (&#40;COL&#40;wk&#41; > COL&#40;bk&#41; && COL&#40;bk&#41; >= COL&#40;p&#41;) || &#40;COL&#40;wk&#41; < COL&#40;bk&#41; && COL&#40;bk&#41; <= COL&#40;p&#41;)))
return 2;
/*else
return 4;*/
&#125;
&#125;
&#125;
&#125;
&#125;
&#125;
&#125;
//return 0;
&#125;
&#125;
else &#123;
if &#40;ROW&#40;bk&#41; == 0&#41; &#123;
if &#40;ROW&#40;wk&#41; == 0 && Distance&#40;wk, t&#41; < 3 && ROW&#40;t&#41; == 0&#41;
return 2;
else &#123;
if &#40;ROW&#40;wk&#41; == 0 && COL&#40;t&#41; == COL&#40;wk&#41; - 1&#41; &#123;
if &#40;Distance&#40;p, bk&#41; > 2&#41; &#123;
if &#40;COL&#40;bk&#41; < COL&#40;p&#41;)
return 2; //bo
/*else
return 4; //rein no pot defensar coronació*/
&#125;
/*else
return 2;*/
&#125;
&#125;
&#125;
&#125;
&#125;
&#125;
&#125;

//cas especial
if &#40;bk == 0 && p == 9 && wk == 16&#41; &#123;
if &#40;bkingincheck&#41; &#123;
if &#40;ROW&#40;t&#41; == 0&#41;
return 2;
else
return 4;
&#125;
else &#123;
if &#40;c == black&#41; &#123;
if &#40;COL&#40;t&#41; == 1&#41;
return 2;
else
return 0;
&#125;
else &#123;
if &#40;c == white && COL&#40;t&#41; == 0&#41;
return 4;
else
return 2;
&#125;
&#125;
&#125;

//torre parant peó per columna davant peo
if &#40;COL&#40;t&#41; == COL&#40;p&#41; && ROW&#40;t&#41; < ROW&#40;p&#41;) &#123;
//cas especial taules
if &#40;ROW&#40;p&#41; == 1 && t == p - 8 && &#40;bk == p + 8 || bk == p + 9&#41; && wk == t + 2&#41; &#123;
if &#40;COL&#40;p&#41; < 3 && (&#40;bk == p + 9 && c == white&#41; || &#40;bk == p + 8 && c == black&#41;))
return 2;
else
return 4;
&#125;
else &#123;
if &#40;Distance&#40;wk, t&#41; < 2&#41;
return 4;
else &#123;
if &#40;Distance&#40;wk, t&#41; - &#40;c == white&#41; < Distance&#40;bk, t&#41; - &#40;c == black&#41;)
return 4;
else &#123;
if &#40;Distance&#40;bk, p&#41; - &#40;c == black&#41; > 1 || Distance&#40;t, p&#41; < Distance&#40;bk, p&#41; - &#40;c == black&#41;) &#123;
if (!&#40;c == black && ROW&#40;p&#41; == 6 && ROW&#40;bk&#41; == 3&#41;)
return 4;
&#125;
&#125;
&#125;
&#125;
&#125;

//rei ajudarà coronació peo amb torre parant peó per columna
if &#40;ROW&#40;p&#41; == 1 && COL&#40;t&#41; == COL&#40;p&#41;) &#123;
//if &#40;c == white && Distance&#40;wk, p - 8&#41; < 2&#41;
if &#40;c == white && &#40;atwk & Bit&#40;p + 1&#41;) && !&#40;atbk & Bit&#40;p + 1&#41;) && !&#40;atbk & Bit&#40;t&#41;))
return 4;
else &#123;
if &#40;c == white && COL&#40;p&#41; != 0 && &#40;atwk & Bit&#40;p - 1&#41;) && !&#40;atbk & Bit&#40;p - 1&#41;) && !&#40;atbk & Bit&#40;t&#41;))
return 4;
else
/*if &#40;Distance&#40;bk, p - 8&#41; - &#40;c == black&#41; < 2&#41;
own = 2*/;
&#125;
&#125;

//torre tallant accés del rein al peó
if &#40;ROW&#40;p&#41; > 2 && ROW&#40;bk&#41; > 4 && ROW&#40;t&#41; > ROW&#40;p&#41; && ROW&#40;t&#41; < ROW&#40;bk&#41;
&& !&#40;ROW&#40;wk&#41; == ROW&#40;t&#41; && &#40;COL&#40;t&#41; > COL&#40;wk&#41; && COL&#40;wk&#41; > COL&#40;p&#41;)) //que reib no estigui tallant "tall" de torre
)
return 4;

//torre tallant accés del rein al peó per sota
if &#40;ROW&#40;p&#41; > 2 && ROW&#40;bk&#41; + &#40;c == black&#41; < ROW&#40;t&#41; - 1 && ROW&#40;t&#41; < ROW&#40;p&#41; && ROW&#40;t&#41; > ROW&#40;bk&#41; + 1 && ROW&#40;p&#41; != 6
&& !&#40;ROW&#40;wk&#41; == ROW&#40;t&#41; && &#40;COL&#40;t&#41; > COL&#40;wk&#41; && COL&#40;wk&#41; > COL&#40;p&#41;)) //que reib no estigui tallant "tall" de torre
)
return 4;

//torre tallant accés del rein al peó per sota
if &#40;COL&#40;bk&#41; < COL&#40;t&#41; && COL&#40;t&#41; <= COL&#40;p&#41; && ROW&#40;t&#41; < ROW&#40;p&#41;) &#123;
if &#40;Distance&#40;bk, t&#41; > 2 && Distance&#40;bk, p&#41; - &#40;c == black&#41; > 2 - &#40;c == black && COL&#40;t&#41; == COL&#40;bk&#41; + 1 && COL&#40;t&#41; < COL&#40;p&#41; - 1&#41;) &#123;
return 4;
&#125;
else &#123;
if &#40;Distance&#40;wk, t&#41; == 1&#41;
return 4;
else &#123;
if &#40;Distance&#40;bk, p&#41; - &#40;c == black&#41; > 2&#41; &#123;
if &#40;c == black && &#40;wk == 48 || wk == 56&#41; && bk == 17&#41; &#123;
if &#40;t == 34 && p == 51&#41;
return 4;
else
return 2;
&#125;
else
return 4;
&#125;
else &#123;
if &#40;ROW&#40;p&#41; > ROW&#40;wk&#41; && bk == wk - 16&#41; &#123;
if &#40;p == 50 && wk == 40&#41;
; // own == 2;
else &#123;
if &#40;p == 51 && wk == 41&#41;
; //own == 2;
else
return 4;
&#125;
&#125;
&#125;
&#125;
&#125;
&#125;

//reib impedeix rein a arribar al peo
if &#40;wk == bk + 16 && ROW&#40;p&#41; > ROW&#40;wk&#41;) &#123;
if &#40;bk == 24 && p == 50 && &#40;t == 9 || &#40;c == black && t == 19&#41;))
return 2;
else &#123;
if &#40;bk == 25 && p == 51 && &#40;t == 10 || &#40;c == black && t == 20&#41;))
return 2;
else &#123;
if &#40;bk == 27 && p == 49 && &#40;t == 10 || t == 16&#41; && c == black&#41;
return 2;
else &#123;
if &#40;bk == 28 && p == 50 && &#40;t == 11 || t == 17&#41; && c == black&#41;
return 2;
else &#123;
if &#40;bk == 29 && p == 51 && &#40;t == 12 || t == 18&#41; && c == black&#41;
return 2;
else
return 4;
&#125;
&#125;
&#125;
&#125;
&#125;

//reib impedeix rein a arribar al peo
if &#40;ROW&#40;bk&#41; < ROW&#40;wk&#41; - 2 && ROW&#40;p&#41; > ROW&#40;wk&#41; &&
(&#40;COL&#40;p&#41; > COL&#40;wk&#41; && COL&#40;bk&#41; <= COL&#40;wk&#41;) || &#40;COL&#40;p&#41; < COL&#40;wk&#41; && COL&#40;bk&#41; >= COL&#40;wk&#41;))
) &#123;
return 4;
&#125;

//torre tallant accés del rein al peó per sota
if &#40;COL&#40;bk&#41; > COL&#40;t&#41; && COL&#40;t&#41; >= COL&#40;p&#41; && ROW&#40;t&#41; < ROW&#40;p&#41; && ROW&#40;p&#41; > 1 && !&#40;ROW&#40;p&#41; == 6 && Distance&#40;bk, p - 16&#41; - &#40;c == black&#41; < 2&#41;) &#123;
if &#40;Distance&#40;bk, t&#41; > 2 && Distance&#40;bk, p&#41; - &#40;c == black&#41; > 2 - &#40;c == black && COL&#40;t&#41; == COL&#40;bk&#41; - 1 && COL&#40;t&#41; > COL&#40;p&#41; - 1&#41;) &#123;
return 4;
&#125;
else &#123;
if &#40;Distance&#40;wk, t&#41; == 1 && &#40;ROW&#40;p&#41; > 2 || Distance&#40;wk, p&#41; < Distance&#40;t, p&#41;))
return 4;
&#125;
&#125;

//torre podrà tallar accés rei a peo o guanyar peo
if &#40;c == white && &#40;rattacks & Bit&#40;ROW&#40;t&#41; * 8 + COL&#40;p&#41;))
&& !&#40;atbk & Bit&#40;ROW&#40;t&#41; * 8 + COL&#40;p&#41;))
&& ROW&#40;t&#41; < ROW&#40;p&#41; && ROW&#40;p&#41; > 1 && !&#40;ROW&#40;p&#41; == 6 && Distance&#40;bk, p - 16&#41; - &#40;c == black&#41; < 2&#41;) &#123;
if &#40;Distance&#40;bk, t&#41; > 2 && Distance&#40;bk, p&#41; > 2&#41; &#123;
return 4;
&#125;
&#125;

//torre pot menjar peó
if &#40;abs&#40;COL&#40;p&#41; - COL&#40;bk&#41;) > 3 - &#40;c == white && COL&#40;wk&#41; != COL&#40;p&#41;) && ROW&#40;p&#41; - &#40;c == black&#41; > 1
&& !&#40;ROW&#40;wk&#41; == ROW&#40;t&#41; && &#40;COL&#40;t&#41; > COL&#40;wk&#41; && COL&#40;wk&#41; > COL&#40;p&#41;))) //que reib no estigui tallant "tall" de torre
return 4;

//cas especial ofegat
if &#40;wk == 40 && &#40;bk == 57 || bk == 56&#41; && t == 49 && &#40;p == 9 || &#40;p == 17 && c == black && bk == 56&#41;))
return 2;

//cas especial ofegat
if &#40;wk == 5 && bk == 7 && ROW&#40;t&#41; == 1 && ROW&#40;p&#41; == 1&#41; &#123;
if &#40;c == black&#41;
return 0;
else &#123;
if &#40;abs&#40;COL&#40;t&#41; - COL&#40;p&#41;) == 1&#41; &#123;
if &#40;p == 11&#41; &#123;
if &#40;t == 12&#41;
return 2;
else
return 4;
&#125;
else
return 2;
&#125;
else &#123;
if &#40;COL&#40;t&#41; == COL&#40;wk&#41;) &#123;
if &#40;p == 11&#41;
return 4;
else
return 2;
&#125;
else
return 4;
&#125;
&#125;
&#125;

//torre fent escac i guanya peó
if &#40;bkingincheck && &#40;rattacks & Bit&#40;p&#41;) &&
&#40;Distance&#40;bk, p&#41; > 2 || &#40;Distance&#40;wk, t&#41; < 3&#41; && Distance&#40;wk, p&#41; < 3 && ROW&#40;wk&#41; <= ROW&#40;p&#41;)) &#123;
//excepcio taules
if &#40;wk == 0 && t == 8 && &#40;bk == 16 || bk == 24&#41; && p == 10&#41;
return 2;
else &#123;
if (&#40;wk == 0 || wk == 8&#41; && t == 9 && &#40;bk == 17 || bk == 25&#41; && p == 10&#41;
return 2; //excepcio taules
else &#123;
if &#40;wk < 2 && t == 9 && &#40;bk == 17 || bk == 25&#41; && p == 11&#41;
return 2; //excepcio taules
else &#123;
if &#40;wk == 2 && t == 9 && &#40;bk == 17 || bk == 25&#41; && p == 8&#41;
return 2; //excepcio taules
else &#123;
if (&#40;wk == 1 || wk == 9&#41; && t == 10 && &#40;bk == 18 || bk == 26&#41; && p == 11&#41;
return 2; //excepcio taules
else &#123;
if &#40;wk == 2 && t == 10 && &#40;bk == 18 || bk == 26&#41; && p == 8&#41;
return 2; //excepcio taules
else &#123;
if (&#40;wk == 3 || wk == 11&#41; && t == 10 && &#40;bk == 18 || bk == 26&#41; && p == 9&#41;
return 2; //excepcio taules
else &#123;
if &#40;wk == 3 && t == 11 && &#40;bk == 19 || bk == 27&#41; && p == 9&#41;
return 2; //excepcio taules
else &#123;
if (&#40;wk == 4 || wk == 12&#41; && t == 11 && &#40;bk == 19 || bk == 27&#41; && p == 10&#41;
return 2; //excepcio taules
else &#123;
if &#40;wk == 4 && t == 12 && &#40;bk == 20 || bk == 28&#41; && p == 10&#41;
return 2; //excepcio taules
else &#123;
if (&#40;wk == 5 || wk == 13&#41; && t == 12 && &#40;bk == 20 || bk == 28&#41; && p == 11&#41;
return 2; //excepcio taules
else &#123;
if &#40;wk == 5 && t == 13 && &#40;bk == 21 || bk == 29&#41; && p == 11&#41;
return 2; //excepcio taules
else
return 4;
&#125;
&#125;
&#125;
&#125;
&#125;
&#125;
&#125;
&#125;
&#125;
&#125;
&#125;
&#125;

//peo corona
if &#40;Entre&#91;p - 8&#93;&#91;wk&#93; & Bit&#40;bk&#41;)
coronaambescac = false;
if &#40;ROW&#40;p&#41; == 1 && !&#40;atwhite & Bit&#40;p - 8&#41;)) &#123;
if &#40;c == black&#41; &#123;
if &#40;bk != p - 8&#41; &#123;
if &#40;ROW&#40;bk&#41; == 0 && &#40;rattacks & FILA1 & atwk&#41;) &#123;
if &#40;COL&#40;t&#41; - COL&#40;wk&#41; > 2&#41; &#123;
if &#40;COL&#40;bk&#41; > COL&#40;p&#41;)
return 2;
else
return 0;
&#125;
else &#123;
if &#40;ROW&#40;wk&#41; == 0&#41; &#123;
if &#40;ROW&#40;t&#41; == 0&#41; &#123;
if &#40;COL&#40;bk&#41; > COL&#40;t&#41;)
return 4;
else
return 2;
&#125;
&#125;
else &#123;
if &#40;abs&#40;COL&#40;p&#41; - COL&#40;bk&#41;) < 3&#41;
return 2;
else &#123;
if &#40;COL&#40;bk&#41; > COL&#40;p&#41;) &#123;
if &#40;ROW&#40;t&#41; == 0 && abs&#40;COL&#40;p&#41; - COL&#40;bk&#41;) == 3&#41;
return 2;
/*else &#123;
if &#40;ROW&#40;t&#41; == 1&#41; &#123;
if &#40;ROW&#40;wk&#41; == 1&#41; &#123;
if &#40;COL&#40;t&#41; < COL&#40;wk&#41;)
return 4;
&#125;
&#125;
&#125;*/
&#125;
/*	else
return 2;*/
&#125;
&#125;
&#125;
&#125;
else &#123;
if (!bkingincheck && coronaambescac&#41; &#123;
if &#40;COL&#40;t&#41; != COL&#40;p&#41;) &#123;
if &#40;ROW&#40;p&#41; == ROW&#40;bk&#41; && ROW&#40;bk&#41; == ROW&#40;t&#41;)
return 2;
else
return 0;
&#125;
&#125;

&#125;
&#125;
&#125;
&#125;

//torre guanya peo
if (&#40;rattacks & Bit&#40;p&#41;))
&#123;
if &#40;Distance&#40;bk, p&#41; + &#40;c == white&#41; > 3 - !&#40;Distance&#40;bk, p - 8&#41; == 2&#41;
&& &#40;ROW&#40;p&#41; > 1 || c == white&#41; && &#40;ROW&#40;p&#41; != 6 || Distance&#40;bk, p&#41; + &#40;c == white&#41; > 4&#41;)
return 4;
&#125;

//cas especial, fa mat quan negre corona
if &#40;bk == 0 && p == 16 && ROW&#40;t&#41; == 1 && Distance&#40;wk, p&#41; - &#40;c == white&#41; - &#40;wk == 19&#41; < 2 + &#40;ROW&#40;wk&#41; != 0 && ROW&#40;wk&#41; < 4&#41;)
return 4;

//cas especial, fa mat quan negre corona
if &#40;bk == 16 && p == 17 && COL&#40;t&#41; == 1 &&
&#40;wk == 33 || &#40;Distance&#40;wk, 9&#41; - &#40;c == white&#41; + &#40;COL&#40;wk&#41; == 0 || &#40;Distance&#40;bk, t&#41; == 1 && Distance&#40;wk, t&#41; > 1&#41;) < 3&#41;)
&& ROW&#40;t&#41; > ROW&#40;p&#41;)
return 4;

//alguns casos coronació
if (!bkingincheck && ROW&#40;p&#41; == 2 && c == black && Distance&#40;wk, COL&#40;p&#41;) > 2 && COL&#40;t&#41; == COL&#40;wk&#41; && abs&#40;ROW&#40;t&#41; - ROW&#40;bk&#41;) == 1 && abs&#40;COL&#40;bk&#41; - COL&#40;p&#41;) <= 1
&& ROW&#40;bk&#41; >= ROW&#40;p&#41;
) &#123;
if &#40;bk == 17 && ROW&#40;t&#41; > 2 && &#40;wk == 12 || wk == 13 || wk == 14 || wk == 15 || &#40;wk >= 20 && ROW&#40;t&#41; > ROW&#40;wk&#41;)))
return 0; //no pot parar el peó
else &#123;
if &#40;bk == 18 && ROW&#40;t&#41; > 2 && &#40;wk == 8 || wk == 13 || wk == 14 || wk == 15 || &#40;wk >= 21 && ROW&#40;t&#41; > ROW&#40;wk&#41;)))
return 0;
else &#123;
if &#40;bk == 19 && ROW&#40;t&#41; > 2 && &#40;wk == 13 || wk == 14 || wk == 15 || &#40;wk >= 22 && ROW&#40;t&#41; > ROW&#40;wk&#41;)))
return 0;
else &#123;
if &#40;bk == 20 && ROW&#40;t&#41; > 2 && &#40;wk == 8 || wk == 14 || wk == 15 || wk == 16 || &#40;wk >= 23 && ROW&#40;t&#41; > ROW&#40;wk&#41;)))
return 0;
/*else
return 2;*/
&#125;
&#125;
&#125;

&#125;

//menja peo
if (&#40;atwk & Bit&#40;p&#41;) && &#40;rattacks & Bit&#40;p&#41;) && &#40;bk == p + 8 || bk == p - 8 || c == white&#41;) &#123;
if &#40;bk == 0 && p == 9&#41; &#123;
if &#40;COL&#40;t&#41; == 1&#41;
return 4; //farà mate
else
return 2;
&#125;
else &#123;
if &#40;bk == 1 && p == 9 && c == black && COL&#40;t&#41; != 0&#41;
return 2; //ofegarà
else
return 4;
&#125;
&#125;

if &#40;c == black && ss->tau.c&#91;p - 8&#93; != CasellaBuida && !&#40;atbk & (~&#40;atwhite | Bit&#40;p&#41;)))) &#123;
return 4; //mat o guanya
&#125;
else &#123;
if &#40;p == 8 && bk == 0 && wk == 2 /*&& &#40;COL&#40;t&#41; == 1 || ROW&#40;t&#41; == 1 || COL&#40;t&#41; == 0&#41;*/) &#123;
if &#40;c == white && ROW&#40;t&#41; == 0&#41;
return 4; //mat
else
return 2; //ofegat o taules
&#125;
else &#123;
if &#40;p == 16 && bk == 0 && wk == 2 /*&& &#40;ROW&#40;t&#41; == 1 || COL&#40;t&#41; == 1 || COL&#40;t&#41; == 0&#41; && c == black*/) &#123;
if &#40;ROW&#40;t&#41; == 0 || c == white&#41;
return 4;
else
return 2;
&#125;
&#125;
&#125;

//rei surt de casella 0 i vol coronar
if &#40;bk == 0 && p == 8&#41; &#123;
if &#40;c == black&#41; &#123;
if &#40;ROW&#40;t&#41; == 2 &&
((!&#40;atwk & &#40;Bit&#40;18&#41; | Bit&#40;17&#41; | Bit&#40;10&#41;))) || &#40;wk == 27&#41;)
) &#123; //si reib no defensa casella on torre pugui fer escac, negre corona i guanya
if &#40;COL&#40;t&#41; == 0 || &#40;COL&#40;t&#41; != 2 && COL&#40;t&#41; != COL&#40;wk&#41;))
return 2; //txp o escac i txp
else &#123;
if &#40;ROW&#40;wk&#41; != 1 && COL&#40;t&#41; > 2&#41;
return 2;
else
return 0;
&#125;
&#125;
else &#123;
if &#40;wk == 16 || wk == 17 || wk == 18&#41; &#123;
if &#40;wk == 18 && &#40;COL&#40;t&#41; == 0 || &#40;COL&#40;t&#41; == 2 && ROW&#40;t&#41; > 2&#41;))
return 2;
else
return 4; //farà mat
&#125;
else &#123;
if &#40;COL&#40;t&#41; > 2 && &#40;wk == 24 || wk == 25 || &#40;wk == 26 && ROW&#40;t&#41; == 1&#41;))
return 4;
else &#123;
if &#40;COL&#40;wk&#41; >= 2&#41;
return 2;
else &#123;
if &#40;COL&#40;t&#41; == 2 && ROW&#40;t&#41; > 3 && wk == t - 1&#41;
return 0;
else
return 2;
&#125;
&#125;

&#125;
&#125;
&#125;
else &#123; //c == white
//if &#40;Distance&#40;wk, p&#41; < 3&#41; //4248065
if ((&#40;t == 9 || t == 17&#41; && &#40;wk == t + 1 || wk == 10&#41;) || &#40;ROW&#40;wk&#41; == 0 && t == 9&#41;)
return 2;
else &#123;
if &#40;COL&#40;wk&#41; > 3 || ROW&#40;wk&#41; > 4&#41;
return 2;
else &#123;
if (&#40;Distance&#40;wk, 10&#41; < 2 && ROW&#40;t&#41; == 0&#41; || &#40;wk == 10&#41;)
return 4; //mat
else &#123;
if (&#40;COL&#40;t&#41; > 2 || t == 10&#41; && Distance&#40;wk, 18&#41; < 2&#41;
return 4;
else &#123;
if &#40;wk == 16 || wk == 17 || wk == 18&#41;
return 4;
else &#123;
if &#40;Distance&#40;wk, 17&#41; < 2 && &#40;t != 17 || &#40;ROW&#40;wk&#41; > 1 && wk != 26&#41;))
return 4;
else &#123;
if &#40;ROW&#40;wk&#41; == 4 && Distance&#40;wk, 17&#41; < 3 && ROW&#40;t&#41; == 1 && t > 10&#41;
return 4;
//return 2;
&#125;
&#125;
&#125;
&#125;
&#125;
&#125;

&#125;
&#125;

//cas especial taules
if &#40;p == 17 && wk == 0 && t == 16 && Distance&#40;bk, 10&#41; - &#40;c == black&#41; < 1&#41; &#123;
if (&#40;bk == 2 || bk == 10&#41; && c == black&#41;
return 0;
else
return 2;
&#125;

//cas especial taules
if &#40;p == 16 && c == black&#41; &#123;
if &#40;bk == 24 || bk == 26&#41; &#123;
if &#40;wk == 2 && t == 1&#41;
return 2;
else &#123;
if &#40;wk == 18 && t == 17&#41;
return 2;
&#125;
&#125;
else &#123;
if &#40;bk == 32 && t == 25 && wk == 18&#41;
return 2;
else &#123;
if &#40;bk == 33 && t == 26 && wk == 18&#41;
return 2;
&#125;
&#125;
&#125;

//cas especial taules
if &#40;p == 8 && t == 1 && bk == 24 && wk == 2&#41; &#123;
return 2;
&#125;

//casos especials
if &#40;ROW&#40;p&#41; == 1 && &#40;atp & Bit&#40;t&#41;) && Distance&#40;bk, p + 8&#41; < 2&#41; &#123;
if (&#40;atbk & Bit&#40;p - 8&#41;) && abs&#40;wk - bk&#41; != 2 && &#40;bk == 8 || &#40;wk != bk + 10 && wk != bk + 6&#41;))
return 2;
else &#123;
if &#40;atwk & Bit&#40;p + 8&#41;) &#123;
if &#40;ROW&#40;wk&#41; == 2 || ROW&#40;wk&#41; == 1 || ROW&#40;wk&#41; == ROW&#40;bk&#41;) &#123;
return 4;
&#125;
else
return 2;
&#125;
else &#123;
if &#40;Distance&#40;wk, p + 1&#41; < 2 && &#40;Distance&#40;bk, p + 9&#41; > 1 || &#40;atwk & Bit&#40;p + 9&#41;)))
return 4;
else &#123;
//return 2;
&#125;
&#125;
&#125;
&#125;

if &#40;ROW&#40;bk&#41; >= ROW&#40;p&#41; && ROW&#40;p&#41; > 1&#41; &#123;
struct InfoEval ie;
ie.rei&#91;white&#93; = lsb&#40;bwk&#41;;
ie.rei&#91;black&#93; = lsb&#40;bbk&#41;;
int antmou = ss->estat_actual->mou;
ss->estat_actual->mou = c;
int kpk = -eval_KPK&#40;ss, &ie, black&#41;;
ss->estat_actual->mou = antmou;
if &#40;kpk == 0&#41; &#123;
return 4;
&#125;
&#125;

//rei ha parat peó
if &#40;ROW&#40;p&#41; > ROW&#40;wk&#41; - &#40;c == white&#41; && ROW&#40;bk&#41; >= ROW&#40;p&#41; && Distance&#40;wk, p&#41; - &#40;c == white&#41; < Distance&#40;bk, p&#41; && ROW&#40;p&#41; - &#40;c == black&#41; >= 2&#41;
return 4;

//cas especial
if &#40;COL&#40;bk&#41; == 0 && COL&#40;p&#41; == 0 && ROW&#40;p&#41; > 2 - &#40;c == black&#41; && &#40;wk == 2 || wk == 10&#41;) &#123;
if &#40;p == 16 && t == 17 && wk == 10 & bk == 0 && c == black&#41;
return 2;
else
return 4;
&#125;

//rei parant peo
if &#40;COL&#40;wk&#41; == COL&#40;p&#41; + 1 && c == white && ROW&#40;wk&#41; < ROW&#40;p&#41;) &#123;
if &#40;ROW&#40;p&#41; == 1 && p == wk + 7&#41; &#123;
if &#40;ROW&#40;t&#41; == 0&#41;
return 4;
else &#123;
if &#40;COL&#40;t&#41; == COL&#40;wk&#41; || COL&#40;t&#41; == COL&#40;wk&#41; + 2&#41; &#123;
if &#40;ROW&#40;bk&#41; == 0&#41;
return 2;  //clavarà dama amb torre
else &#123;
if &#40;COL&#40;bk&#41; == 0&#41; &#123;
if &#40;ROW&#40;t&#41; > ROW&#40;bk&#41; + 2&#41;
return 2; //fent escac canvia dama per torre
else
return 0;
&#125;
else
return 0;
&#125;
&#125;
else &#123;
if &#40;ROW&#40;bk&#41; == 0 && COL&#40;bk&#41; - COL&#40;t&#41; > 1&#41;
return 2; //farà escac per primera canviant dama x torre
else &#123;
if &#40;COL&#40;bk&#41; == 0&#41; &#123;
if &#40;ROW&#40;t&#41; > ROW&#40;bk&#41; + 2&#41;
return 2; //fent escac canvia dama per torre
else
return 0;
&#125;
else
return 0;
&#125;
&#125;
&#125;
&#125;
else &#123;
if &#40;bk == 8 && &#40;t == 18 || t == 2&#41; && p == 17&#41;
return 2;
else &#123;
if &#40;bk == 9 && &#40;t == 16 || t == 19&#41; && p == 18&#41;
return 2;
else &#123;
if &#40;bk == 10 && &#40;t == 17 || t == 20&#41; & p == 19&#41;
return 2;
else
return 4;
&#125;
&#125;
&#125;
&#125;

//rei parant peo
if &#40;COL&#40;wk&#41; == COL&#40;p&#41; - 1 && c == white && ROW&#40;wk&#41; < ROW&#40;p&#41;) &#123;
if &#40;ROW&#40;p&#41; == 1 && p == wk + 9&#41; &#123;
if &#40;ROW&#40;t&#41; == 0&#41;
return 4;
else &#123;
if &#40;COL&#40;wk&#41; == 0&#41;
return 0;
else &#123;
if &#40;COL&#40;t&#41; == COL&#40;wk&#41; || COL&#40;t&#41; == COL&#40;wk&#41; - 2&#41; &#123;
if &#40;ROW&#40;bk&#41; == 0&#41;
return 2;  //clavarà dama amb torre
else &#123;
return 0;
&#125;
&#125;
else &#123;
if &#40;ROW&#40;bk&#41; == 0 && COL&#40;t&#41; - COL&#40;bk&#41; > 1&#41;
return 2; //farà escac per primera canviant dama x torre
else &#123;
return 0;
&#125;
&#125;
&#125;
&#125;
&#125;
else &#123;
if &#40;bk == 10 && t == 19 && p == 17&#41;
return 2;
else &#123;
if &#40;bk == 11 && &#40;t == 17 || t == 20&#41; && p == 18&#41;
return 2;
else &#123;
if &#40;bk == 12 && &#40;t == 18 || t == 21&#41; & p == 19&#41;
return 2;
else
return 4;
&#125;
&#125;
&#125;
&#125;

//rei i torre podran parar peo
if &#40;c == black && COL&#40;wk&#41; == COL&#40;p&#41; + 1 && ROW&#40;p&#41; > ROW&#40;wk&#41; + 1&#41; &#123;
if &#40;ROW&#40;p&#41; > ROW&#40;wk&#41; + 2 || ROW&#40;p&#41; > 2&#41; &#123;
if &#40;t == 10 && p == 25 && bk == 0&#41;
return 2;
else &#123;
if &#40;t == 2 && p == 25 && bk == 8&#41;
return 2;
else
return 4;
&#125;
&#125;
else &#123;
if &#40;bk == 0 && p == 17 && t == 18&#41;
return 2;
else &#123;
if &#40;ROW&#40;t&#41; == 1 || ROW&#40;t&#41; == 0 || COL&#40;t&#41; == COL&#40;p&#41; || &#40;COL&#40;t&#41; == COL&#40;bk&#41; && ROW&#40;t&#41; > 2&#41;
|| &#40;COL&#40;p&#41; - COL&#40;bk&#41; >= 2 && &#40;COL&#40;t&#41; > COL&#40;p&#41; + 1 || ROW&#40;t&#41; > ROW&#40;p&#41;))
|| &#40;COL&#40;bk&#41; - COL&#40;p&#41; > 1&#41;
)
return 4;
else &#123;
if &#40;ROW&#40;bk&#41; > 1&#41; &#123;
if &#40;t == p + 1&#41;
return 2;
else
return 4;
&#125;
else
if &#40;ROW&#40;bk&#41; == 0&#41; &#123;
if &#40;COL&#40;bk&#41; + 1 == COL&#40;p&#41;) &#123;
if &#40;COL&#40;t&#41; == COL&#40;bk&#41; - 1&#41;
return 0;
else &#123;
if &#40;COL&#40;t&#41; == COL&#40;wk&#41; + 1&#41; &#123;
if &#40;ROW&#40;t&#41; == 2&#41;
return 0;
else &#123;
if &#40;COL&#40;bk&#41; == 0&#41;
return 2;
else
return 0;
&#125;
&#125;
else &#123;
if &#40;COL&#40;t&#41; == COL&#40;wk&#41; + 2 || COL&#40;t&#41; == COL&#40;wk&#41; || &#40;ROW&#40;t&#41; > 2 && COL&#40;bk&#41; == 0&#41; || COL&#40;bk&#41; - COL&#40;t&#41; > 1&#41;
return 2;
else
return 0;
&#125;
&#125;
&#125;
else &#123;
if &#40;bk == 0 && &#40;t == 16 || t == 19&#41;)
return 2;
else &#123;
if &#40;bk == 1 && &#40;t == 17 || t == 20&#41;)
return 2;
else
return 4;
&#125;
&#125;
&#125;
else &#123;
//ROW&#40;bk&#41; == 1
if &#40;ROW&#40;t&#41; == 2&#41; &#123;
if &#40;COL&#40;bk&#41; + 2 == COL&#40;p&#41;)
return 2;
else
return 0;
&#125;
else &#123;
if &#40;ROW&#40;t&#41; == 3&#41;
return 0;
else &#123;
if &#40;COL&#40;bk&#41; == 0&#41;
return 2;
else
return 0;
&#125;
&#125;
&#125;
&#125;
&#125;
&#125;
&#125;

//rei i torre podran parar peo
if &#40;c == black && COL&#40;wk&#41; == COL&#40;p&#41; - 1 && ROW&#40;p&#41; > ROW&#40;wk&#41; + 1&#41; &#123;
if &#40;ROW&#40;p&#41; > ROW&#40;wk&#41; + 2 || ROW&#40;p&#41; > 2&#41; &#123;
return 4;
&#125;
else &#123;
if &#40;ROW&#40;t&#41; == 1 || ROW&#40;t&#41; == 0 || COL&#40;t&#41; == COL&#40;p&#41; || &#40;COL&#40;t&#41; == COL&#40;bk&#41; && ROW&#40;t&#41; > 2&#41;
|| &#40;COL&#40;bk&#41; - COL&#40;p&#41; >= 2 && &#40;COL&#40;t&#41; < COL&#40;p&#41; - 1 || ROW&#40;t&#41; > ROW&#40;p&#41;))
|| &#40;COL&#40;p&#41; - COL&#40;bk&#41; > 1&#41;
)
return 4;
else &#123;
if &#40;ROW&#40;bk&#41; > 1&#41; &#123;
if &#40;t == p - 1&#41;
return 2;
else
return 4;
&#125;
else
if &#40;ROW&#40;bk&#41; == 0&#41; &#123;
if &#40;COL&#40;p&#41; + 1 == COL&#40;bk&#41;) &#123;
if &#40;COL&#40;t&#41; == COL&#40;bk&#41; + 1&#41;
return 0;
else &#123;
if &#40;COL&#40;wk&#41; == COL&#40;t&#41; + 1&#41; &#123;
if &#40;ROW&#40;t&#41; == 2&#41;
return 0;
else
return 0;
&#125;
else &#123;
if &#40;COL&#40;wk&#41; == 0&#41;
return 0;
else &#123;
if &#40;COL&#40;wk&#41; == COL&#40;t&#41; + 2 || COL&#40;t&#41; == COL&#40;wk&#41; || COL&#40;t&#41; - COL&#40;bk&#41; > 1&#41;
return 2;
else
return 0;
&#125;
&#125;
&#125;
&#125;
else &#123;
if &#40;bk == 3 && t == 19&#41;
return 2;
else &#123;
if &#40;bk == 4 && &#40;t == 17 || t == 20&#41;)
return 2;
else &#123;
if &#40;bk == 5 && &#40;t == 18 || t == 21&#41;)
return 2;
else
return 4;
&#125;
&#125;
&#125;
&#125;
else &#123;
//ROW&#40;bk&#41; == 1
if &#40;ROW&#40;t&#41; == 3&#41; &#123;
return 0;
&#125;
else &#123;
if &#40;COL&#40;p&#41; + 1 < COL&#40;bk&#41;) &#123;
if &#40;t + 1 == p&#41;
return 2;
else
return 4;
&#125;
else
return 0;
&#125;
&#125;
&#125;
&#125;
&#125;

//reib apropant-se al peó per parar-lo
if &#40;ROW&#40;p&#41; > 3 && ROW&#40;wk&#41; < ROW&#40;p&#41; && Distance&#40;wk, p&#41; < ROW&#40;p&#41;) &#123;
if &#40;c == white&#41;
return 4;
else &#123;
if &#40;Distance&#40;wk, COL&#40;p&#41;) < ROW&#40;p&#41; - &#40;ROW&#40;p&#41; == 6&#41;) &#123;
if &#40;p == 35 && wk == 8 && bk == 10 && t == 0&#41;
return 2;
else &#123;
if &#40;COL&#40;p&#41; > 0 && ROW&#40;p&#41; == 4 && bk == p - 23 && wk == bk + 2 && t == wk - 8&#41;
return 2;
else &#123;
if &#40;COL&#40;wk&#41; == 0 && COL&#40;p&#41; == 3 && bk == 10&#41; &#123;
if &#40;p == 35 && wk == 24 && &#40;t == 4 || t == 5 || t == 6 || t == 7 || t == 20 || t == 21 || t == 22 || t == 23&#41;)
return 2;
else
return 4;
&#125;
else &#123;
if &#40;ROW&#40;bk&#41; == 1 && COL&#40;p&#41; + 1 == COL&#40;bk&#41;) &#123;
if &#40;wk == bk + 18 && ROW&#40;p&#41; < 5 && COL&#40;t&#41; < COL&#40;p&#41; && &#40;ROW&#40;t&#41; == 0 || ROW&#40;t&#41; == 2&#41;)
return 2;
else &#123;
if &#40;COL&#40;wk&#41; > COL&#40;bk&#41; + 2 && ROW&#40;wk&#41; > 3 && COL&#40;t&#41; < COL&#40;p&#41; && &#40;ROW&#40;t&#41; == 0 || ROW&#40;t&#41; == 2&#41;)
return 2;
else
return 4;
&#125;
&#125;
else &#123;
if &#40;bk == 18 && wk == 24 && p == 35 && (&#40;ROW&#40;t&#41; == 1 || ROW&#40;t&#41; == 3&#41; && COL&#40;t&#41; > COL&#40;p&#41;))
return 2;
else &#123;
if &#40;bk == 18 && p == 33 && wk == 28 && t == 8&#41;
return 2;
else &#123;
if (!&#40;COL&#40;t&#41; < COL&#40;p&#41; && &#40;ROW&#40;t&#41; == 1 || ROW&#40;t&#41; == 3&#41;)) //torre mal posada
return 4;
else &#123;
if (&#40;p == 41 || p == 49&#41; && bk == 18 && wk == 37&#41;
return 2;
else &#123;
if &#40;p == 34 && wk == 29 && bk == 19&#41;
return 2;
else &#123;
if (&#40;p == 42 || p == 50&#41; && wk == 38 && bk == 19&#41;
return 2;
else &#123;
if &#40;p == 35 && wk == 30 && bk == 20&#41;
return 2;
else &#123;
if (&#40;p == 43 || p == 51&#41; && wk == 39 && bk == 20&#41;
return 2;
else
return 4;
&#125;
&#125;
&#125;
&#125;
&#125;
&#125;
&#125;
&#125;
&#125;
&#125;
&#125;
&#125;
&#125;
&#125;

//reib apropant-se al peó per parar-lo
if &#40;ROW&#40;p&#41; > 3 && Distance&#40;wk, COL&#40;p&#41;) - &#40;c == white&#41; - bkingincheck < 3&#41;
return 4;

//reib apropant - se al peó per parar-lo
if &#40;ROW&#40;p&#41; > 3 && ROW&#40;wk&#41; == 0 &&
(&#40;ROW&#40;t&#41; == 0 && ROW&#40;p&#41; > 4 && COL&#40;wk&#41; - &#40;c == white&#41; < 6&#41;
|| &#40;Distance&#40;wk, COL&#40;p&#41;) - &#40;c == white&#41; - bkingincheck < 5&#41;
)
) &#123;
if &#40;wk == 5 && p == 33 && (&#40;bk == 18 && t == 8&#41; || &#40;bk == 10 && &#40;t == 0 || t == 10 || t == 16&#41;) || &#40;bk == 0 && t == 10&#41; || &#40;bk == 8 && &#40;t == 2 || t == 18&#41;)) && c == black&#41;
return 2;
else &#123;
if &#40;wk == 4 && p == 32 && (&#40;bk == 1 && t == 11&#41; || &#40;bk == 9 && &#40;t == 3 || t == 19&#41;)) && c == black&#41;
return 2;
else &#123;
if &#40;wk == 6 && p == 34 && (&#40;bk == 19 && t == 9&#41; || &#40;bk == 17 && t == 11&#41; || &#40;bk == 11 && &#40;t == 1 || t == 17&#41;) || &#40;bk == 1 && t == 11&#41; || &#40;bk == 9 && &#40;t == 3 || t == 19&#41;)) && c == black&#41;
return 2;
else &#123;
if &#40;wk == 7 && p == 35 && (&#40;bk == 20 && t == 10&#41; || &#40;bk == 18 && t == 12&#41; || &#40;bk == 12 && &#40;t == 2 || t == 18&#41;) || &#40;bk == 2 && t == 12&#41; || &#40;bk == 10 && &#40;t == 4 || t == 20&#41;)) && c == black&#41;
return 2;
else &#123;
return 4;
&#125;
&#125;
&#125;
&#125;
&#125;

//torre amenaça peó i se'l menjarà
if &#40;COL&#40;t&#41; == COL&#40;p&#41; && Distance&#40;bk, p&#41; - &#40;c == black&#41; > 1 && &#40;rattacks & Bit&#40;p&#41;)) &#123;
if (!&#40;c == black && ROW&#40;p&#41; == 6 && &#40;p - bk == 25 || p - bk == 23&#41;)) &#123; //que avançant dos caselles no quedi defensat
if &#40;c == black&#41; &#123;
if &#40;wk == 57 && bk == 24 && p == 48 && t == 56&#41;
return 2;
else &#123;
if (&#40;wk == 61 || wk == 62 || wk == 63&#41; && bk == 25 && p == 49 && t == 57&#41;
return 2;
else &#123;
if (&#40;wk == 62 || wk == 63&#41; && bk == 26 && p == 50 && t == 58&#41;
return 2;
else &#123;
if &#40;wk == 63 && bk == 27 && p == 51 && t == 59&#41;
return 2;
else &#123;
if &#40;wk == 40 && bk == 56 && p == 9 && &#40;t == 17 || t == 25 || t == 33 || t == 41&#41;)
return 2;
else
return 4;
&#125;
&#125;
&#125;
&#125;
&#125;
else
return 4;
&#125;
&#125;

//peo retrassat
if &#40;ROW&#40;p&#41; + &#40;c == white&#41; > 3 && Distance&#40;bk, p&#41; - &#40;c == black&#41; > 4&#41; &#123;
if &#40;rattacks & rook_attacks&#40;p + 8, allpieces&#41;) //torre podrà anar davant peó i menjar-lo
return 4;
else &#123;
if (&#40;rattacks & rook_attacks&#40;COL&#40;p&#41;, allpieces&#41;) && Distance&#40;bk, COL&#40;p&#41;) + &#40;c == white&#41; > 2&#41; //torre podrà anar davant peó i menjar-lo
return 4;
&#125;
&#125;

//peo retrassat a columna A
if &#40;COL&#40;p&#41; == 0 && ROW&#40;p&#41; > 3&#41; &#123;
if &#40;Distance&#40;wk, COL&#40;p&#41;) - &#40;c == white&#41; - &#40;ROW&#40;bk&#41; == 0&#41; < 4&#41; &#123;
if &#40;wk == 36 && bk == 17 && t == 10&#41;
return 2;
else &#123;
if &#40;wk == 4 && bk == 1 && t == 11 && p == 32&#41;
return 2;
else
return 4;
&#125;
&#125;
else &#123;
/*if &#40;Distance&#40;wk, COL&#40;p&#41;) > 6&#41;
return 2;*/
&#125;
&#125;

//cas especial mat
//5310956
if (!bkingincheck && bk == 7 && &#40;wk == 13 || wk == 22&#41;) &#123;
if &#40;c == white&#41;
return 4;
else &#123;
if &#40;wk == 13&#41; &#123;
if &#40;ROW&#40;t&#41; == 1&#41; &#123;
if &#40;t == 12&#41;
return 2;
else
return 0;
&#125;
else &#123;
if &#40;p == 11 && &#40;t == 18 || t == 20&#41;) &#123;
return 2; //tisores de caball
&#125;
else
if &#40;ROW&#40;p&#41; == 1&#41; &#123;
if (&#40;rattacks & COLUMNAH&#41; & PrecalculAlfil&#91;p - 8&#93;) &#123; //dama al coronar evitarà mat per columna H
if &#40;COL&#40;t&#41; == 4&#41;
return 2; //escac a e1
else
return 0; //dama evita mat
&#125;
else
return 4; //mat
&#125;
else
return 4; //mat
&#125;
&#125;
else &#123;
//wk == 22
if &#40;ROW&#40;p&#41; == 1&#41;
return 0;
else &#123;
if &#40;ROW&#40;p&#41; == 1&#41; &#123;
if (&#40;rattacks & COLUMNAH&#41; & PrecalculAlfil&#91;p - 8&#93;) &#123; //dama al coronar evitarà mat per columna H
return 0; //dama evita mat
&#125;
else
return 4; //mat
&#125;
else
return 4; //mat
&#125;
&#125;
&#125;
&#125;

//cas especial mat
if &#40;bk == 63 && !bkingincheck && &#40;wk == 46 || wk == 53&#41;) &#123;
if &#40;c == white&#41;
return 4;
else &#123;
if &#40;wk == 46&#41; &#123;
if &#40;p == 9&#41;
return 0;
else &#123;
if &#40;COL&#40;t&#41; == 6 && ROW&#40;p&#41; == 1&#41;
return 0;
else
return 4;
&#125;
&#125;
else
&#123; //wk == 53
if &#40;ROW&#40;t&#41; == 6 && ROW&#40;p&#41; == 1&#41;
return 0;
else &#123;
if &#40;p == 9&#41;
return 2; //tapa escac amb dama
else &#123;
if &#40;ROW&#40;p&#41; == 1&#41; &#123;
if (&#40;rattacks & COLUMNAH&#41; & PrecalculAlfil&#91;p - 8&#93;) &#123; //dama al coronar evitarà mat per columna H
return 0; //dama evita mat
&#125;
else
return 4; //mat
&#125;
else
return 4; //mat
&#125;
&#125;
&#125;
&#125;
&#125;

if &#40;ROW&#40;p&#41; == 1 && ROW&#40;bk&#41; == 0 && c == black && !&#40;atwhite & Bit&#40;p - 8&#41;) && bk != p - 8 && !bkingincheck&#41; &#123;
Bitboard b = &#40;rattacks & atwk&#41; & FILA1; //casella on torre pot anar a 1a defensat per rei
bool torreatacapeo = rattacks & Bit&#40;p&#41;;
if &#40;b&#41; &#123;
if &#40;ROW&#40;wk&#41; == 1&#41; &#123;
if &#40;COL&#40;t&#41; > COL&#40;bk&#41; && COL&#40;t&#41; > COL&#40;p&#41;) &#123;
if &#40;COL&#40;bk&#41; > COL&#40;p&#41; + 3 || &#40;COL&#40;bk&#41; > COL&#40;p&#41; + 1 && torreatacapeo&#41;)
return 4;
else
return 2;
&#125;
else &#123;
if &#40;COL&#40;t&#41; < COL&#40;bk&#41; && COL&#40;t&#41; < COL&#40;p&#41;) &#123;
return 2;
&#125;
else
if &#40;COL&#40;t&#41; > COL&#40;p&#41; && COL&#40;bk&#41; == COL&#40;t&#41; + 1&#41;
return 0;
&#125;
&#125;
&#125;
&#125;

//corona i potser guanya
if &#40;c == black && !bkingincheck && ROW&#40;p&#41; == 1 && ROW&#40;t&#41; != 0 && COL&#40;t&#41; < COL&#40;p&#41; && bk != p - 8&#41; &#123;
//return 0;
if &#40;ROW&#40;t&#41; == ROW&#40;bk&#41;) &#123;
if &#40;ROW&#40;wk&#41; == ROW&#40;t&#41;) &#123;
if &#40;COL&#40;wk&#41; < COL&#40;p&#41; && COL&#40;t&#41; < COL&#40;wk&#41;)
return 0;
else &#123;
if &#40;Distance&#40;bk, p&#41; > 2&#41; &#123;
if &#40;ROW&#40;wk&#41; == ROW&#40;bk&#41; && wk < bk && p < wk&#41;
return 0;
else
return 4;
&#125;
else &#123;
return 2;
&#125;
&#125;
&#125;
else &#123;
return 2;
&#125;
&#125;
else &#123;
if &#40;COL&#40;p&#41; == COL&#40;wk&#41;) &#123;
//aquí COL&#40;bk&#41; == COL&#40;p&#41;)
if &#40;ROW&#40;t&#41; < ROW&#40;bk&#41; || ROW&#40;t&#41; >= ROW&#40;wk&#41;)
return 0;
else &#123;
if &#40;ROW&#40;wk&#41; > ROW&#40;t&#41; + 1&#41; &#123;
if &#40;ROW&#40;t&#41; > ROW&#40;bk&#41; + 1&#41;
return 2;
else
return 0;
&#125;
else &#123;
if &#40;Distance&#40;bk, p&#41; > 3&#41;
return 4;
else
return 2;
&#125;
&#125;
&#125;
else &#123;
if &#40;COL&#40;bk&#41; == 0 && wk == bk + 2&#41; &#123; //casos especials mat
if &#40;abs&#40;ROW&#40;t&#41; - ROW&#40;bk&#41;) == 1&#41;
return 0;
else &#123;
if (&#40;p == 11 && wk == 18&#41; || &#40;p == 11 && wk == 34 && ROW&#40;t&#41; < ROW&#40;bk&#41;))
return 2;
else &#123;
if &#40;p == 11 && &#40;bk == 40 || bk == 48 || bk == 56&#41; && ROW&#40;t&#41; == 3&#41;
return 0;
else
return 4;
&#125;
&#125;
&#125;
else &#123;
//return 0;
if &#40;COL&#40;p&#41; == 2 && COL&#40;bk&#41; < 2 && ROW&#40;t&#41; > ROW&#40;bk&#41; && ROW&#40;wk&#41; == ROW&#40;t&#41; + 1&#41; &#123;
if &#40;ROW&#40;t&#41; < 3&#41;
return 0;
else &#123;
if &#40;COL&#40;wk&#41; == 0&#41;
return 0;
else &#123;
if &#40;COL&#40;wk&#41; > 1&#41;
return 0;
else
return 2;
&#125;

&#125;
&#125;
else &#123;
if &#40;p == 11 && COL&#40;t&#41; == 1 && wk == 0&#41;
return 2;
else &#123;
if &#40;wk == 8 && bk == 2&#41; &#123;
if &#40;ROW&#40;t&#41; == 2&#41;
return 0;
else
return 2;
&#125;
else &#123;
if &#40;bk == p - 7 && wk == bk + 10&#41; &#123;
if &#40;ROW&#40;t&#41; < 3&#41;
return 0;
else
return 2;
&#125;
else
&#123;
if &#40;COL&#40;t&#41; == 0 && bk == 2 && p == 11 && !&#40;COL&#40;wk&#41; == 0 && wk < t&#41; && !&#40;wk == t + 1&#41; && !&#40;wk == t + 2 && wk != 18&#41;)
return 2;
else &#123;
if &#40;p == 10 && &#40;wk == 0 || wk == 8&#41; && COL&#40;t&#41; == 1 && ROW&#40;bk&#41; == 0&#41;
return 2;
else &#123;
if &#40;p == 11 && &#40;wk == 1 || wk == 9&#41; && COL&#40;t&#41; == 2 && ROW&#40;bk&#41; == 0&#41;
return 2;
else &#123;
if &#40;wk == 8 && bk == 10&#41; &#123;
if &#40;ROW&#40;t&#41; == 2 || ROW&#40;t&#41; == 3&#41;
return 0;
else
return 2;
&#125;
else &#123;
if &#40;wk == bk + 2 && COL&#40;bk&#41; == COL&#40;p&#41; + 1&#41; &#123;
if &#40;ROW&#40;t&#41; <= ROW&#40;bk&#41; + 2 || ROW&#40;wk&#41; == 0&#41;
return 0;
else
return 2;
&#125;
else &#123;
if &#40;COL&#40;bk&#41; == 7 && wk == bk - 2 && abs&#40;ROW&#40;t&#41; - ROW&#40;bk&#41;) > 1 &&
!(&#40;rattacks & COLUMNAH&#41; & PrecalculAlfil&#91;p - 8&#93;)  //dama al coronar evitarà mat per columna H
) &#123;
if &#40;ROW&#40;t&#41; > ROW&#40;bk&#41; && &#40;PrecalculAlfil&#91;p - 8&#93; & Bit&#40;bk + 8&#41;))
return 2; //tapa de dama
else &#123;
if &#40;ROW&#40;t&#41; < ROW&#40;bk&#41; && &#40;PrecalculAlfil&#91;p - 8&#93; & Bit&#40;bk - 8&#41;))
return 2; //tapa de dama
else
return 4;
&#125;
&#125;
else &#123;
if &#40;COL&#40;bk&#41; == COL&#40;p&#41;) &#123;
if &#40;ROW&#40;t&#41; > ROW&#40;bk&#41; + 2&#41; &#123;
if &#40;Distance&#40;wk, p&#41; < 3&#41; &#123;
if &#40;Distance&#40;bk, p&#41; < 3&#41;
return 2;
else &#123;
if &#40;knight_attacks&#91;p - 8&#93; & bwk&#41; &#123; //fa escac de caball al coronar
if (&#40;wk == 11 || wk == 18&#41; && bk == 33&#41;
return 4;
else
return 2;
&#125;
else
return 4;
&#125;
&#125;
else &#123;
if &#40;Distance&#40;wk, p&#41; < 3 && Distance&#40;bk, p&#41; == 3&#41;
return 4;
else &#123;
if &#40;ROW&#40;t&#41; == ROW&#40;wk&#41; && COL&#40;wk&#41; <= COL&#40;p&#41; && COL&#40;t&#41; < COL&#40;wk&#41;)
return 0;
else &#123;
if &#40;bk == p + 24 && &#40;wk == p + 3 || wk == p - 3&#41;)
return 4;
else
return 2;
&#125;
&#125;
&#125;
&#125;
else &#123;

&#125;
&#125;
&#125;
&#125;
&#125;
&#125;
&#125;
&#125;
&#125;
&#125;
&#125;
&#125;
&#125;
&#125;
&#125;
&#125;
return 999;
&#125;

``````

hgm
Posts: 22909
Joined: Fri Mar 10, 2006 9:06 am
Location: Amsterdam
Full name: H G Muller
Contact:

### Re: advanced krkp function

cdani wrote:It solves a big part (if I remember well + than 50%) of the positions with tablebase like resolution.
I suppose you mean with bitbase-like resolution. You don't get any DTM/DTZ.

How important is it really to go into so much detail? When I was doing KPK evaluation in KingSlayer, I noticed that the only important thing is really to recognize some certain-draw positions, where it would take very long for the draw to become apparent. Positions where a draw is achieved quickly, e.g. because of stalemate or because the Pawn gets lost, are found very quickly by the search.
Last edited by hgm on Sat May 06, 2017 12:43 pm, edited 2 times in total.

cdani
Posts: 2095
Joined: Sat Jan 18, 2014 9:24 am
Location: Andorra
Contact:

### Re: advanced krkp function

hgm wrote:
cdani wrote:It solves a big part (if I remember well + than 50%) of the positions with tablebase like resolution.
I suppose you mean with bitbase-like resolution. You don't get any DTM/DTZ.
Sorry, yes

Daniel Anulliero
Posts: 652
Joined: Fri Jan 04, 2013 3:55 pm
Location: Nice

### Re: advanced krkp function

Great work Daniel !
So , Mr Sean and Henk can see your own work for Andscacs

AlvaroBegue
Posts: 912
Joined: Tue Mar 09, 2010 2:46 pm
Location: New York
Full name: Álvaro Begué (RuyDos)

### Re: advanced krkp function

I'll definitely give this a try. I'll just translate the comments from Catalan to Basque so more people can read them.

cdani
Posts: 2095
Joined: Sat Jan 18, 2014 9:24 am
Location: Andorra
Contact:

### Re: advanced krkp function

AlvaroBegue wrote:I'll definitely give this a try. I'll just translate the comments from Catalan to Basque so more people can read them.

Nice!

I forgot to tell that it requires also a KPK endgame bitbase accessible (the call to eval_KPK). The function uses it to find a lot of won endgames, because if the kpk endgame was draw, then the krkp is won for the rook side on most cases (the drawn cases are filtered previously to this call to eval_KPK).

cdani
Posts: 2095
Joined: Sat Jan 18, 2014 9:24 am
Location: Andorra
Contact:

### Re: advanced krkp function

hgm wrote: How important is it really to go into so much detail? When I was doing KPK evaluation in KingSlayer, I noticed that the only important thing is really to recognize some certain-draw positions, where it would take very long for the draw to become apparent. Positions where a draw is achieved quickly, e.g. because of stalemate or because the Pawn gets lost, are found very quickly by the search.
Sorry, I didn't saw the rest of your message, or maybe was not there when I first answered.

Really not important in most cases as you tell. I have done it more for fun than for anything else. Anyway should be a bit better than a basic function, but probably not really measurable in elo.

I have done also the KNPK (yes, against a lone king). Contrary to what one can think at first, is full of draws. Is bigger than this one, over 2000 lines of code due to that the exceptions are very common but more sparse, and difficult to grab a lot of them in a few instructions, so often it compares against little local (local to the "if") databases of positions such exceptions. Maybe I will publish it when I clean a little. Of course it solves the typical a7 pawn a8 wk c7/c8 bk that is draw due to the inability of the knight to win tempos, this with a few if's.

I also have done other way of doing a shorter function for KRPKB that instead of going exact, returns a typical eval related to the possibilities of winning/drawing of different structures of the pieces/pawns, comparing all the posibilities thanks to syzygy so selecting the wheigths that return more similar results to the tablebase.

velmarin
Posts: 1580
Joined: Mon Feb 21, 2011 8:48 am

### Re: advanced krkp function

AlvaroBegue wrote:I'll definitely give this a try. I'll just translate the comments from Catalan to Basque so more people can read them.
Not much difference, the Basques shave their beard without foam, the Catalans if they use it.

brtzsnr
Posts: 433
Joined: Fri Jan 16, 2015 3:02 pm
Contact:

### Re: advanced krkp function

What would be the Elo gain of this function? Endgame evaluation didn't work so far for me which is why it's completely missing from my engine. I tried a few things like KmKm is draw, or bitbase for KpK.

cdani
Posts: 2095
Joined: Sat Jan 18, 2014 9:24 am
Location: Andorra
Contact:

### Re: advanced krkp function

brtzsnr wrote:What would be the Elo gain of this function? Endgame evaluation didn't work so far for me which is why it's completely missing from my engine. I tried a few things like KmKm is draw, or bitbase for KpK.
Near 0. As told was more for fun than for anything practical.

Yo can win something with endgame functions as you start to accumulate quite a few of them, starting from the most basic ones and going up covering the most common ones.