Lo que se expone en este artículo ha sido utilizado como ejercicio práctico en la charla técnica que he impartido el día 07/06/2022 a mis compañeros del Máster de Desarrollo Web 2021-2022. Para poder comprender mejor el concepto del ejercicio y/o para tener más conocimiento en el ámbito de la inteligencia artificial, aquí está explicada la parte teórica de la charla.

En la actualidad, hay varios lenguajes de programación con los que se crean IA bastante complejas tales como Phyton, R, Java… Pero para comenzar a entender la lógica que conlleva una inteligencia artificial ¿Se podría hacer con nuestros actuales conocimientos en C#?

La respuesta es un rotundo sí, podemos crear nuestra pequeña inteligencia artificial utilizando C# y el entorno de desarrollo Visual Studio Code 2019 y eso es lo que podremos ir realizando en los próximos pasos.

Prerrequisitos:

  • Tener instalado Visual Studio Code 2019.

Dicho esto, comencemos el ejercicio:

  1. Creamos un nuevo proyecto de tipo Windows Forms App:
Es importante que sea el que tiene el Framework .NET.

2. El nombre del proyecto será TresEnRaya y lo creamos:

Las configuraciones quedan por defecto.

3. Una vez creado nos aparecerá por defecto las diferentes clases y configuraciones:

Configuraciones por defecto.

4. En Form1.cs (el que aparece como un diseño al iniciar la aplicación) comenzaremos añadiendo 10 botones, los cuales 9 estarán añadidos en filas de 3:

Los 9 botones alineados en filas de 3 y el décimo al final de todo.

Anotación: Para que aparezca el ToolBox y poder añadir los botones, sólo hay que ir a View > ToolBox.

5. Una vez añadidos los botones, vamos a dejar la clase Form1.cs por el momento y creamos una nueva clase llamada TresEnRaya.cs en la que tendremos los métodos que conformarán la IA y diferentes comprobaciones para seguir las ‘normas’ del juego:

Primera parte de la clase.
Segunda parte de la clase.
Tercera parte de la clase
Cuarta parte de la clase.
Quinta parte de la clase.
Sexta parte de la clase.
Séptima parte de la clase.

En el método MueveMaquina() es dónde tenemos nuestro logaritmo para que nuestra IA interaccione con nosotros al jugar ‘Tres en Raya’. Es importante dejar claro que dicho método necesita del método Mínimo y Máximo ya que, con estos dos, va calculando qué combinación (en la jugada) es la que más ventaja tiene (o la que menos para al menos poder empatar) para poder ganarnos la partida.

6. Ya creada y preparada la clase TresEnRaya.cs, volvemos a la clase Form1.cs para unir la parte lógica con la parte del diseño y darle la funcionalidad al juego que estamos creando:

Primera parte de la clase Form1.

Anotación: Debemos crear un objeto de la clase TresEnRaya para acceder a sus propiedades y métodos, un array de 2 dimensiones llamada matriz para la posición de los botones y finalmente una variable tipo int llamada ganador para tener un control de quién ha ganado, quién pierde o si se llega a un empate.

private void ComprobarGanador()
        {
            //En este array obtenemos los últimos movimientos de la máquina.

            int[] ultMov = tresEnRaya.UltimoMovimientoMaquina;

            //En cada if lo que hago es comprobar si el último movimiento de la máquina concide con el último momento realizado (cuando pulsas), y si es así 
            //aparecerá el botón con el color rosa y el texto 0 para indicar que ha hecho un movimiento la máquina.

            if (ultMov[0] == 0 && ultMov[1] == 0) {

                button1.Text = "0";
                button1.BackColor = Color.LightPink;
            }

            if (ultMov[0] == 0 && ultMov[1] == 1) {

                button2.Text = "0";
                button2.BackColor = Color.LightPink;
            }

            if (ultMov[0] == 0 && ultMov[1] == 2) {

                button3.Text = "0";
                button3.BackColor = Color.LightPink;
            }

            if (ultMov[0] == 1 && ultMov[1] == 0) {

                button6.Text = "0";
                button6.BackColor = Color.LightPink;
            }

            if (ultMov[0] == 1 && ultMov[1] == 1) { 

                button5.Text = "0";
                button5.BackColor = Color.LightPink;
            }

            if (ultMov[0] == 1 && ultMov[1] == 2) { 

                button4.Text = "0";
                button4.BackColor = Color.LightPink;
            }

            if (ultMov[0] == 2 && ultMov[1] == 0) { 

                button9.Text = "0";
                button9.BackColor = Color.LightPink;
            }

            if (ultMov[0] == 2 && ultMov[1] == 1) {
                
                button8.Text = "0";
                button8.BackColor = Color.LightPink;
            }

            if (ultMov[0] == 2 && ultMov[1] == 2) { 

                button7.Text = "0";
                button7.BackColor = Color.LightPink;
            }
               

            if (ganador == 0) MessageBox.Show("Ganaste!");
             

            if (ganador == 1) MessageBox.Show("Perdiste...");
        

            if(ganador==-1 && tresEnRaya.TableroLleno())
                MessageBox.Show("Empate!"); 


        }
Parte tercera de la clase Form1.cs
 //En cada evento click de cada botón llamamos a un método al cual le pasamos la posición (esa posición es la que ocupa en una matriz) y el nombre del botón
        //que ha sido pulsado.

        private void button1_Click(object sender, EventArgs e)
        {
            EventoBotones(0, 0, button1);
       }

        private void button2_Click(object sender, EventArgs e)
        {
            EventoBotones(0, 1, button2);
           
        }

        private void button3_Click(object sender, EventArgs e)
        {
            EventoBotones(0, 2, button3);
   
        }

        private void button6_Click(object sender, EventArgs e)
        {
            EventoBotones(1, 0, button6);
     
        }

        private void button5_Click(object sender, EventArgs e)
        {
            EventoBotones(1, 1, button5);
        }

        private void button4_Click(object sender, EventArgs e)
        {
            EventoBotones(1,2, button4);
        }

        private void button9_Click(object sender, EventArgs e)
        {
            EventoBotones(2, 0, button9);
        }

        private void button8_Click(object sender, EventArgs e)
        {
            EventoBotones(2, 1, button8);
        }

        private void button7_Click(object sender, EventArgs e)
        {
            EventoBotones(2, 2, button7);
        }

        //Este botón es el que tiene como texto "Nueva Partida" y de lo que encarga es de volver a iniciar la partida dándole un nombre vacío a todos los demás botones
        //es como que se resetea. Además también lo que hacemos es asignarle a la propiedad Matriz, la posición de los botones (que es una matriz en sí)

        private void button10_Click(object sender, EventArgs e)
        {
            tresEnRaya = new TresEnRaya();
            tresEnRaya.InicializarPartida();
            matriz = tresEnRaya.Matriz;
            ganador = -1;

            label1.Text = button1.Text = button2.Text = button3.Text = button4.Text = button5.Text = button6.Text = button7.Text = button8.Text = button9.Text = String.Empty;

            button1.BackColor = Color.Gray;
            button2.BackColor = Color.Gray;

            button3.BackColor = Color.Gray;
            button4.BackColor = Color.Gray;

            button5.BackColor = Color.Gray;
            button6.BackColor = Color.Gray;

            button7.BackColor = Color.Gray;
            button8.BackColor = Color.Gray;
            button9.BackColor = Color.Gray;
        }

7. Finalmente ejecutamos nuestro ejercicio y…. ¡A jugar!

Ejercicio completado con éxito.

Conclusiones:

Ha sido un poco complicado empezar a entender cómo se van creando las bases para una inteligencia artificial ya que necesita tanto los datos que le enviamos (cada vez que pulsamos el botón en el juego) como el algoritmo en sí (para dar una respuesta), pero es un tema muy interesante para investigar más en profundidad hasta con lenguajes de programación que no están especializados para IA como es C# y así ir asentando bases en este tema.

Autor/a: Maria Adela España Moya.

Curso: Desarrollo Web Full Stack, MultiCloud y Multiplataforma.

Centro: Tajamar.

Año académico: 2021-2022.

Código / recursos utilizados / Otros datos de interés: https://github.com/MariaAdel-22/Post_VideoTutorial_CSharp_TresEnRaya

LinkedIn: (32) Maria Adela España Moya | LinkedIn

This Post Has One Comment

  1. Xavi Reply

    Esto es un algoritmo de toda la vida sin NINGUNA IA. Una IA tendría que basarse en cientos de partidas anteriores guardadas en su memoria para deducir su siguiente jugada; no aprende nada ni aprenderá nada nunca, el algoritmo siempre es el mismo y siempre dará los mismos resultados. En fin….

Leave a Comment

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.