Beispiel #1
0
 /// <summary>
 /// Avalia a Dama.
 /// </summary>
 /// <remarks>
 /// Mobilidade e ataques a casas perto ao rei pode ser addicionada.
 /// </remarks>
 /// <param name="pontuacao">Pontuação do lado branco ou preto</param>
 /// <param name="indice">Índice da casa da dama</param>
 private void AvaliaDama(Pontuacao pontuacao, int indice)
 {
     Fase -= Pontuacao.Fase.DAMA;
     pontuacao.Inicial += Pontuacao.Material.DAMA_INICIO;
     pontuacao.Final   += Pontuacao.Material.DAMA_FINAL;
     pontuacao.Final   += Pontuacao.Tabela.CENTRALIZACAO[Defs.Converte12x12Para8x8(indice)] / 2;
 }
Beispiel #2
0
 /// <summary>
 /// Avalia o bispo.
 /// </summary>
 /// <remarks>
 /// Vai tentar centralizar o bispo.
 /// Outro item que pode ser adicionado é uma relação com os próprios peões,
 /// não estando no quadrado da mesma cor do bispo.
 /// </remarks>
 /// <param name="pontuacao">Pontuação do lado branco ou preto</param>
 /// <param name="indice">Índice da casa do bispo</param>
 private void AvaliaBispo(Pontuacao pontuacao, int indice)
 {
     Fase -= Pontuacao.Fase.BISPO;
     pontuacao.Inicial += Pontuacao.Material.BISPO_INICIO;
     pontuacao.Inicial += Pontuacao.Tabela.CENTRALIZACAO[Defs.Converte12x12Para8x8(indice)];
     pontuacao.Final   += Pontuacao.Material.BISPO_FINAL;
     pontuacao.Final   += Pontuacao.Tabela.CENTRALIZACAO[Defs.Converte12x12Para8x8(indice)];
 }
Beispiel #3
0
 /// <summary>
 /// Avalia o Rei.
 /// </summary>
 /// <remarks>
 /// Apenas dá um bônus para peões na frente do rei, ou seja, escudo de peão (pawn shield).
 /// O que pode ser adicionado é uma penalidade para muitos peões inimigos perto do rei, o que
 /// significa que um ataque de peão está se formando.
 /// Especialmente em termos de segurança do rei, se as peças inimigas estão atacando a área próxima ao rei,
 /// pode ser um grande valor a este item. Em geral a segurança do rei é difícil de calibrar corretamente e
 /// requer muitos testes.
 /// Além disso, algo a considerar é a presença da dama inimiga ao avaliar a segurança do rei. Sem a dama o
 /// valor da segurança do rei reduz drasticamente.
 /// </remarks>
 /// <param name="pontuacao">Pontuação do lado branco ou preto</param>
 /// <param name="indice">Índice da casa do rei</param>
 /// <param name="dados_rei">Informação relativa à cor a ser avaliada.</param>
 private void AvaliaRei(Pontuacao pontuacao, int indice, DadosRei dados_rei)
 {
     for (int i = 0; i < dados_rei.DirecaoEmFrente.Length; i++)
     {
         if (Tabuleiro.ObtemPeca(indice + i) == dados_rei.PeaoAmigo)
         {
             pontuacao.Inicial += Pontuacao.Rei.PEAO_ESCUDO;
         }
     }
     pontuacao.Inicial += dados_rei.TabelaInicio[Defs.Converte12x12Para8x8(indice)];
 }
Beispiel #4
0
        /// <summary>
        /// Avalia a torre.
        /// </summary>
        /// <remarks>
        /// Avalia a torre de cada lado do ponto de vista da cor, a visão do lado branco
        /// é de baixo para cima e a visão do lado preto é de cima para baixo.
        /// Daremos um bônus para torre em coluna aberta e torre na 7ª fileira.
        /// Mobilidade e ataques a casas perto ao rei pode ser addicionada.
        /// </remarks>
        /// <param name="pontuacao">Pontuação do lado branco ou preto</param>
        /// <param name="indice">Índice da casa da torre</param>
        /// <param name="dados_torre">Informação relativa à cor a ser avaliada.</param>
        private void AvaliaTorre(Pontuacao pontuacao, int indice, DadosTorre dados_torre)
        {
            Fase -= Pontuacao.Fase.TORRE;

            pontuacao.Inicial += Pontuacao.Material.TORRE_INICIO;
            if (indice >= dados_torre.IndiceFileira1 && indice < dados_torre.IndiceFileira1 + 8)
            {
                int em_frente      = indice + dados_torre.DirecaoEmFrente;
                int peoes_amigos   = 0;
                int peoes_inimigos = 0;
                while (!Tabuleiro.BordaDoTabuleiro(em_frente))
                {
                    if (Tabuleiro.ObtemPeca(em_frente) == dados_torre.PeaoAmigo)
                    {
                        peoes_amigos++;
                    }
                    if (Tabuleiro.ObtemPeca(em_frente) == dados_torre.PeaoInimigo)
                    {
                        peoes_inimigos++;
                    }
                    em_frente += dados_torre.DirecaoEmFrente;
                }
                if (peoes_amigos == 0 && peoes_inimigos != 0)
                {
                    pontuacao.Inicial += Pontuacao.Torre.COLUNA_SEMI_ABERTA;
                }
                if (peoes_amigos == 0 && peoes_inimigos == 0)
                {
                    pontuacao.Inicial += Pontuacao.Torre.COLUNA_ABERTA;
                }
            }

            pontuacao.Final += Pontuacao.Material.TORRE_FINAL;
            if (indice >= dados_torre.IndiceFileira7 && indice < dados_torre.IndiceFileira7 + 8)
            {
                for (int i = dados_torre.IndiceFileira7; i < dados_torre.IndiceFileira7 + 8; i++)
                {
                    if (Tabuleiro.ObtemPeca(i) == dados_torre.PeaoInimigo)
                    {
                        pontuacao.Final += Pontuacao.Torre.FILEIRA7_PEAO;
                    }
                }
            }
        }