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