Rompe_Cabezas_IMG en VC# - visual studio 2012 – Por Joshyba



Pues esta es la tercera entrega de juegos en Visual C Sharp y esta implementada conjuntamente con 2 alumnas del CONALEP plantel 022 de Chiapa de Corzo, este juego tiene la idea del juego uno que es el del rompecabezas ya que se trabajó con el evento clic de la picturebox, este cuenta con 4 niveles.
Este juego tiene la poderosa ventaja de que puedes mover la imagen en la posición que tu quieras, es decir no hay restricciones, por lo que lo hace un juego fácil, pero también por las imágenes un poco difícil.

Nivel 1

Nivel 2

Nivel 3

Nivel 4 


Nivela4 final 1

Nivela4 final 2
La ventana principal lee el jugador que tiene el mejor tiempo y su nombre, información que se encuentra almacenada en el archivo Data.dat.

Muy bien ahora vamos con el código:
Super clase del mejor tiempo:
    class Mejor_Tiempo
    {
        string[] cad= new string[2];//arreglo que almacena el nombre y la puntuacion
        StreamWriter escritura; //clase para escribir en el archivo
        public Mejor_Tiempo() //lee el archivo Data.dat
        {
            using (StreamReader sr = File.OpenText("Data.dat"))
            {
                int cont = 0;
                String input;
                while ((input = sr.ReadLine()) != null)
                {
                    cad[cont] = input;//almacena la informacion en el arreglo
                    cont++;
                }
                sr.Close();
            }
        }
        int mejor_tiempo() //retorna el mejor tiempo en segundos
        {
            return Convert.ToInt32(cad[1]);
        }
        void escribir_mejor(string nom, string punto)//escribe el mejor tiempo
        {
            escritura = new StreamWriter("Data.dat");//escribe el nuevo archivo
            escritura.WriteLine(nom);//escribe la 1ra linea el nombre
            escritura.WriteLine(punto); //escribe la 2da linea el tiempo
            escritura.Close(); //cierra la escritura
        }
        public bool checa_mejor(string nomc,string puntoc)//reviza si el tiempo jugado
        { //es mejor al tiempo guardado
            if(Convert.ToInt32(puntoc)<mejor_tiempo())
            {
                escribir_mejor(nomc, puntoc);
                return true;
            }
            else
            {
                return false;
            }
        }
        public string[] mejores()
        {
            return cad;//retorna el nombre del mejor jugador
        }
        public string tiempo_dividido(string tiempo)//super funcion que convierte los segundos
        {// en horas : minutos : segundos
            Int32 segundos = Convert.ToInt32(tiempo);
            int segun_final=segundos%60;
            int minu=segundos/60;
            int minutos=minu%60;
            int horas=minu/60;
            return horas.ToString()+":"+minutos.ToString()+":"+segun_final.ToString();// retorna el tiempos bien claro
        }
    }

Super clase de las imágenes guardas:
    class Imagenes
    {
        public Imagenes()
        {
        }
        //***** declaracion de las imagenes
        string[] fondos={
                            "imagenes/Nivel1.jpg",
                            "imagenes/Nivel2.jpg",
                            "imagenes/Nivel3.jpg",
                            "imagenes/Nivel4.jpg",
                        };
        string[] mini_fondos={
                                "imagenes/mini_Nivel1.jpg",
                                "imagenes/mini_Nivel2.jpg",
                                "imagenes/mini_Nivel3.jpg",
                                "imagenes/mini_Nivel4.jpg",
                             };
        //carga la imagen mini que se va  jugar
        public string cargar_Imagen_Mini(int posi)
        {
            return mini_fondos[posi];
        }
        public string cargar_Imagen(int posi)
        {
            return fondos[posi];
        }
    }

Ahora vamos con el código de los formularios, algo muy importante es que todos comparte la varible NOmbreFull y TiempoFull, para ello declaramos:
public static Form1 Main;

y en el constructor:
Form1.Main = this;

Formulario 1:
        public static Form1 Main;
        public int TiempoFinal = 0;//tiempo total jugado
        public string NombreFull = ""; //nombre del que esta jugando

Cuando carga el formulario leemos los ganadores

Iniciar_Ganadores();


En el botón de inciar el juego:

            if (textBox1.Text == "")//checamos si ya escribimos el nuestro nombre
                MessageBox.Show("Escribe tu nombre");
            else
            {
                Nivel1 n1 = new Nivel1();//si es asi cargamos el nivel 1
                //n1.Tiempofinal = this.TiempoFinal;
                n1.NombreFull = textBox1.Text;//mandamos el nombre
                n1.ShowDialog(); // y los mostramos
            }

Funcion  iniciar ganadores

        private void Iniciar_Ganadores()
        {
            DGWGanadores.Columns.Clear();//limpiamos las columnas
            DGWGanadores.Rows.Clear(); //limpiamos las filas
            //DGWGanadores.ColumnCount = 2;
            DGWGanadores.Columns.Add("Name", "Nombre");//creamos las columnas
            DGWGanadores.Columns.Add("Time", "Tiempo");
            string[] mejores = new string[2];//creamos un arreglo del tipos string
            Mejor_Tiempo mt=new Mejor_Tiempo(); // cargamos la clase mejor tiempo
            mejores = mt.mejores(); //leemos los mejores
            DGWGanadores.Rows.Add(mejores[0], mt.tiempo_dividido(mejores[1])); // lo añadimos
        }

Funcion final

        public void Final()//cuando acaba el juego se llama esta funcion
        {
            Mejor_Tiempo mt=new Mejor_Tiempo();
            if(mt.checa_mejor(NombreFull,TiempoFinal.ToString()))
            {
                MessageBox.Show("Felicidades "+NombreFull+" Haz logrado el mejor tiempo");
            }
            else
            {
                MessageBox.Show("Jajajaja "+NombreFull+" Haz terminado, PERO NO con el mejor tiempo");
            }
            Iniciar_Ganadores();
        }



Muy bien ahora vamos con el código de los niveles, algo que hay que recalcar es que todos los niveles tienen la misma lógica, lo único que cambia es la cantidad de ítems en el arreglo, por lo que solo pondré los del nivel 1, también se agrego referencia a la dll de Windows media player para reproducir mp3, y el sound player para reroducir audio wav para los cliqueos.



Declaramos las variables globales

        public static Nivel1 n1;
        public string NombreFull = "";
        Mejor_Tiempo M_T = new Mejor_Tiempo();//cargamos el mejor tiempo
        WindowsMediaPlayer wplayer = new WindowsMediaPlayer();//cargamos el reprductor wmp
        public int Tiempofinal = 0; //iniciamos el tiempo final en 0
        int x=-1, y=-1; //valores negativos para definir que no se ha dado ningun clic 1 y 2


Declaramos las imágenes y el mapa del juego

        string[] imagenes ={//cargamos las imagenes en el arreglo
                               "imagenes/N1_a.jpg",
                               "imagenes/N1_b.jpg",
                               "imagenes/N1_c.jpg",
                               "imagenes/N1_d.jpg"
                          };
        int[] mapa_juego ={//valores de juego en posicion del mapa
                              3,2,
                              1,0,
                         };


En el load del formulario cargamos:
            wplayer.URL = "sonidos/Música_incidental_de_suspenso_tipo_Hollywood.mp3";//cargamos el sonido
            wplayer.settings.volume = 40; //le ponemos bajitoo
            wplayer.controls.play();  // y damos play para reproducir

            Imagenes img=new Imagenes(); //cargamos la clase imagenes
            PBBien.Visible = false; //aqui ocultamos el picturebox final
            A.ImageLocation = imagenes[mapa_juego[0]];//cargamos el picture 1 y su imagen
            B.ImageLocation = imagenes[mapa_juego[1]];
            C.ImageLocation = imagenes[mapa_juego[2]];
            D.ImageLocation = imagenes[mapa_juego[3]];
            pictureBox1.ImageLocation = img.cargar_Imagen_Mini(0);//cargamos la imagen de guia
            timer1.Enabled = true; // habilitamos el contador


Cargamos el timer:

            Tiempofinal++;//cada segundo incrementamos en uno
            label1.Text = M_T.tiempo_dividido(Tiempofinal.ToString());//mostramos el tiempo formateado


Nuestra super función pictures que cambia la imagen del picture clicado:
        private void pictures(int posi, int valor)//superfuncion que muestra la imagen del picture
        {//recibe la posicion y el valor
            switch (posi)
            {
                case 0:
                    A.ImageLocation = imagenes[mapa_juego[valor]];
                    break;
                case 1:
                    B.ImageLocation = imagenes[mapa_juego[valor]];
                    break;
                case 2:
                    C.ImageLocation = imagenes[mapa_juego[valor]];
                    break;
                case 3:
                    D.ImageLocation = imagenes[mapa_juego[valor]];
                    break;
            }
        }


 En cada picture en el evento clic únicamente llamamos la función  viendo( con su posición);

        private void A_Click(object sender, EventArgs e)
        {
            viendo(0);//llama la funcino viendo
        }


La función viendo es para cambiar la imagen y el valor de cada picture de acuerdo con el clic uno y el clic dos:

        private void viendo(int posi)//esta funcion checa el clic 1 y el clic2
        {
            int prex, prey; //variables para almacenar el valor 1 y 2
            if (x == -1)//si clic 1 = negativo toma el valor de la posicion del
            {
                x = posi;//picturebox cliqueado
            }
           else if (y == -1 && x!=posi)//si clic 2 esta vacio y clic2 es diferente
            {
                y = posi; //se almacena el valor
                //MessageBox.Show(x.ToString() + "<>" + y.ToString());
                pictures(x, y); //se actualiza la imagen
                pictures(y, x);
                prex=mapa_juego[x];//se lee el valor
                prey=mapa_juego[y];
                mapa_juego[y]=prex; //y se actualiza
                mapa_juego[x]= prey;
                x = -1; //se resetea
                y = -1;
            }
            gano(); //checamos si ya gano el juego
        }


Y por ultimo la función del ganador:
        private void gano()
        {
            System.Media.SoundPlayer player = new System.Media.SoundPlayer();//carga la clase para el sonido
            player.SoundLocation = @"sonidos/polish_xrikazen 7425_hifi.wav";//carga el sonido
            player.Play(); // lo reproduce
            bool Gano = true; //gano es verdadero
            for (int x = 0; x < 4; x++) //se reviza todo el mapa si cumple con las posiciones correctas
            {
                if (mapa_juego[x] != x)
                    Gano = false; //si hay uno que no se sale del for
            }
            if (Gano == true)//si salio bien
            {
                PBBien.Visible = true;//mostramos el picture de la img original
                Imagenes img = new Imagenes();// la cargamos
                PBBien.ImageLocation = img.cargar_Imagen(0); // y la mostramos
                timer1.Enabled = false; //paramos el timer
                MessageBox.Show("Felicidades has terminado el Primer Nivel en un Tiempo maximo de : " + M_T.tiempo_dividido(Tiempofinal.ToString()) + " ¿Listo para Seguir?");
                Nivel2 N2 = new Nivel2();//cargamos el nivel2
                N2.Tiempofinal = Tiempofinal;//le damos el nuevo tiempo
                N2.NombreFull = NombreFull; //le pasamos el nombre
                this.Hide(); // ocultamos nivel 1
                wplayer.controls.stop();//paramos la musica
                N2.ShowDialog(); //mostramos nivel 2
            }
        }


Muy bien ahora pues el codigo:

Nota: la dll wmp.dll no la adjunte en el rar.

Saludos y esto es todo con respecto a juegos por el momento.
Visita mis otras paginas:

Comentarios

Entradas populares de este blog

Juego del ahorcado en C# (C Sharp)

RompeCabezas - Juego 1 - VC# 2012

Escribiendo en los TextField de un Pdf con Visual Basic y iTextSharp