Exemplo n.º 1
0
        /// <summary>
        /// Retorna a representação FEN atual das peças no tabuleiro de xadrez.
        /// Exemplo para posição inicial: rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR
        /// </summary>
        /// <param name="tabuleiro">tabuleiro com a posição para gerar a string FEN</param>
        /// <returns>Descrição FEN das peças no tabuleiro</returns>
        private static string ObtemDescPosicao(Tabuleiro tabuleiro)
        {
            var desc = "";

            for (var fileira = Defs.PRIMEIRA_FILEIRA; fileira < Defs.ULTIMA_FILEIRA; fileira++)
            {
                if (desc != "")
                {
                    desc += "/";
                }
                var contador_casas_vazias = 0;
                for (var coluna = Defs.PRIMEIRA_COLUNA; coluna < Defs.ULTIMA_COLUNA; coluna++)
                {
                    var peca = tabuleiro.ObtemPeca(fileira * Defs.NUMERO_COLUNAS + coluna);
                    if (peca == Peca.Nenhuma)
                    {
                        contador_casas_vazias++;
                        continue;
                    }
                    if (contador_casas_vazias != 0)
                    {
                        desc += contador_casas_vazias.ToString();
                        contador_casas_vazias = 0;
                    }
                    desc += peca.ParaTexto();
                }
                if (contador_casas_vazias != 0)
                {
                    desc += contador_casas_vazias.ToString();
                    contador_casas_vazias = 0;
                }
            }

            return(desc);
        }
Exemplo n.º 2
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);
        }
Exemplo n.º 3
0
        /// <summary>
        /// Avalia o tabuleiro.
        /// </summary>
        /// <remarks>
        /// Percorre o tabuleiro e avalia cada peça.
        /// </remarks>
        private void AvaliaTabuleiro()
        {
            for (var fileira = Defs.PRIMEIRA_FILEIRA; fileira < Defs.ULTIMA_FILEIRA; fileira++)
            {
                for (var coluna = Defs.PRIMEIRA_COLUNA; coluna < Defs.ULTIMA_COLUNA; coluna++)
                {
                    var indice = fileira * Defs.NUMERO_COLUNAS + coluna;
                    var peca   = Tabuleiro.ObtemPeca(indice);
                    switch (peca)
                    {
                    case Peca.Nenhuma: break;

                    case Peca.PeaoBranco:
                        AvaliaPeaoBranco(indice);
                        break;

                    case Peca.CavaloBranco:
                        AvaliaCavalo(Branco, indice);
                        break;

                    case Peca.BispoBranco:
                        AvaliaBispo(Branco, indice);
                        break;

                    case Peca.TorreBranca:
                        AvaliaTorre(Branco, indice, DadosTorreBranca);
                        break;

                    case Peca.DamaBranca:
                        AvaliaDama(Branco, indice);
                        break;

                    case Peca.ReiBranco:
                        AvaliaRei(Branco, indice, DadosReiBranco);
                        break;

                    case Peca.PeaoPreto:
                        AvaliaPeaoPreto(indice);
                        break;

                    case Peca.CavaloPreto:
                        AvaliaCavalo(Preto, indice);
                        break;

                    case Peca.BispoPreto:
                        AvaliaBispo(Preto, indice);
                        break;

                    case Peca.TorrePreta:
                        AvaliaTorre(Preto, indice, DadosTorreBranca);
                        break;

                    case Peca.DamaPreta:
                        AvaliaDama(Preto, indice);
                        break;

                    case Peca.ReiPreto:
                        AvaliaRei(Preto, indice, DadosReiBranco);
                        break;
                    }
                }
            }
        }