Juego del ahorcado en C# (C Sharp)



Hola! pues he decidido especializarme en C#, por lo que empezare a desarrollar varios programas empleando en este lenguaje. Para esta ocasión he programado algo sencillo, el famoso juego del ahorcado en el cual se tiene que adivinar que palabra es. 

Debido a que  me encuentro trabajando en un Cyber estoy frente a una computadora casi todo el día y tengo acceso a un ordenador medio potente en el cual instale un IDE gratuito que se llama SharpDevelop 4.1 que es exclusivo para este lenguaje y muy liviano, para su uso requiere tener instalado NET Framework 4.0.



Muy bien empezaremos con el proyecto, para ellos necesitamos dibujar nuestro muñequito que se va ahorcar, el cual yo dibuje en paint 10 dibujos.








Estos serán almacenados en una variable del tipo string que contendrá la ubicación de cada imagen:

private string[] imágenes={“aho1_.PNG”,”aho2_.PNG”…”aho10_.PNG};

También he pensado en crearme 5 temas los cuales son:

  • cosas de la casa
  • materias de la escuela
  •   nombre de animales
  • partes del cuerpo
  • frutas y verduras

Ya con eso vamos a la lógica  del juego  de forma general:

  • Mostrar el titulo
  •  Elegir un tema y presiona el botón jugar
  •  Mostrar el numero de letras de la palabra
  • Presionar la letra
  •  Checar si esta o no la letra elegida
  •  Si es buena o mala aumentar las buenas o las malas y mostrar la imagen del muñequito
  • Mientras se juega revisar si ya se gano o  si ya se  perdió


Vamos ahora con la lógica interna del juego:

1.-Al momento de dar clic en el botón jugar, de acuerdo al tema elegido será la palabra mostrada, para ello crearemos para cada tema un arreglo del tipo string  de tamaño indefinido.

private string[] cosas={“ventilador”,”mesa”,”refrigerador”,…”modular”};
private string[] animales={“gato”,”perro”,”burro”,…”tortuga”};
privare string[]cuerpo={“cabeza”,”orejas”,”nariz”….”antebrazo”};
private string[] fruver={“manzana”,”apio”,”mango”,…”cilantro”};

2.-checaremos que tema se eligió, en otras palabras que radio button esta tildado:

        void Button1Click(object sender, EventArgs e)
        {
            //tema elegido
            if(radioButton1.Checked==true){
                tema_elegido=1;//variable global tema a tema 1
                Iniciar_juego();//llamar la funcion iniciar juego
            }
            else if(radioButton2.Checked==true){
                tema_elegido=2;
                Iniciar_juego();
            }
            else if(radioButton3.Checked==true){
                tema_elegido=3;
                Iniciar_juego();
            }
            else if(radioButton4.Checked==true){
                tema_elegido=4;
                Iniciar_juego();               
            }
            else if(radioButton5.Checked==true){
                tema_elegido=5;
                Iniciar_juego();
            }
            else// de los contrario mostrar que no se eligio nada
                MessageBox.Show("elige una opcion","el ahorcado");           
        } 

3.- ya que modificamos la variable global tema_elegido llamamos a la función Iniciar_juego(); la cual se encargará de:

        public void Iniciar_juego(){
            groupBox1.Visible=false;//oculta panel de eleccion del tema
            PabElegida=temas(tema_elegido);//tiene la palabra elegida
            tamanio=PabElegida.Length;//guarda el tamaño de la palabra elegida
            Crear_texto();//modifica el texbox exclusivo para esa palabra
            Count_Letras(PabElegida);//cuenta las letras de la palabra elegida
            cant++;//debido a que mi contador falla incremento uno mas a la variable+
            //global cant
            //muestro la cantidad de letras de la palabra elegida
            label1.Text="Tiene "+PabElegida.Length.ToString()+" letras";
            Jugar=true;//activo que ya se esta jugando
            maskedTextBox1.Focus();//y pongo el foco en el maskedtexbox
        }

4.-para lo anterior crearemos una función Buscar_palabra que recibirá como parámetro de valores  el tamaño del arreglo del tema elegido para generar un random de 0 a este tamaño para que así se pueda elegir una palabra del tema:

        public void Buscar_palabra(int cantcad){
            Random a =new Random();
            num_text=a.Next(0,cantcad);
            //MessageBox.Show(num_text.ToString());
        }

5.- También crearemos una función Temas que recibirá el número del tema y retornará la palabra aleatoria que se eligió en Buscar_palabra:

        public string temas(int Var){
            string Tema_Ele="";
            switch(Var){
                case 1:
                    Buscar_palabra(cosas.Length); //se envía el tamaño
                    Tema_Ele = cosas[num_text]; //y después el numero del pala palabra elegida
                    break;
                case 2:
                    Buscar_palabra(materias.Length);
                    Tema_Ele = materias[num_text];
                    break;
                case 3:
                    Buscar_palabra(animales.Length);
                    Tema_Ele = animales[num_text];
                    break;
                case 4:
                    Buscar_palabra(cuerpo.Length);
                    Tema_Ele = cuerpo[num_text];
                    break;
                case 5:
                    Buscar_palabra(fruver.Length);
                    Tema_Ele = fruver[num_text];
                    break;
            }
            return Tema_Ele;
        }

6.- Después crearemos la función Crear_texto que modifica el maskedtextbox para adecuarlo a la palabra que salió sorteada en el random del tema elegido.

        public void Crear_texto(){
            //casa 4  para progrmacion 4-1 =3
            string mas="";//varible vacia que guardara la palabra final
            for(int i=1;i<=tamanio;i++)//limite de letras de la variable tamanio
            {
                mas+="-a";//concatena la mascara para el maskedtexbox
                antes+="- ";//concatena la palabra guionvacio para un buen conteo de letras
            }
            this.maskedTextBox1.Mask = mas;//se modifica la mascara del maskedtexbox
        }

7.-Seguido crearemos la función contar letras esta es especial ya que cuenta las letras de la palabra elegida pero únicamente las letras individuales es decir que si por ejemplo la palabra casa tiene un tamaño de 4 letras pero para el juego tendrá un tamaño de 3 letras es decir la letra a se toma solo una vez. Tiene una pequeña falla que cuenta las letras menos uno, es por ello que en el método Iniciar_Juego le incremento uno mas a la variable global cant:

        public void Count_Letras(string cadelegida){
            cant++;//incrementa en uno ya que se reviza la prime letra con todas
            string precount=cadelegida;//se almacena la palabra elegida
            string precount2="",precount3="";//dos variable de apoyo
            for(int x=0;x<precount.Length;x++){//se recorre cada palabra con el tamaño de la palabra elegida
                precount2=precount.Substring(0,1);//primera letra por defecto se guarda
                if(precount2!=precount.Substring(x,1)){//si esta es diferente se 
                    precount3+=precount.Substring(x,1);// concatena en la tercer varible
                }
            }
            if(precount3.Length!=1)//cuando queda mas de una palabra se sigue
                Count_Letras(precount3);//llamando solita la funcion 
        }

8.- También crearemos algo resetee los valores para que podamos seguir jugando:

        public void reset(){
            groupBox1.Visible=true;//Muestra el grupo de texto
            listBox1.Items.Clear(); //vacia el lixbox
            maskedTextBox1.Clear(); //resetea el maskedtext
            pictureBox1.ImageLocation="images/vacio.PNG";//muestra una imagen vacia
            malas=-1;//malas se vuelve a resetar
            antes="";//se vacia la cadena
            PabElegida="";//se vacia la cadena    
        }

9.- ahora vamos con el maskedtexbox cuando se deja de presionar la tecla es aquí donde reviso si ya gano el jugador, de ser así se llama al método reseto.

        void MaskedTextBox1KeyUp(object sender, KeyEventArgs e)
        {
            this.maskedTextBox1.Text=antes;
            if(buenas==cant && malas<10){
                    MessageBox.Show("FELICIDADES");
                    reset();
            }
        }

10.-En el maskedtexbox en el método cuando se presiona una tecla se revisa si la variable jugar es verdadera, de ser así se llama el método  texto_ver, enviándose como parámetro de valor el objeto keypress osea la tecla que presione:
        void MaskedTextBox1KeyPress(object sender, System.Windows.Forms.KeyPressEventArgs e)
        {
            if(Jugar==true)
            {
                //MessageBox.Show("Joshyba");
                texto_ver(e);
            }
        }

11.- y por ultimo la función de texto_ver la cual se encarga de analizar la tecla presionada si esta incrementamos la variable global buenas en uno, y si no malas en uno se modifica el maskedtexbox con la nueva palabra, la letra que no esta se añade al listbox,y por cada mala se muestra la imagen respectiva en el pictureBox si se pierde se llama al método reseteo.

        public void texto_ver(System.Windows.Forms.KeyPressEventArgs e)
        {
        //checando si esta la ala letra
            bool esta=false;//bandera si se encuentra la letra elegida
            string mas2="";//cadena de ayuda
            //tamaño de la palabra elegida
            /*si la palabra elegida elegida está se concatena a la varible mas
             * de lo contrario se concatena guion mas vacio a la varible mas
             * para checar que la letra se convierte a minuscula.
             * se modifica tambien la bandera esta en verdadero*/
            for(int x=0;x<PabElegida.Length;x++)
            {
                if(PabElegida.Substring(x,1)==e.KeyChar.ToString().ToLower())
                {
                    mas2+=("-"+e.KeyChar.ToString());
                    esta=true;
                }
                else{
                    mas2+="- ";
                }
            }
            //completar cadena
            //se crean una varible para la candena final despues de revizar si esta o no
            // y una bandera para no aumentar mucho las buenas por la repeticion
            // de las letras como casa que serian 2 veces
            string mientras="";bool gt=true;
            /*para ello se toma el tamaño de la varible global antes
             * que contiene al el valor del tipo cadena del maskedTextBox
             * si antes.vacio es igual igual a vacio y
             * la cadena de ayuda anterior es diferente de vacio
             * entonces se contatena a mientras osea la letra precionada*/
            for(int y=0;y<antes.Length;y=y+2)
            {
                if(antes.Substring(y,2)=="- " && mas2.Substring(y,2)!="- "){
                    mientras+=mas2.Substring(y,2);
                    if(gt==true)buenas++;//si fue verda k de ley asi se incrementa buenas
                    gt=false;// y se pone falso para que no cuente las demas letras que se repiten en la palabra
                }
                else{
                    mientras+=antes.Substring(y,2);//de lo contrartio se sigue poniendo vacio
                }
            }
            this.maskedTextBox1.Text=mientras;// se modifica el valor de maskedTexBox
            antes=mientras;//y se vuelve a guardar esto en antes para su proxima revision
            if(esta==false){//si no estaba se:
            malas++; //incrementa malas y
            listBox1.Items.Add(e.KeyChar.ToString());// se añade al ListBox
            }
            if(malas>-1)//si malas es mayor que -1 entonces se nuestra la respectiva imagen en el picture
                pictureBox1.ImageLocation="images/"+imagenes[malas];
            if(malas==9){//si malas llega a nueves se muestra el msj perdio y se reseta el juego
                    MessageBox.Show("HAS PERDIDO,JA JA JA");
                    reset();
            }       
            esta=false;//por ulimo no se esta jugando
        }

12.-Ok. Amigos es todo espero que este pequeño jueguito les sea de su agrado y lo revisen, mas abajo como siempre el código fuente del juego listo para descargar. Saludos y Buen día.











Comentarios

  1. exelente aporte oye amigo no se ve la extructura completa del codigo en el programa para hacerle modificaciones en el archivo?
    nesecito una ayudiita tengo que entregarlo pa estos dias si es tan amablee de decirme este es mi correo estuar332@hotmail.com espero pronta respuesta

    ResponderEliminar
  2. oye me podrias ayudar tambien por fa que con con el codigo donde estan las palabras u opciones para seleccionar el programa aun no hace nada, necesito saber cual es el que falta muchas gracias aqui mi correo, eduardodl97@gmail.com

    ResponderEliminar
    Respuestas
    1. Hola que tal!!!, ya has descargado la fuente? de ser asi solo te queda ejecutar y probar el funcinamiento!, recuerda que las palabras estan alamcenadas en arreglos.

      Eliminar
  3. Hola amigo buenas noches tu programa me parece interesante con tu permiso voy a utilizar tu codigo para modificarlo segun una necesidad y muchas gracias por el aporte. Soy nuevo en esto y tu aporte es para mi importante.

    ResponderEliminar
  4. Hola,me podrías ayudar con tu código?

    ResponderEliminar
  5. Disculpa la tardanza que dudas tienes

    ResponderEliminar

Publicar un comentario

Entradas populares de este blog

Como almacenar la ruta de un archivo en un BD – Visual Studio 2012 – Mysql – Csharp

Credencial en Visual Studio 2012 – Visual Basic .NET - SQLSever - Crystal Report – Campos de formula