Exemple #1
0
        /// <summary>
        /// Começo do programa.
        /// </summary>
        /// <remarks>
        /// Inicializa os componentes do motor e inicia o loop principal da interface.
        /// </remarks>
        /// <param name="args">Nenhum parâmetro é usado neste momento.</param>
        public static void Main(string[] args)
        {
            Console.WriteLine("Enxadrista 1.0.1 - Programa jogador de xadrez - Autores: Alcides Schulz e Raoni Campos");

            var transposicao = new Transposicao();
            var motor        = new Motor(transposicao);
            var xboard       = new XBoard(motor);

            xboard.LoopPrincipal();
        }
        /// <summary>
        /// Salva nova informação na tabela de transposição.
        /// </summary>
        /// <param name="chave">Chave Zobrist da posição atual.</param>
        /// <param name="profundidade">Profundidade da pesquisa.</param>
        /// <param name="valor">Valor a ser salvo.</param>
        /// <param name="nivel">Nivel atual para ajustar os valores de mate.</param>
        /// <param name="tipo">Tipo do valor as ser salvo.</param>
        /// <param name="melhor">Melhor movimento para a posição ou null.</param>
        public void Salva(ulong chave, int profundidade, int valor, int nivel, byte tipo, Movimento melhor)
        {
            Debug.Assert(profundidade >= 0 && profundidade <= Defs.PROFUNDIDADE_MAXIMA);
            Debug.Assert(valor >= Defs.VALOR_MINIMO && valor <= Defs.VALOR_MAXIMO);
            Debug.Assert(nivel >= 0 && nivel < Defs.NIVEL_MAXIMO);
            Debug.Assert(tipo == Transposicao.Tipo.INFERIOR || tipo == Transposicao.Tipo.EXATO || tipo == Transposicao.Tipo.SUPERIOR);

            // Define o índice para a localização da entrada.
            int indice_entrada = (int)(chave % NUMERO_ENTRADAS);

            Debug.Assert(indice_entrada >= 0 && indice_entrada < Transposicao.NUMERO_ENTRADAS);

            var entrada = Tabela[indice_entrada];

            // Tenta achar um registro existente para esta posição.
            var registro = entrada.FirstOrDefault(r => r.Chave == chave);

            // Evita perder os melhores movimentos que estão na tabela.
            if (registro != null && melhor == null)
            {
                melhor = registro.Movimento;
            }

            // Se é uma posição nova, então tenta substituir o registro mais antigo, com a menor profundidade.
            if (registro == null)
            {
                registro = entrada.OrderBy(r => r.Geracao).ThenBy(r => r.Profundidade).First();
            }

            // Salva os dados.
            registro.Chave        = chave;
            registro.Geracao      = Geracao;
            registro.Profundidade = profundidade;
            registro.Tipo         = tipo;
            registro.Movimento    = melhor;
            registro.Valor        = Transposicao.AjustaValorParaTabela(valor, nivel);
        }
Exemple #3
0
 /// <summary>
 /// Cria componente the pesquisa e associa aos outros componentes do motor.
 /// </summary>
 /// <param name="tabuleiro">Tablueiro.</param>
 /// <param name="avaliacao">Avaliação.</param>
 /// <param name="transposicao">Tabela de Transposição.</param>
 public Pesquisa(Tabuleiro tabuleiro, Avaliacao avaliacao, Transposicao transposicao)
 {
     Transposicao = transposicao;
     Tabuleiro    = tabuleiro;
     Avaliacao    = avaliacao;
 }