Pop

Curso programación C# - 82. Inteligencia Artificial con C# (11)- Visual Studio 2017


81. Inteligencia Artificial (11). Tres en raya con Minimax

 -  En este capítulo del curso de programación en c# con visual studio 2017 vamos a continuar con nuestra serie de entradas relacionadas con un tema de moda: la inteligencia artificial. En la entrada anterior vimos como implementar la parte gráfica de este nuevo ejemplo.

- En esta entrada os muestro la implementación de la clase  TresEnRaya.cs  En esta clase tendremos una serie de métodos necesarios para dotar a nuestro agente de inteligencia artificial de una cierta lógica, así como métodos para comprobar si la partida a finalizado o si quedan posiciones en la matriz por ocupar.

- En el vídeo os cuento todo esto con más detalles:




  • Como acostumbro os dejo el código de la clase vista en el vídeo:


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace TresEnRaya
{
    class TresEnRaya
    {

        private int[,] matriz = new int[3, 3];
        private int ganador = -1;
     
        private int[] ultimoMovimientoMaquina = new int[3];

        public int[,] Matriz { get => matriz; set => matriz = value; }
        public int Ganador { get => ganador; set => ganador = value; }
        public int[] UltimoMovimientoMaquina { get => ultimoMovimientoMaquina; set => ultimoMovimientoMaquina = value; }

        //inicialmente todas las caillas de la matriz tendran -1
        public void inicializarPartida()
        {
            for (int i = 0; i < matriz.GetLength(0); i++)
                for (int j = 0; j < matriz.GetLength(1); j++)
                    matriz[i,j] = -1;
            Ganador = -1;
        }

        public void seleccionarPosicion(int x, int y)
        {
            if (x >= 0 && x < 3 && y >= 0 && y < 3 && matriz[x, y] == -1 && Ganador == -1)
            {
                matriz[x, y] = 0;
                Ganador = ganaPartida();
                mueveMaquina();
            }
        }

        //Miramos si alguan combinacion gana
        public int ganaPartida()
        {
            int aux = -1;

            //Diagonales
            if (matriz[0, 0] != -1 && matriz[0, 0] == matriz[1, 1] && matriz[0, 0] == matriz[2, 2])
                aux = matriz[0, 0];

            if (matriz[0, 2] != -1 && matriz[0, 2] == matriz[1, 1] && matriz[0, 2] == matriz[2, 0])
                aux = matriz[0, 2];

            //horizontal y vertical
            for (int i = 0; i < matriz.GetLength(0); i++)
            {
                if (matriz[i, 0] != -1 && matriz[i, 0] == matriz[i, 1] && matriz[i, 0] == matriz[i, 2])
                    aux = matriz[i, 0];

                if (matriz[0, i] != -1 && matriz[0, i] == matriz[1, i] && matriz[0, i] == matriz[2, i])
                    aux = matriz[0, i];
            }


            return aux;
        }

        public bool tableroLleno()
        {
            bool tableroCompleto = true;
            for (int i = 0; i < matriz.GetLength(0); i++)
                for (int j = 0; j < matriz.GetLength(1); j++)
                    if (matriz[i, j] == -1)
                        tableroCompleto = false;


            return tableroCompleto;
        }

        public bool finJuego()
        {
            bool fin = false;
            if (tableroLleno() || ganaPartida() != -1)
                fin = true;

            return fin;

        }

        public void mueveMaquina()
        {

            if (!finJuego())
            {
                int f = 0;
                int c = 0;
                int v = -99999999;
                int aux;

                for (int i = 0; i < matriz.GetLength(0); i++)
                    for (int j = 0; j < matriz.GetLength(1); j++)
                        if (matriz[i, j] == -1)
                        {
                            matriz[i, j] = 1;
                            aux = minimo();
                            if (aux > v)
                            {
                                v = aux;
                                f = i;
                                c = j;
                            }

                            matriz[i, j] = -1;
                        }
                matriz[f, c] = 1;
                ultimoMovimientoMaquina[0] = f;
                ultimoMovimientoMaquina[1] = c;
            }


        }


        private int maximo()
        {
            if (finJuego())
            {
                if (ganaPartida() != -1)
                    return -1;
                else
                    return 0;
            }

            int v = -99999999;
            int aux;
            for (int i = 0; i < matriz.GetLength(0); i++)
                for (int j = 0; j < matriz.GetLength(1); j++)
                    if (matriz[i, j] == -1)
                    {
                        matriz[i, j] = 1;
                        aux = minimo();
                        if (aux > v)
                            v = aux;

                        matriz[i, j] = -1;
                    }

            return v;
        }

        private int minimo()
        {
            if (finJuego())
            {
                if (ganaPartida() != -1)
                    return 1;
                else
                    return 0;
            }

            int v = 99999999;
            int aux;
            for (int i = 0; i < matriz.GetLength(0); i++)
                for (int j = 0; j < matriz.GetLength(1); j++)
                    if (matriz[i, j] == -1)
                    {
                        matriz[i, j] = 0;
                        aux = maximo();
                        if (aux < v)
                            v = aux;

                        matriz[i, j] = -1;
                    }

            return v;
        }
    }
}


  • Como el ejemplo está finalizado os dejo el código del proyecto al completo en este  enlace:

No hay comentarios:

Publicar un comentario

Curso .NET Core en C# - 34.Creamos nuestro propio log

34.Creamos nuestro propio log Hola a todos. En este curso, analizaremos todos los conceptos básicos, intermedios y avanzados de  ASP.NET...