Ejemplo n.º 1
0
        /// <summary>
        ///     Gera a chave para a posição atual do tabuleiro.
        /// </summary>
        /// <remarks>
        ///     Aqui estamos gerando a chave para a posição sempre que tivermos uma nova posição.
        ///     A maioria dos programas irá fazer isso de forma incremental, apenas atualizando
        ///     os elementos que mudaram quando o movimento foi feito, exemplo a peça do movimento.
        ///     Isso é possível por causa da forma como o "ou exclusivo" funciona.
        /// </remarks>
        /// <param name="tabuleiro">Tabuleiro.</param>
        /// <returns>Chave da posição.</returns>
        public static ulong ObtemChave(Tabuleiro tabuleiro)
        {
            ulong chave = 0;

            for (var fileira = Defs.PRIMEIRA_FILEIRA; fileira < Defs.ULTIMA_FILEIRA; fileira++)
            {
                for (var coluna = Defs.PRIMEIRA_COLUNA; coluna < Defs.ULTIMA_COLUNA; coluna++)
                {
                    var indice12x12 = fileira * Defs.NUMERO_COLUNAS + coluna;
                    var peca        = tabuleiro.ObtemPeca(indice12x12);
                    if (peca == Peca.Nenhuma)
                    {
                        continue;
                    }
                    var indice8x8 = Defs.Converte12x12Para8x8(indice12x12);

                    switch (peca)
                    {
                    case Peca.PeaoBranco:
                        chave ^= Chave.Branco.PEAO[indice8x8];
                        break;

                    case Peca.CavaloBranco:
                        chave ^= Chave.Branco.CAVALO[indice8x8];
                        break;

                    case Peca.BispoBranco:
                        chave ^= Chave.Branco.BISPO[indice8x8];
                        break;

                    case Peca.TorreBranca:
                        chave ^= Chave.Branco.TORRE[indice8x8];
                        break;

                    case Peca.DamaBranca:
                        chave ^= Chave.Branco.DAMA[indice8x8];
                        break;

                    case Peca.ReiBranco:
                        chave ^= Chave.Branco.REI[indice8x8];
                        break;

                    case Peca.PeaoPreto:
                        chave ^= Chave.Preto.PEAO[indice8x8];
                        break;

                    case Peca.CavaloPreto:
                        chave ^= Chave.Preto.CAVALO[indice8x8];
                        break;

                    case Peca.BispoPreto:
                        chave ^= Chave.Preto.BISPO[indice8x8];
                        break;

                    case Peca.TorrePreta:
                        chave ^= Chave.Preto.TORRE[indice8x8];
                        break;

                    case Peca.DamaPreta:
                        chave ^= Chave.Preto.DAMA[indice8x8];
                        break;

                    case Peca.ReiPreto:
                        chave ^= Chave.Preto.REI[indice8x8];
                        break;
                    }
                }
            }

            if (tabuleiro.IndiceEnPassant != 0)
            {
                chave ^= Chave.ENPASSANT[Defs.Converte12x12Para8x8(tabuleiro.IndiceEnPassant)];
            }

            chave ^= Chave.Roque.E1G1[tabuleiro.RoqueE1G1 ? 0 : 1];
            chave ^= Chave.Roque.E1C1[tabuleiro.RoqueE1C1 ? 0 : 1];
            chave ^= Chave.Roque.E8G8[tabuleiro.RoqueE8G8 ? 0 : 1];
            chave ^= Chave.Roque.E8C8[tabuleiro.RoqueE8C8 ? 0 : 1];

            if (tabuleiro.CorJogar == Cor.Preta)
            {
                chave ^= Chave.COR;
            }

            return(chave);
        }