Código:
Lamentablemente no se como resolverlo, alguien me podría ayudar???if(pbfuente.Image == null) { pbfuente.Load(apuntadorImagen.ElementAt((Convert.ToInt32(pbfuente.Name.Substring(1, 1)) - 1)).Value); }
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; } } }