Foros del Web » Programando para Internet » ASPX (.net) »

Juego Memoria 4X4

Estas en el tema de Juego Memoria 4X4 en el foro de ASPX (.net) en Foros del Web. 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 ...
  #1 (permalink)  
Antiguo 07/08/2012, 13:27
 
Fecha de Ingreso: agosto-2012
Mensajes: 3
Antigüedad: 12 años, 3 meses
Puntos: 0
Juego Memoria 4X4

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;
        }       
       
    }
}
  #2 (permalink)  
Antiguo 07/08/2012, 13:45
 
Fecha de Ingreso: agosto-2012
Mensajes: 3
Antigüedad: 12 años, 3 meses
Puntos: 0
Respuesta: Juego Memoria 4X4

Me olvidaba de comentarle que la imágenes las en una carpeta llamada images, la que agregue al proyecto windows form

Etiquetas: c#, juego, memoria
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 08:05.