Buenas tardes, estoy tratando de hacer un juego en visual studio 2010 en lenguaje c# pero tengo un problema. Cuando mando a ejecutar me sale de manera normal mi pantalla con los 16 casilleros pero las imágenes se me repiten. Según como he revisado el código la función aleatorio esta bien pero en mi parecer esta la parte del código que esta mal es :
Código:
if(pbfuente.Image == null)
{ pbfuente.Load(apuntadorImagen.ElementAt((Convert.ToInt32(pbfuente.Name.Substring(1, 1)) - 1)).Value);
}
Lamentablemente no se como resolverlo, alguien me podría ayudar???
Me olvidaba siempre la imagen que se repite es la imagen del casillero 1(esquina izquierda superior) y se repite en toda la 4ta fila y en los 3 últimos de la 3era fila.
Desde ya gracias por tu tiempo y por compartir sus conocimientos.
Código:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
namespace JuegoMemoriaSO
{
public partial class frmMemorama : Form
{
private List<int> numeros;
Dictionary<int, string> apuntadorImagen;
List<string> pictureDescartados;
int totalPares = 0;
public frmMemorama()
{
InitializeComponent();
}
private void frmMemorama_Load(object sender, EventArgs e)
{
//leemos la carpeta contenedora de imagenes
List<string> listaImagenes = new List<string>();
foreach (string item in Directory.GetFiles(Path.Combine(Application.StartupPath, "images")))
{
listaImagenes.Add(item);
}
//duplicamos las imagenes en la lista para poder formar los pares
listaImagenes.AddRange(listaImagenes);
//generamos una lista de la cual obtendremos numeros aleatorios con una longitud igual al total de imagenes
numeros = new List<int>();
for (int i = 1; i <= listaImagenes.Count; i++)
{
numeros.Add(i);
}
//en un dictionary con "keys" del 1 al total de imagenes
//asignamos en el "value" de manera aleatoria la ruta de las imagenes
apuntadorImagen = new Dictionary<int, string>();
for (int i = 1; i <= listaImagenes.Count; i++)
{
apuntadorImagen.Add(i, listaImagenes.ElementAt(obtenerAleatorioDeLista() - 1));
}
//asignamos el evento click a todos los controles picture box
foreach (Control ctrl in this.Controls)
{
if (ctrl is PictureBox)
{
PictureBox ctrlPB = ctrl as PictureBox;
ctrl.Click += new EventHandler(pictureBox_Click);
}
}
//aqui iremos guardando los pares que ya fueron descubiertos
this.pictureDescartados = new List<string>();
}
//evento click utilizado por todos los picture box
private void pictureBox_Click(object sender, EventArgs e)
{
//ya que los 6 picture box utilizan este mismo evento click, mediante la siguiente linea obtienes el control
//que envio el click actual
PictureBox pbfuente = sender as PictureBox;
//si el nombre del picture que envio el click ya se encuentra en los descartados salimos del metodo
if(this.pictureDescartados.Contains(pbfuente.Name))
return;
//si el picture no tiene imagen cargamos la que le corresponde, obteniendo el path de la imagen que anteriormente
//guardamos en el dictionary de manera aleatoria... obtenemos el key que le corresponde en el dictionary haciendo un substring en su nombre para obtener unicamente el numero, ya que sus nombres son: p1, p2, p3... sucesivamente.
if(pbfuente.Image == null)
{ pbfuente.Load(apuntadorImagen.ElementAt((Convert.ToInt32(pbfuente.Name.Substring(1, 1)) - 1)).Value);
}
else
{
pbfuente.Image = null;
return;
}
//solo cuando este 2 imagenes abiertas verificaremos si corresponden como par
if (totalAbiertos() % 2 == 0)
{
if (verificarPictureAbierto(pbfuente)) //enviamos la instancia del picture box para evaluar si ya esta su par abierto
{ //si resultaron ser pares incrementamos el contador y mostramos el mensaje
this.totalPares++;
MessageBox.Show(this.totalPares + " pares");
if (totalPares == apuntadorImagen.Count/2) //verificamos si todos los pares ya fueron descubiertos
{
MessageBox.Show("ganaste");
}
}
else
{
//si no resultaron ser un par
MessageBox.Show("no coinciden");
limpiarImagenes(); // "volteamos" nuevamente todas las cartas
}
}
}
bool verificarPictureAbierto(PictureBox pbFuente)
{
//realizamos un recorrido en los controles contenidos dentro del winform
foreach (Control item in this.Controls)
{
if (item is PictureBox) //filtramos solo aquellos que sean picture box
{
PictureBox asPictureBox = item as PictureBox; //casteamos cada control como picturebox
//solo compararemos las imagenes siempre y cuando el picture que traemos del winform y el picture que viene como parametro no esten contenidos en la lista de descartados; y tambien que ambas instnacias no sean el mismo
if (!this.pictureDescartados.Contains(asPictureBox.Name) && !this.pictureDescartados.Contains(pbFuente.Name) && asPictureBox != pbFuente)
{
//si las imagenes son iguales (mediante el path)...
if (asPictureBox.ImageLocation == pbFuente.ImageLocation)
{
//...los agregamos a la lista de descartados y devolvemos true (es un par)
this.pictureDescartados.Add(asPictureBox.Name);
this.pictureDescartados.Add(pbFuente.Name);
return true;
}
}
}
}
return false;
}
void limpiarImagenes()
{
//recorremos los controles en el winform
foreach (Control item in this.Controls)
{
if (item is PictureBox)
{
PictureBox asPictureBox = item as PictureBox; //casteamos cada item como picture box
//limpiamos la imagen de todos aquellos que no esten en la lista de descartados
if (!pictureDescartados.Contains(asPictureBox.Name))
{
asPictureBox.Image = null;
asPictureBox.ImageLocation = null;
}
}
}
}
int totalAbiertos()
{
int total = 0;
foreach (Control item in this.Controls)
{
if (item is PictureBox)
{
PictureBox asPictureBox = item as PictureBox;
if (asPictureBox.Image != null)
total++;
}
}
return total;
}
//con este metodo devolvemos un aleatorio de la lista de numeros
//y lo eliminamos para que ya no sea considerado en la proxima llamada
public int obtenerAleatorioDeLista()
{
if (this.numeros.Count - 1 < 0)
{
return -1;
}
Random aleatorio = new Random(DateTime.Now.Millisecond);
int aleatorioEntero = aleatorio.Next(0, this.numeros.Count - 1);
int numero = this.numeros[aleatorioEntero];
this.numeros.RemoveAt(aleatorioEntero);
return numero;
}
}
}