private NoDeMemoria EscolherNoDaProximaJogada(JogoDaVelha jogo) { NoDeMemoria retorno = null; int posicao = ObterPosicaoDeJogadaDeAtaqueObvio(jogo); if (posicao == 0) { posicao = ObterPosicaoDeJogadaDeDefesaObvia(jogo); } if (posicao == 0) { retorno = ObterNoFilhoPorMelhorEscolhaMemorizada(NoDaUltimaJogada); } if (posicao == 0 && retorno == null) { posicao = ObterPrimeiraPosicaoDeJogadaPossivel(jogo); } retorno = retorno ?? NoDaUltimaJogada.CarregarNoFilhoDaPosicao(posicao); return(retorno); }
public override void Jogar(JogoDaVelha jogoDaVelha) { int posicaoDoAdversario = 0; if (!EhPrimeiraRodada(jogoDaVelha)) { posicaoDoAdversario = ObterPosicaoDaJogadaAdversaria(jogoDaVelha.Casas); NoDaUltimaJogada = NoDaUltimaJogada.CarregarNoFilhoDaPosicao((Int32)posicaoDoAdversario); } NoDaUltimaJogada = EscolherNoDaProximaJogada(jogoDaVelha); ValidacaoDaJogada validacao; AtualizarCasasDaUltimaJogadaPelasCasasAtuais(CasasDaUltimaJogada, jogoDaVelha.Casas, posicaoDoAdversario); jogoDaVelha.Jogar(NoDaUltimaJogada.Posicao, out validacao); }
private void RepesarMemoriaDeLongoPrazo(JogoDaVelha jogoDaVelha) { if (jogoDaVelha.ObterVencedor() != Marca.Vazio) { NoDeMemoria no = NoDaUltimaJogada.NoPai; while (no.NoPai != null) { Int32 pesoDeMelhorEscolha = jogoDaVelha.Casas[no.Posicao] == jogoDaVelha.ObterVencedor() ? ((Int32)(1)) : ((Int32)(-1)); if ((pesoDeMelhorEscolha > 0 && no.PesoDeMelhorEscolha < 10) || (pesoDeMelhorEscolha < 0 && no.PesoDeMelhorEscolha > 0)) { no.PesoDeMelhorEscolha += pesoDeMelhorEscolha; } no = no.NoPai; } } }
private void ZerarMemoriaDeTrabalho(int escala) { MontarCasasDaUltimaJogadaZerada(escala); NoDaUltimaJogada = ArvoreDeAprendizado.NoRaiz; }
public JogadorIA(int escala) { ArvoreDeAprendizado = new ArvoreDeAprendizado(escala); NoDaUltimaJogada = ArvoreDeAprendizado.NoRaiz; ZerarMemoriaDeTrabalho(escala); }
private NoDeMemoria ObterNoFilhoPorMelhorEscolhaMemorizada(NoDeMemoria noPai) { return(noPai.NosFilhos.Count > 0 ? noPai.NosFilhos.FirstOrDefault(n => n.PesoDeMelhorEscolha == noPai.NosFilhos.Max(p => p.PesoDeMelhorEscolha) && n.PesoDeMelhorEscolha > 4) : null); }