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