Autor Tema: TA-TE-TI C# WindowsForms Ayuda Mejorar Inteligencia Artificial heurística  (Leído 1762 veces)

German Pi Dote

  • Sin experiencia
  • *
  • Mensajes: 2
  • Re Novato
    • Ver Perfil
Hola Gente!! Soy un estudiante autodidacta de programación. Hice el juego ta-te-ti, calculo que muchos deben haber comenzado por aquí en su proceso de aprendizaje.
Escribo para pedir ayuda, necesito mejorar la inteligencia artificial, ya que juega de forma aleatoria y no sigue una conducta ganadora o al menos bloqueadora.
Aquí el código: Está en C# y hecho en WindowsForms. Espero que no sea difícil de entender.

Código: [Seleccionar]
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WindowsFormsApplication415._5_TaTeTi_con_Forms
{
    public partial class Form1 : Form
    {
       
        Graphics papel;                                         
        PictureBox[] picturePaquete = new PictureBox[9]; //empaquetado de Picturebox en arreglo
        Random ran = new Random();
        int[] iArtificial = new int[9];    //arreglo usado para verificación de ganador o
 perdedor
        public int xxx=0;       //indica que Picturebox se eligió del empaquetado
       
           public Form1()
        {
            InitializeComponent();  //cada picturebox se asocia al arreglo
            picturePaquete[0] = pictureBox1;
            picturePaquete[1] = pictureBox2;
            picturePaquete[2] = pictureBox3;
            picturePaquete[3] = pictureBox4;
            picturePaquete[4] = pictureBox5;
            picturePaquete[5] = pictureBox6;
            picturePaquete[6] = pictureBox7;
            picturePaquete[7] = pictureBox8;
            picturePaquete[8] = pictureBox9;
        }
        private void botonNuevoJuego_Click(object sender, EventArgs e)
        {
            xxx = 0; //se reinicia el valor del picturebox elegido.
            for (int i = 0; i <picturePaquete.Length; i++) // se borran los picturebox
            {
                papel = picturePaquete[i].CreateGraphics();
                papel.Clear(Color.Black);
                 
            }
            for (int p  = 0; p  <iArtificial.Length; p ++) // se reinicia el arreglo de verificación
            {
                iArtificial[p] = 0;
            }
        }

       
        private void Dibujar()
        {
            /*dependiendo del picturebox elegido,
             * la variable xxx toma su valor entero y se crea el dibujo
             * en ese picturebox*/
           
            papel = picturePaquete[xxx].CreateGraphics();
            Pen lapiz=new Pen(Color.Red);
            int x = 160;
            int  y = 147;
            papel.DrawLine(lapiz, 0, 0, x, y);
            papel.DrawLine(lapiz, x, 0, 0, y);
           
           

        }
        private void IArtificial()
        {/* Aquí lo que quiero mejorar!
          * el rival juega de forma aleatoria,
          * no sigue ningún patron ganador.
          * Se genera un número aleatorio*/
            int aleatorio = ran.Next(0, 9);
           
            while (aleatorio == xxx || iArtificial[aleatorio]!=0)
            {
                aleatorio = ran.Next(0, 9);

            }
            /*Cada vez que el jugador presiona un picturebox o
             * que la computadora dibuja un circulo,
             * en el arrelo de verificación se guarda un número
             *  1 para el caso del jugador y un 10 para el caso de la
             * computadora, en el indice que corresonde al picturebox donde se dibujó.
             * El resultado del ciclo WHILE es un número entero que indica un picturebox
             * en donde no se ha dibujado aun.*/
             
               
               iArtificial[aleatorio] = 10; //se graba el 10 y se dibuja

                papel = picturePaquete[aleatorio].CreateGraphics();
                Pen lapiz = new Pen(Color.Red);
                int x = picturePaquete[aleatorio].Width;
                int y = picturePaquete[aleatorio].Height;
                papel.DrawEllipse(lapiz, 0, 0, x, y);
                CondicionGanadora(); //se verifica para saber si la PC ganó luego de cada dibujo.
           
        }

        private void CondicionGanadora()
        {
            int suma0 = 0;
            int suma1 = 0;
            int suma2 = 0;
            int suma3 = 0;
            int suma4 = 0;
            int suma5 = 0;
            int suma6 = 0;
            int suma7 = 0;
           
            // Las posibles combinaciones ganadoras
           
            suma0 = iArtificial[0] + iArtificial[3] + iArtificial[6];
            suma1 = iArtificial[0] + iArtificial[4] + iArtificial[8];
            suma2 = iArtificial[0] + iArtificial[1] + iArtificial[2];
            suma3 = iArtificial[1] + iArtificial[4] + iArtificial[7];
            suma4 = iArtificial[2] + iArtificial[5] + iArtificial[8];
            suma5 = iArtificial[2] + iArtificial[6] + iArtificial[4];
            suma6 = iArtificial[3] + iArtificial[4] + iArtificial[5];
            suma7 = iArtificial[6] + iArtificial[7] + iArtificial[8];
           
            /* El jugador humano graba un "1" en el arreglo de verificación,
             * por lo tanto si la suma de cualquiera de las combinaciones ganadoras es 3
             * el ganador es el jugador humano.*/
           
            if (suma0 == 3 || suma1 == 3 || suma2 == 3 || suma3 == 3 || suma4 == 3
                || suma5 == 3 || suma6 == 3 || suma7 == 3)
            {
                MessageBox.Show("Ganaste");
                for (int i = 0; i < picturePaquete.Length; i++)
                {
                    papel = picturePaquete[i].CreateGraphics();
                    papel.Clear(Color.Black);// se reinicia el tablero
                }
                for (int p = 0; p < iArtificial.Length; p++)
                {
                    iArtificial[p] = 0;//se reinicia el arreglo de verificación
                }
            }

            /* La computadora graba un "10" en el arreglo de verificación,
             * por lo tanto si la suma de cualquiera de las combinaciones ganadoras es 30
             * el ganador es la computadora.*/
           
            if (suma0 == 30 || suma1 == 30 || suma2 == 30 || suma3 == 30 || suma4 == 30
                || suma5 == 30 || suma6 == 30 || suma7 == 30)
            {
                MessageBox.Show("Perdiste");

                for (int i = 0; i < picturePaquete.Length; i++)
                {
                    papel = picturePaquete[i].CreateGraphics();
                    papel.Clear(Color.Black);// se reinicia el tablero
                }
                for (int p = 0; p < iArtificial.Length; p++)
                {
                    iArtificial[p] = 0;//se reinicia el arreglo de verificación
                }
            }
           
            int suma = 0;
           
            /*Control de empate, luego de que todos los picturebox fueron usados,
             * la suma de todos los elementos del arreglo de verificación, puede dar dos
             * resultados, dependiendo de quien comenzó el juego. Si comenzó el humano,
             * el valor será 45 pero si comenzó la computadora el valor será 54*/

            for (int a = 0; a < iArtificial.Length; a++)
            {
                suma = suma + iArtificial[a];
            }


            if (suma == 45 || suma==54)
            {
                MessageBox.Show("Empate, juega de nuevo");
                   
                xxx = 0;
                for (int i = 0; i < picturePaquete.Length; i++)
                {
                    papel = picturePaquete[i].CreateGraphics();
                    papel.Clear(Color.Black);// se reinicia el tablero

                }
                for (int p = 0; p < iArtificial.Length; p++)
                {
                    iArtificial[p] = 0;// se reinicia el arreglo de verificación
                }
            }
        }
       
       
        /* De aqui en mas, lo que sucede cuando el jugador humano presiona,
         * un picturebox*/
       
        private void pictureBox1_Click(object sender, EventArgs e)
        {
            xxx = 0;            // se elige el número de picturebox donde se dibujará.
            iArtificial[0] = 1; // se graba en el ach. de verificación el 1 para el índice 0
            Dibujar();          // se procede a dibujar
            CondicionGanadora();// se verifica resultado del juego
            IArtificial();      // se realiza la jugada del ordenador.
         
        }

        private void pictureBox2_Click(object sender, EventArgs e)
        {
            xxx = 1;
            iArtificial[1] = 1;
            Dibujar();
            CondicionGanadora();  //Ubicados de esta manera, la CondicionGanadora y la jugada
            IArtificial();        // del ordenador, genera que si tu pierdes, tu comienzas la
                                  // la nueva partida, y viceversa, si ganas comienza la PC.
           
        }

        private void pictureBox3_Click(object sender, EventArgs e)
        {
            xxx = 2;
            iArtificial[2] = 1;
            Dibujar();
            CondicionGanadora();
            IArtificial();
           
        }
        private void pictureBox4_Click(object sender, EventArgs e)
        {
            xxx = 3;
            iArtificial[3] = 1;
            Dibujar();
            CondicionGanadora();
            IArtificial();

        }
        private void pictureBox5_Click(object sender, EventArgs e)
        {
            xxx = 4;
            iArtificial[4] = 1;
            Dibujar();
            CondicionGanadora();
            IArtificial();
           
        }

        private void pictureBox6_Click(object sender, EventArgs e)
        {
            xxx = 5;
            iArtificial[5] = 1;
            Dibujar();
            CondicionGanadora();           
            IArtificial();
           

        }
        private void pictureBox7_Click(object sender, EventArgs e)
        {
            xxx = 6;
            iArtificial[6] = 1;
            Dibujar();
            CondicionGanadora();
            IArtificial();

        }
        private void pictureBox8_Click(object sender, EventArgs e)
        {
            xxx = 7;
            iArtificial[7] = 1;
            Dibujar();
           
            IArtificial();
           
            CondicionGanadora();
        }

        private void pictureBox9_Click(object sender, EventArgs e)
        {
            xxx = 8;
            iArtificial[8] = 1;
            Dibujar();
            CondicionGanadora();
            IArtificial();
           
        }
       
        private void MasDificultad()
        {/*Aqui está el problema....
          * Como hacer la comutadora juegue a ganar o a impedir que ganes!
          * Gracias por tu ayuda*/
           
           
        }

    }
}
« Última modificación: 18 de Octubre 2020, 19:16 por Ogramar »

German Pi Dote

  • Sin experiencia
  • *
  • Mensajes: 2
  • Re Novato
    • Ver Perfil
Re:TA-TE-TI Ayuda Mejorar I. Artificial C# WindowsForms
« Respuesta #1 en: 18 de Octubre 2020, 02:46 »
Ya lo resolví, ahora no le puedo ni ganar jaja.....
Se puede borrar el post Administradores, si así lo desean.
Igualmente si a alguien le interesa le puedo mandar el código o alguna guía de como lo hice.
Saludos

Ogramar

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2659
    • Ver Perfil
Re:TA-TE-TI Ayuda Mejorar I. Artificial C# WindowsForms
« Respuesta #2 en: 18 de Octubre 2020, 19:12 »
Buenas, lo mismo que en el otro hilo, por favor lee https://aprenderaprogramar.com/foros/index.php?topic=1460.0 donde están las indicaciones sobre cómo poner título a los temas y otras cuestiones. Si lo deseas, pon la solución al ejercicio para ayudar a otros. Si no, se borra el hilo y ya está. Salu2

 

Sobre la educación, sólo puedo decir que es el tema más importante en el que nosotros, como pueblo, debemos involucrarnos.

Abraham Lincoln (1808-1865) Presidente estadounidense.

aprenderaprogramar.com: Desde 2006 comprometidos con la didáctica y divulgación de la programación

Preguntas y respuestas

¿Cómo establecer o cambiar la imagen asociada (avatar) de usuario?
  1. Inicia sesión con tu nombre de usuario y contraseña.
  2. Pulsa en perfil --> perfil del foro
  3. Elige la imagen personalizada que quieras usar. Puedes escogerla de una galería de imágenes o subirla desde tu ordenador.
  4. En la parte final de la página pulsa el botón "cambiar perfil".