//--------------------------------------------------------------------------------- public static mov GetFromUCI(cPosicion pos, string str) { if (str.Length == 5) { char[] strChar = str.ToCharArray(); strChar[4] = char.ToLower(strChar[4]); str = new String(strChar); } for (cReglas it = new cReglas(pos, cMovType.LEGAL); it.GetActualMov() != cMovType.MOV_NAN; ++it) if (str == GetMovimiento(it.GetActualMov(), pos.IsChess960() != false)) return it.GetActualMov(); return cMovType.MOV_NAN; }
public static string uci_pv(cPosicion pos, int depth, val alpha, val beta) { StringBuilder s = new StringBuilder(); long elaspsed = cReloj.Now() - SearchTime + 1; int uciPVSize = Math.Min(cMotor.m_mapConfig["MultiPV"].Get(), RootMoves.Count); int selDepth = 0; for (int i = 0; i < cMotor.m_Threads.Count; ++i) if (cMotor.m_Threads[i].m_nMaxPly > selDepth) selDepth = cMotor.m_Threads[i].m_nMaxPly; for (int i = 0; i < uciPVSize; ++i) { bool updated = (i <= PVIdx); if (depth == 1 && !updated) continue; int d = (updated ? depth : depth - 1); if (RootMoves[i].m_PV.Count > 0 && RootMoves[i].m_PV[0] != cMovType.MOV_NAN && 0 < d) { val v = (updated ? RootMoves[i].m_nVal : RootMoves[i].m_LastVal); if (s.Length != 0) s.Append(cTypes.LF); /*bool bShow = true; for (int j = 0; j < d; ++j) { if (RootMoves[i].m_PV.Count > j && RootMoves[i].m_PV[j] == cMovType.MOV_NAN) bShow = false; }*/ if (RootMoves[i].m_PV[0] != cMovType.MOV_NAN) { s.Append("info depth "); s.Append(d); s.Append(" score "); s.Append((i == PVIdx ? cUci.Puntos(v, alpha, beta) : cUci.Puntos(v, -cValoresJuego.INFINITO, cValoresJuego.INFINITO))); s.Append(" nodes "); s.Append(pos.GetNodos()); s.Append(" nps "); s.Append((pos.GetNodos() * 1000 / (UInt64)elaspsed).ToString()); s.Append(" time "); s.Append(elaspsed); s.Append(" cpuload "); s.Append(Program.m_CPU.Get() * 10); s.Append(" hashfull "); s.Append(cMotor.m_TablaHash.HashFullPercent()); //if (bShow) { if (i > 0) { s.Append(" multipv "); s.Append(i + 1); } s.Append(" pv"); for (int j = 0; RootMoves[i].m_PV.Count > j && RootMoves[i].m_PV[j] != cMovType.MOV_NAN && j < d; ++j) { s.Append(" "); s.Append(cUci.GetMovimiento(RootMoves[i].m_PV[j], pos.IsChess960() != false)); } } } } } return s.ToString(); }
//---------------------------------------------------------------------------------------------------------- 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 static int ToDO(cPosicion pos, cMov[] mlist, int mPos, bitbrd target, color us, type Type, cInfoJaque ci) { bool Checks = Type==cMovType.QUIET_CHECKS; mPos=Peones(pos, mlist, mPos, target, ci, us, Type); mPos=Piezas(pos, mlist, mPos, us, target, ci, cPieza.CABALLO, Checks); mPos=Piezas(pos, mlist, mPos, us, target, ci, cPieza.ALFIL, Checks); mPos=Piezas(pos, mlist, mPos, us, target, ci, cPieza.TORRE, Checks); mPos=Piezas(pos, mlist, mPos, us, target, ci, cPieza.DAMA, Checks); if(Type!=cMovType.QUIET_CHECKS&&Type!=cMovType.EVASIONS) { sq ksq = pos.GetRey(us); bitbrd b = pos.attacks_from_square_piecetype(ksq, cPieza.REY)⌖ while(b!=0) mlist[mPos++].m=cTypes.CreaMov(ksq, cBitBoard.GetLSB(ref b)); } if(Type!=cMovType.CAPTURES&&Type!=cMovType.EVASIONS&&pos.CanEnroque(us)!=0) { if (pos.IsChess960() != false) { mPos=Enroques(pos, mlist, mPos, us, ci, (new cEnroque(us, cEnroque.LADO_REY)).m_Tipo, Checks, true); mPos=Enroques(pos, mlist, mPos, us, ci, (new cEnroque(us, cEnroque.LADO_DAMA)).m_Tipo, Checks, true); } else { mPos=Enroques(pos, mlist, mPos, us, ci, (new cEnroque(us, cEnroque.LADO_REY)).m_Tipo, Checks, false); mPos=Enroques(pos, mlist, mPos, us, ci, (new cEnroque(us, cEnroque.LADO_DAMA)).m_Tipo, Checks, false); } } return mPos; }