private static int ObterPosicaoParaPreencherMarcaEmTodasAsLinhasOuColunas(JogoDaVelha jogo, Dominio.Marca marcaParaPreencher) { int posicaoAJogar = 0; foreach (var conjuntoDePosicoesQueFechamVitoria in jogo.ConjuntosDePosicoesQueFechamVitoria) { int quantidadeDeMarcas = 0; int quantidadeDeVazio = 0; for (int i = 0; i < jogo.Escala; i++) { int posicaoQueFechaVitoria = conjuntoDePosicoesQueFechamVitoria[i]; if (jogo.Casas[posicaoQueFechaVitoria].Marca == Dominio.Marca.Vazio) { quantidadeDeVazio++; posicaoAJogar = posicaoQueFechaVitoria; } if (jogo.Casas[posicaoQueFechaVitoria].Marca == marcaParaPreencher) { quantidadeDeMarcas++; } } if (quantidadeDeMarcas == jogo.Escala - 1 && quantidadeDeVazio == 1) { break; } else { posicaoAJogar = 0; } } return(posicaoAJogar); }
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); }
private int ObterPosicaoDeJogadaDeAtaqueObvio(JogoDaVelha jogo) { int posicaoAJogar = 0; posicaoAJogar = ObterPosicaoParaPreencherMarcaEmTodasAsLinhasOuColunas(jogo, MinhaMarca); return(posicaoAJogar); }
private int ObterPosicaoDeJogadaDeDefesaObvia(JogoDaVelha jogo) { var marcaAdversaria = MinhaMarca == Dominio.Marca.Bolinha ? Dominio.Marca.Xzinho : Dominio.Marca.Bolinha; int posicaoAJogar = 0; posicaoAJogar = ObterPosicaoParaPreencherMarcaEmTodasAsLinhasOuColunas(jogo, marcaAdversaria); return(posicaoAJogar); }
private int ObterPrimeiraPosicaoDeJogadaPossivel(JogoDaVelha jogo) { Casa casaPossivel = jogo.Casas.Where(casa => casa != null) .FirstOrDefault(casa => casa.Marca == Marca.Vazio && !NoDaUltimaJogada.NosFilhos.Any(no => no.PesoDeMelhorEscolha < 5 && no.Posicao == casa.Posicao)); int posicao = 0; if (casaPossivel != null) { posicao = casaPossivel.Posicao; } else { posicao = jogo.Casas.Where(casa => casa != null).First(casa => casa.Marca == Marca.Vazio).Posicao; } return(posicao); }
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; } } }
public virtual void ObservarReinicioDeJogo(JogoDaVelha jogo) { }
public virtual void ObservarFimDaJogada(JogoDaVelha jogoDaVelha) { }
public virtual void Jogar(JogoDaVelha jogoDaVelha) { }
private bool EhPrimeiraRodada(JogoDaVelha jogo) { bool adversarioNaoJogouNenhumaVez = ObterPosicaoDaJogadaAdversaria(jogo.Casas) == 0; return(adversarioNaoJogouNenhumaVez); }
public override void ObservarReinicioDeJogo(JogoDaVelha jogo) { ZerarMemoriaDeTrabalho(jogo.Escala); }
public override void ObservarFimDaJogada(JogoDaVelha jogoDaVelha) { RepesarMemoriaDeLongoPrazo(jogoDaVelha); ZerarMemoriaDeTrabalho(jogoDaVelha.Escala); }