Exemplo n.º 1
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;
                    }
                }
            }
        }