Пример #1
0
        public IEnumerable <Estado> JogadasPossiveisDoOponente(Estado estadoAtual)
        {
            EstadoLig4 atual = (estadoAtual as EstadoLig4);

            List <EstadoLig4> proximosEstados = new List <EstadoLig4>();

            // @@@
            int idDoOponente;

            if (id == EstadoLig4.X)
            {
                idDoOponente = EstadoLig4.O;
            }
            else
            {
                idDoOponente = EstadoLig4.X;
            }
            for (int coluna = 0; coluna < EstadoLig4.COLUNAS; coluna++)
            {
                for (int linha = (EstadoLig4.LINHAS - 1); linha >= 0; linha--)
                {
                    if (atual.IsCelulaVazia(linha, coluna) == true)
                    {
                        proximosEstados.Add(atual.MarcarCelula(linha, coluna, idDoOponente));
                        break;
                    }
                }
            }
            return(proximosEstados);
        }
        public override Estado EfetuarJogada(Estado estadoAtual)
        {
            // quanto menor for a profundidade máxima de busca do algoritmo Minimax,
            // menor a chance de encontrarmos a jogada ideal

            EstadoLig4 atual = (estadoAtual as EstadoLig4);

            return(Minimax.EfetuarJogada(this, atual, estadoAtual.NumeroMaximoDeTurnos));
        }
Пример #3
0
        public override Estado EfetuarJogada(Estado estadoAtual)
        {
            // o jogador fácil não utiliza o minimax...
            // apenas adiciona a peça na primeira coluna vazia

            EstadoLig4 atual = (estadoAtual as EstadoLig4);

            for (int coluna = 0; coluna < EstadoLig4.COLUNAS; coluna++)
            {
                for (int linha = (EstadoLig4.LINHAS - 1); linha >= 0; linha--)
                {
                    if (atual.IsCelulaVazia(linha, coluna) == true)
                    {
                        return(atual.MarcarCelula(linha, coluna, Id));
                    }
                }
            }
            return(null);
        }
Пример #4
0
        public override Estado EfetuarJogada(Estado estadoAtual)
        {
            // o jogador aleatório não utiliza o minimax...
            // apenas adiciona a peça na em uma coluna aleatória (e vazia)

            EstadoLig4 atual = (estadoAtual as EstadoLig4);

            // @@@
            for (; ;)
            {
                int coluna = random.Next(EstadoLig4.COLUNAS);

                for (int linha = (EstadoLig4.LINHAS - 1); linha >= 0; linha--)
                {
                    if (atual.IsCelulaVazia(linha, coluna) == true)
                    {
                        return(atual.MarcarCelula(linha, coluna, Id));
                    }
                }
            }
        }
Пример #5
0
        public override bool Equals(object obj)
        {
            if (obj == this)
            {
                return(true);
            }
            EstadoLig4 e = (obj as EstadoLig4);

            if (e == null || e.jogadorDaVez != jogadorDaVez)
            {
                return(false);
            }
            for (int linha = 0; linha < LINHAS; linha++)
            {
                for (int coluna = 0; coluna < COLUNAS; coluna++)
                {
                    if (e.tabuleiro[linha, coluna] != tabuleiro[linha, coluna])
                    {
                        return(false);
                    }
                }
            }
            return(true);
        }
Пример #6
0
        static void Main(string[] args)
        {
            int contadorDeJogadas = 0;

            Estado estadoDoTabuleiro = new EstadoLig4(new int[, ] {
                { 0, 0, 0, 0, 0, 0, 0 },
                { 0, 0, 0, 0, 0, 0, 0 },
                { 0, 0, 0, 0, 0, 0, 0 },
                { 0, 0, 0, 0, 0, 0, 0 },
                { 0, 0, 0, 0, 0, 0, 0 },
                { 0, 0, 0, 0, 0, 0, 0 }
            }, X);

            /*
             *          Estado estadoDoTabuleiro = new EstadoTicTacToe(new int[,] {
             *                  { 0, 0, 0 },
             *                  { 0, 0, 0 },
             *                  { 0, 0, 0 }
             *          }, X);*/

            // exemplo de resistência (X vai perder, mas não desiste logo de cara)
            //Estado estadoDoTabuleiro = new EstadoTicTacToe(new int[,] {
            //	{ 0, O, 0 },
            //	{ 0, 0, O },
            //	{ X, X, O }
            //}, X);

            // mais um empate (ambos X e O são jogadores difíceis... experimente
            // trocar um deles para fácil)
            //Estado estadoDoTabuleiro = new EstadoTicTacToe(new int[,] {
            //	{ O, 0, 0 },
            //	{ 0, O, 0 },
            //	{ X, 0, 0 }
            //}, X);

            Jogador jogadorX = new JogadorLig4Dificil(X);
            Jogador jogadorO = new JogadorLig4Aleatorio(O);

            // apenas para debug
            Minimax.UtilizarPodaAlphaBeta = true;
            Minimax.EstadosAvaliados      = 0;

            while (estadoDoTabuleiro.IsTerminal == false)
            {
                contadorDeJogadas++;
                Console.WriteLine("Jogada " + contadorDeJogadas);

                Jogador jogador;
                if (estadoDoTabuleiro.JogadorDoTurno == EstadoLig4.X)
                {
                    jogador = jogadorX;
                }
                else
                {
                    jogador = jogadorO;
                }

                Console.WriteLine("Vez de " + jogador.Nome);

                estadoDoTabuleiro = jogador.EfetuarJogada(estadoDoTabuleiro);

                Console.WriteLine(estadoDoTabuleiro);

                if (estadoDoTabuleiro.IsTerminal == false)
                {
                    estadoDoTabuleiro.AlternarJogadorDoTurno();
                }

                Console.WriteLine();
                Console.WriteLine();
            }

            Console.WriteLine("Total de estados avaliados: " + Minimax.EstadosAvaliados);

            switch (estadoDoTabuleiro.Vencedor)
            {
            case EstadoLig4.X:
                Console.WriteLine("Vencedor: " + jogadorX.Nome);
                break;

            case EstadoLig4.O:
                Console.WriteLine("Vencedor: " + jogadorO.Nome);
                break;

            default:
                Console.WriteLine("Empate!");
                break;
            }

            Console.ReadKey();
        }