示例#1
0
        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);
        }
示例#2
0
        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);
        }
示例#3
0
        private int ObterPosicaoDeJogadaDeAtaqueObvio(JogoDaVelha jogo)
        {
            int posicaoAJogar = 0;

            posicaoAJogar = ObterPosicaoParaPreencherMarcaEmTodasAsLinhasOuColunas(jogo, MinhaMarca);

            return(posicaoAJogar);
        }
示例#4
0
        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);
        }
示例#5
0
        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);
        }
示例#6
0
        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);
        }
示例#7
0
        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;
                }
            }
        }
示例#8
0
 public virtual void ObservarReinicioDeJogo(JogoDaVelha jogo)
 {
 }
示例#9
0
 public virtual void ObservarFimDaJogada(JogoDaVelha jogoDaVelha)
 {
 }
示例#10
0
 public virtual void Jogar(JogoDaVelha jogoDaVelha)
 {
 }
示例#11
0
        private bool EhPrimeiraRodada(JogoDaVelha jogo)
        {
            bool adversarioNaoJogouNenhumaVez = ObterPosicaoDaJogadaAdversaria(jogo.Casas) == 0;

            return(adversarioNaoJogouNenhumaVez);
        }
示例#12
0
 public override void ObservarReinicioDeJogo(JogoDaVelha jogo)
 {
     ZerarMemoriaDeTrabalho(jogo.Escala);
 }
示例#13
0
        public override void ObservarFimDaJogada(JogoDaVelha jogoDaVelha)
        {
            RepesarMemoriaDeLongoPrazo(jogoDaVelha);

            ZerarMemoriaDeTrabalho(jogoDaVelha.Escala);
        }