//----------------------------------------------------------------------------------------------- public static bool SetConjuntoPiezasPosicion(cPosicion pos) { whitePieceSquares.Clear(); whiteTypesSquares.Clear(); blackPieceSquares.Clear(); blackTypesSquares.Clear(); for(type pt = cPieza.PEON; pt<=cPieza.REY; ++pt) { for(int i = 0; i<pos.GetNum(cColor.BLANCO, pt); i++) { whitePieceSquares.Add(pos.GetList(cColor.BLANCO, pt)[i]); whiteTypesSquares.Add(pt); } for(int i = 0; i<pos.GetNum(cColor.NEGRO, pt); i++) { blackPieceSquares.Add(pos.GetList(cColor.NEGRO, pt)[i]); blackTypesSquares.Add(pt); } } enPassantSquare=pos.CasillaEnPaso(); whosTurn=pos.ColorMueve(); return true; }
//------------------------------------------------------------------------------------ public static hash PolyglotKey(cPosicion posicion) { hash key = 0; bitbrd bitBoard = posicion.Piezas(); while (bitBoard != 0) { sq s = cBitBoard.GetLSB(ref bitBoard); pieza pc = posicion.GetPieza(s); int pieceOfs = 2 * (cTypes.TipoPieza(pc) - 1) + ((cTypes.GetColor(pc) == cColor.BLANCO) ? 1 : 0); key ^= PG[nCasillaPeon + (64 * pieceOfs + s)]; } bitBoard = (ulong)posicion.PosibleEnrocar(cEnroque.CUALQUIER_ENROQUE); while (bitBoard != 0) key ^= PG[m_nEnroque + cBitBoard.GetLSB(ref bitBoard)]; if (posicion.CasillaEnPaso() != cCasilla.NONE) key ^= PG[m_nEnPaso + cTypes.Columna(posicion.CasillaEnPaso())]; if (posicion.ColorMueve() == cColor.BLANCO) key ^= PG[m_nTurno + 0]; return key; }
//---------------------------------------------------------------------------------------- public static int Peones(cPosicion pos, cMov[] mlist, int mPos, bitbrd target, cInfoJaque ci, color colr, type Type) { color colorVS = (colr==cColor.BLANCO ? cColor.NEGRO : cColor.BLANCO); bitbrd TRank8BB = (colr==cColor.BLANCO ? cBitBoard.F8 : cBitBoard.F1); bitbrd TRank7BB = (colr==cColor.BLANCO ? cBitBoard.F7 : cBitBoard.F2); bitbrd TRank3BB = (colr==cColor.BLANCO ? cBitBoard.F3 : cBitBoard.F6); sq Up = (colr==cColor.BLANCO ? cCasilla.NORTE : cCasilla.SUR); sq Right = (colr==cColor.BLANCO ? cCasilla.NORTE_ESTE : cCasilla.SUR_OESTE); sq Left = (colr==cColor.BLANCO ? cCasilla.NORTE_OESTE : cCasilla.SUR_ESTE); bitbrd b1, b2, dc1, dc2, emptySquares = 0; bitbrd pawnsOn7 = pos.PiezasColor(colr, cPieza.PEON)&TRank7BB; bitbrd pawnsNotOn7 = pos.PiezasColor(colr, cPieza.PEON)&~TRank7BB; bitbrd enemies = (Type==cMovType.EVASIONS ? pos.PiezasColor(colorVS)&target : Type==cMovType.CAPTURES ? target : pos.PiezasColor(colorVS)); if(Type!=cMovType.CAPTURES) { emptySquares=(Type==cMovType.QUIETS||Type==cMovType.QUIET_CHECKS ? target : ~pos.Piezas()); b1=cBitBoard.Desplazamiento(pawnsNotOn7, Up)&emptySquares; b2=cBitBoard.Desplazamiento(b1&TRank3BB, Up)&emptySquares; if(Type==cMovType.EVASIONS) { b1&=target; b2&=target; } if(Type==cMovType.QUIET_CHECKS) { b1&=pos.AtaquesDePeon(ci.m_SqRey, colorVS); b2&=pos.AtaquesDePeon(ci.m_SqRey, colorVS); if((pawnsNotOn7&ci.m_Candidatas)!=0) { dc1=cBitBoard.Desplazamiento(pawnsNotOn7&ci.m_Candidatas, Up)&emptySquares&~cBitBoard.GetColumnaSq(ci.m_SqRey); dc2=cBitBoard.Desplazamiento(dc1&TRank3BB, Up)&emptySquares; b1|=dc1; b2|=dc2; } } while(b1!=0) { sq to = cBitBoard.GetLSB(ref b1); mlist[mPos++].m=cTypes.CreaMov(to-Up, to); } while(b2!=0) { sq to = cBitBoard.GetLSB(ref b2); mlist[mPos++].m=cTypes.CreaMov(to-Up-Up, to); } } if(pawnsOn7!=0&&(Type!=cMovType.EVASIONS||(target&TRank8BB)!=0)) { if(Type==cMovType.CAPTURES) emptySquares=~pos.Piezas(); if(Type==cMovType.EVASIONS) emptySquares&=target; mPos=Promocion(mlist, mPos, pawnsOn7, enemies, ci, Type, Right); mPos=Promocion(mlist, mPos, pawnsOn7, enemies, ci, Type, Left); mPos=Promocion(mlist, mPos, pawnsOn7, emptySquares, ci, Type, Up); } if(Type==cMovType.CAPTURES||Type==cMovType.EVASIONS||Type==cMovType.NON_EVASIONS) { b1=cBitBoard.Desplazamiento(pawnsNotOn7, Right)&enemies; b2=cBitBoard.Desplazamiento(pawnsNotOn7, Left)&enemies; while(b1!=0) { sq to = cBitBoard.GetLSB(ref b1); mlist[mPos++].m=cTypes.CreaMov(to-Right, to); } while(b2!=0) { sq to = cBitBoard.GetLSB(ref b2); mlist[mPos++].m=cTypes.CreaMov(to-Left, to); } if(pos.CasillaEnPaso()!=cCasilla.NONE) { if(Type==cMovType.EVASIONS&&(target&cBitBoard.m_nCasillas[(pos.CasillaEnPaso()-Up)])==0) return mPos; b1=pawnsNotOn7&pos.AtaquesDePeon(pos.CasillaEnPaso(), colorVS); while(b1!=0) mlist[mPos++].m=cTypes.CreaMov(cBitBoard.GetLSB(ref b1), pos.CasillaEnPaso(), cMovType.ENPASO, cPieza.CABALLO); } } return mPos; }