Пример #1
0
        //----------------------------------------------------------------------------------------
        public static int Enroques(cPosicion pos, cMov[] mlist, int mPos, color us, cInfoJaque ci, enroque Cr, bool Checks, bool Chess960)
        {
            bool KingSide = (Cr==cEnroque.OO_BLANCAS||Cr==cEnroque.OO_NEGRAS);

              if(pos.CanNotEnroque(Cr)||0==pos.PosibleEnrocar(Cr))
            return mPos;

              sq kfrom = pos.GetRey(us);
              sq rfrom = pos.CasillaTorreEnroque(Cr);
              sq kto = cTypes.CasillaProxima(us, KingSide ? cCasilla.G1 : cCasilla.C1);
              bitbrd enemies = pos.PiezasColor(cTypes.Contrario(us));

              sq K = Chess960 ? kto>kfrom ? cCasilla.OESTE : cCasilla.ESTE : KingSide ? cCasilla.OESTE : cCasilla.ESTE;

              for(sq s = kto; s!=kfrom; s+=K)
            if((pos.AtaquesA(s)&enemies)!=0)
              return mPos;

              if(Chess960&&(cBitBoard.AtaquesPieza(kto, pos.Piezas()^cBitBoard.m_nCasillas[rfrom], cPieza.TORRE)&pos.PiezasColor(cTypes.Contrario(us), cPieza.TORRE, cPieza.DAMA))!=0)
            return mPos;

              mov m = cTypes.CreaMov(kfrom, rfrom, cMovType.ENROQUE, cPieza.CABALLO);

              if(Checks&&!pos.IsJaque(m, ci))
            return mPos;

              mlist[mPos++].m=m;

              return mPos;
        }
Пример #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;
        }