//----------------------------------------------------------------------------------------------- public factor KRPKB(cPosicion pos) { if ((pos.GetNumPiezas(cPieza.PEON) & (cBitBoard.A | cBitBoard.H)) != 0) { sq ksq = pos.GetRey(m_cDebil); sq bsq = pos.GetList(m_cDebil, cPieza.ALFIL)[0]; sq nCasillaPeon = pos.GetList(m_cFuerte, cPieza.PEON)[0]; fila rk = cTypes.FilaProxima(m_cFuerte, nCasillaPeon); sq push = cTypes.AtaquePeon(m_cFuerte); if (rk == FILA.F5 && !cTypes.IsColorContrario(bsq, nCasillaPeon)) { int d = cBitBoard.Distancia(nCasillaPeon + 3 * push, ksq); if (d <= 2 && !(d == 0 && ksq == pos.GetRey(m_cFuerte) + 2 * push)) return (24); else return (48); } if (rk == FILA.F6 && cBitBoard.Distancia(nCasillaPeon + 2 * push, ksq) <= 1 && (cBitBoard.m_PseudoAtaques[cPieza.ALFIL][bsq] & cBitBoard.m_nCasillas[(nCasillaPeon + push)]) != 0 && cBitBoard.ColumDistancia(bsq, nCasillaPeon) >= 2) return (8); } return cFactorEscala.NAN; }
//---------------------------------------------------------------------------------------------------------- public static pnt EvalPiezas(cPosicion pos, cEvalInfo ei, pnt[] mobility, bitbrd[] mobilityArea, type Pt, color colr) { if (colr == cColor.BLANCO && Pt == cPieza.REY) { return 0; } bitbrd b; sq s; pnt nPuntos = 0; type NextPt = (colr == cColor.BLANCO ? Pt : (Pt + 1)); color colorVS = (colr == cColor.BLANCO ? cColor.NEGRO : cColor.BLANCO); sq[] pl = pos.GetList(colr, Pt); int plPos = 0; ei.m_Ataques[colr][Pt] = 0; while ((s = pl[plPos++]) != cCasilla.NONE) { b = Pt == cPieza.ALFIL ? cBitBoard.AtaquesPieza(s, pos.Piezas() ^ pos.PiezasColor(colr, cPieza.DAMA), cPieza.ALFIL) : Pt == cPieza.TORRE ? cBitBoard.AtaquesPieza(s, pos.Piezas() ^ pos.PiezasColor(colr, cPieza.TORRE, cPieza.DAMA), cPieza.TORRE) : pos.attacks_from_square_piecetype(s, Pt); if ((ei.m_Clavadas[colr] & cBitBoard.m_nCasillas[s]) != 0) b &= cBitBoard.m_EnLinea[pos.GetRey(colr)][s]; ei.m_Ataques[colr][cPieza.NAN] |= ei.m_Ataques[colr][Pt] |= b; if ((b & ei.m_ReyAcorralado[colorVS]) != 0) { ei.m_AtaquesAlRey[colr]++; ei.m_PesoAtaquesAlRey[colr] += KingAttackWeights[Pt]; bitbrd bb = (b & ei.m_Ataques[colorVS][cPieza.REY]); if (bb != 0) ei.m_ZonaDelRey[colr] += cBitBoard.CountMax15(bb); } if (Pt == cPieza.DAMA) b &= ~(ei.m_Ataques[colorVS][cPieza.CABALLO] | ei.m_Ataques[colorVS][cPieza.ALFIL] | ei.m_Ataques[colorVS][cPieza.TORRE]); int mob = (Pt != cPieza.DAMA ? cBitBoard.CountMax15(b & mobilityArea[colr]) : cBitBoard.Count(b & mobilityArea[colr])); mobility[colr] += m_Movilidad[Pt][mob]; if ((ei.m_Ataques[colorVS][cPieza.PEON] & cBitBoard.m_nCasillas[s]) != 0) nPuntos -= ThreatenedByPawn[Pt]; if (Pt == cPieza.ALFIL || Pt == cPieza.CABALLO) { if (Pt == cPieza.ALFIL) nPuntos -= m_AlfilEnPeon * ei.m_Peones.PeonesMismoColor(colr, s); if (0 == (pos.PiezasColor(colorVS, cPieza.PEON) & cBitBoard.AtaquePeon(colr, s))) nPuntos += evaluate_outposts(pos, ei, s, Pt, colr); if (cTypes.FilaProxima(colr, s) < FILA.F5 && (pos.GetNumPiezas(cPieza.PEON) & cBitBoard.m_nCasillas[(s + cTypes.AtaquePeon(colr))]) != 0) nPuntos += m_CercaDePeon; } if (Pt == cPieza.TORRE) { if (cTypes.FilaProxima(colr, s) >= FILA.F5) { bitbrd pawns = pos.PiezasColor(colorVS, cPieza.PEON) & cBitBoard.m_PseudoAtaques[cPieza.TORRE][s]; if (pawns != 0) nPuntos += cBitBoard.CountMax15(pawns) * m_TorreEnPeon; } if (ei.m_Peones.SemiAbierta(colr, cTypes.Columna(s)) != 0) nPuntos += ei.m_Peones.SemiAbierta(colorVS, cTypes.Columna(s)) != 0 ? m_TorreColAbierta : m_TorreColumnaSemiAbierta; if (mob > 3 || ei.m_Peones.SemiAbierta(colr, cTypes.Columna(s)) != 0) continue; sq ksq = pos.GetRey(colr); if (((cTypes.Columna(ksq) < COLUMNA.E) == (cTypes.Columna(s) < cTypes.Columna(ksq))) && (cTypes.Fila(ksq) == cTypes.Fila(s) || cTypes.FilaProxima(colr, ksq) == FILA.F1) && 0 == ei.m_Peones.SemiAbierta(colr, cTypes.Columna(ksq), cTypes.Columna(s) < cTypes.Columna(ksq))) nPuntos -= (m_TorreAtrapada - cTypes.Puntua(mob * 8, 0)) * (1 + (pos.CanEnroque(colr) == 0 ? 1 : 0)); } if (Pt == cPieza.ALFIL && pos.IsChess960() != false && (s == cTypes.CasillaProxima(colr, cCasilla.A1) || s == cTypes.CasillaProxima(colr, cCasilla.H1))) { sq d = cTypes.AtaquePeon(colr) + (cTypes.Columna(s) == COLUMNA.A ? cCasilla.ESTE : cCasilla.OESTE); if (pos.GetPieza(s + d) == cTypes.CreaPieza(colr, cPieza.PEON)) nPuntos -= !pos.CasillaVacia(s + d + cTypes.AtaquePeon(colr)) ? m_AlfilAtrapado * 4 : pos.GetPieza(s + d + d) == cTypes.CreaPieza(colr, cPieza.PEON) ? m_AlfilAtrapado * 2 : m_AlfilAtrapado; } } return nPuntos - EvalPiezas(pos, ei, mobility, mobilityArea, NextPt, colorVS); }
//----------------------------------------------------------------------------------------------- public factor KBPsK(cPosicion pos) { bitbrd pawns = pos.PiezasColor(m_cFuerte, cPieza.PEON); colum pawnFile = cTypes.Columna(pos.GetList(m_cFuerte, cPieza.PEON)[0]); if ((pawnFile == COLUMNA.A || pawnFile == COLUMNA.H) && 0 == (pawns & ~cBitBoard.GetColumna(pawnFile))) { sq bishonCasillaPeon = pos.GetList(m_cFuerte, cPieza.ALFIL)[0]; sq queeningSq = cTypes.CasillaProxima(m_cFuerte, cTypes.CreaCasilla(pawnFile, FILA.F8)); sq kingSq = pos.GetRey(m_cDebil); if (cTypes.IsColorContrario(queeningSq, bishonCasillaPeon) && cBitBoard.Distancia(queeningSq, kingSq) <= 1) return cFactorEscala.TABLAS; } if ((pawnFile == COLUMNA.B || pawnFile == COLUMNA.G) && 0 == (pos.GetNumPiezas(cPieza.PEON) & ~cBitBoard.GetColumna(pawnFile)) && pos.MaterialPieza(m_cDebil) == 0 && pos.GetNum(m_cDebil, cPieza.PEON) >= 1) { sq weaksqPeon = cBitBoard.backmost_sq(m_cDebil, pos.PiezasColor(m_cDebil, cPieza.PEON)); sq strongKingSq = pos.GetRey(m_cFuerte); sq weakKingSq = pos.GetRey(m_cDebil); sq bishonCasillaPeon = pos.GetList(m_cFuerte, cPieza.ALFIL)[0]; if (cTypes.FilaProxima(m_cFuerte, weaksqPeon) == FILA.F7 && (pos.PiezasColor(m_cFuerte, cPieza.PEON) & cBitBoard.m_nCasillas[(weaksqPeon + cTypes.AtaquePeon(m_cDebil))]) != 0 && (cTypes.IsColorContrario(bishonCasillaPeon, weaksqPeon) || pos.GetNum(m_cFuerte, cPieza.PEON) == 1)) { int strongKingDist = cBitBoard.Distancia(weaksqPeon, strongKingSq); int weakKingDist = cBitBoard.Distancia(weaksqPeon, weakKingSq); if (cTypes.FilaProxima(m_cFuerte, weakKingSq) >= FILA.F7 && weakKingDist <= 2 && weakKingDist <= strongKingDist) return cFactorEscala.TABLAS; } } return cFactorEscala.NAN; }
//---------------------------------------------------------------------------------------- public static int Evasiones(cPosicion pos, cMov[] mlist, int mPos) { color us = pos.ColorMueve(); sq ksq = pos.GetRey(us); bitbrd sliderAttacks = 0; bitbrd sliders = pos.Jaques()&~pos.GetNumPiezas(cPieza.CABALLO, cPieza.PEON); while(sliders!=0) { sq checksq = cBitBoard.GetLSB(ref sliders); sliderAttacks|=cBitBoard.m_EnLinea[checksq][ksq]^cBitBoard.m_nCasillas[checksq]; } bitbrd b = pos.attacks_from_square_piecetype(ksq, cPieza.REY)&~pos.PiezasColor(us)&~sliderAttacks; while(b!=0) mlist[mPos++].m=cTypes.CreaMov(ksq, cBitBoard.GetLSB(ref b)); if(cBitBoard.MayorQue(pos.Jaques())) return mPos; sq checksq2 = cBitBoard.LSB(pos.Jaques()); bitbrd target = cBitBoard.Entre(checksq2, ksq)|cBitBoard.m_nCasillas[checksq2]; return us==cColor.BLANCO ? ToDO(pos, mlist, mPos, target, cColor.BLANCO, cMovType.EVASIONS, null) : ToDO(pos, mlist, mPos, target, cColor.NEGRO, cMovType.EVASIONS, null); }