/// <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; }
/// <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)]; }
/// <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)]; }
/// <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; } } } }