Пример #1
0
        //-----------------------------------------------------------------------------------------------
        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;
        }
Пример #2
0
        //------------------------------------------------------------------------------------
        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;
        }
Пример #3
0
        //----------------------------------------------------------------------------------------
        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;
        }