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.
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*/
}
}
}