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");
}
{
//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
}
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());
}
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;
}
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
}
//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
}
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
}
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();
}
}
{
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);
}
}
{
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
}
{
//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.
exelente aporte oye amigo no se ve la extructura completa del codigo en el programa para hacerle modificaciones en el archivo?
ResponderEliminarnesecito una ayudiita tengo que entregarlo pa estos dias si es tan amablee de decirme este es mi correo estuar332@hotmail.com espero pronta respuesta
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
ResponderEliminarHola 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.
EliminarHola 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.
ResponderEliminarAdelante, saludos!!
EliminarHola que significa el gt?
ResponderEliminares una bandera para no aumentar mucho las buenas
EliminarHola,me podrías ayudar con tu código?
ResponderEliminarDisculpa la tardanza que dudas tienes
ResponderEliminar