Webmaster Workers utiliza cookies. Lea nuestra Política de Privacidad para obtener más información. Para eliminar este mensaje, haga clic en el siguiente botón: Acepto el uso de cookies


[Juego][Consola] Adivina tu numero - Con C#

Bueno chicos, hoy les dejo un tutorial pero que en mi opinión muestra de forma sencilla, como usar diferentes métodos y funciones del C#, así que aquí vamos:

Los programas que utilice aqui fueron:
1 -- MonoDevelop como el IDE
2 -- Dia para hacer el diagrama.

Se puede seguir la guía/tutorial sin ellos, en el caso de la mayoría de los usuarios que usan Visual Studio, no deberían tener problemas, pero simplemente no lo se porque no lo uso.

Primer paso => Crear el proyecto.
Bueno aqui empezamos con el paso mas lógico, crear un proyecto de consola. en la mayoria de los IDE o editor de texto, lo que usen el paso es mas o menos igual Archivo >> Nuevo >> Solucion/proyecto.



En este caso, puse como nombre "juegonumeros", pero ustedes pueden usar el que quieran, almenos en el resto del proyecto no es necesario saber eso.
Continuando y ya con el proyecto hecho, les deberia quedar algo como esto:



En este caso yo recomiendo ejecutarlo tal como esta, para comprobar que si funcione como debe, siempre que se haga un cambio deben ejecutarlo pues así, si cometen un error sabrán con mayor facilidad, que parte del código esta causando problemas.

Segundo paso => Pensando antes de hacer.
Bueno bueno bueno, ya estamos al 10% del camino, ahora queda una parte importante si no quieres ir perdido en tu codigo, pensar como va a estar estructurado. tranquilo no tienes que saber con que codigo o si vas a usar if o switch, solo te interesa saber mas o menos que logica seguiria. Vamos que con palabras cualquiera puede.

En este caso yo ya te adelante el trabajo (Pero yo no voy a estar todo el tiempo asi que piensalo tu tambien) y quedo algo asi:



Si, no soy un experto en diagramas pero creo que es entendible.
Muy bien, una explicacion sencilla, un par de textos hablando del programa, genera un numero, luego pregunta cual crees que sera, lo evalua y si es el mismo te suma puntos y pregunta si desea repetir, de lo contrario, resta un intento hasta que te quedes sin intentos, cuando eso pase, resta puntos y pregunta si quieres repetir, muy sencillo no?

Tercer paso => traductor diagrama - codigo.
No, no vamos a usar un programa para traducir tu diagrama a codigo, usaremos el cerebro esta vez. pero no sera nada dificil, para eso estoy aqui explicando.

¿Donde estabamos?. muy bien el Hello World, esa inutilidad que hacen todos los programas vacios, pero que es ese easter egg del mundo de la programacion, nunca te libraras de el.
Bueno ya que estamos aqui y sabemos que va a llevar, emepzare con unas variavles que van a ir seguro, lo primero es el numero de intentos, el cual establecere en 6, tambien voy a necesitar un numero al azar, y el mensaje en consola.



en este caso puse la variable "intentos" como un integer (int), tambien pudo ser un byte (que ocupa menos memoria) pero este tutorial no se trata de rendimiento. el que si es interesante es el metodo Random, Este genera una variable (en este caso la llame numero) que se usara para formar los valores al azar. la ultima parte que hize fue un Console.WriteLine, que muestra texto en pantalla (Notese como use un
dentro del WriteLine, para poder colocar texto en diferentes lines pero escribiendo solo 1 WriteLine.)

Ok ¿Ya casi esta listo?. No, pero almenos iniciamos, hasta ahora lo unico que hicimos fue mostrar un texto guardar una variable, pero aun no usamos nada, asi que vamos a aplicarle algo de velocidad.

Si volvemos al diagrama vemos que debe preguntarle al jugador si quiere iniciar o no... ¿Que no lo dice?, Bueno, a quien le importa, igual le preguntaremos, los botones de start no estan de adorno, todo cumple una funcion importante.
En este caso, de las muchas formas que se pueden hacer "funciones" yo usare los metodos goto, porque bueno, es mi juego y yo lo hago como yo quiera (ADVERTENCIA: el uso exagerado de los goto puede generar desprecio de otros desarrolladores hacia ti, asi que usalo con cuidado)

En este caso, vamos a hacer algo, el menu vamos a definirlo con numero, algo facil de entender y de programar, y como vamos a trabajar con numero la variable que se manejar, sera otro integer (a no ser que las opciones sean 1, 1.1, 2.11).
entonces, donde definimos el int intentos, podemos definir tambien "int decidir;" no hace falta aplicarle un valor pues eso lo sabremos luego. ok ahora si vams con el codigo seria, luego de WriteLine anterior, donde nos habiamos quedado, vamos a escribir un "goto decide;", y eso vamos a complementarlo escribiendo un "decide:" y dentro de eso escribiremos el codigo del menu, tranquilo que no sera muy largo. es simplemente un if que verifique si la opcion es 1, o si la opcion es 2 (Por ahora solo queremos saber si empieza Si o no), y le daremos a decidir el valor de lo que pongamos. C# tiene varios metodos para eso, en este caso vamos a combinar pues nos interesa un Console.ReadLine(); pero si lo ponemos solo asi nos dara un error.

¿Porque?, sencillo, quieres tratar a un numero como si fuera un texto, y eso no se puede asi que lo pondremos dentro de un Convert.Toint32();, de esta forma lo que se mande como string el lo convertira a un valor numerico (con ciertas limitaciones). Deberia de quedarte algo asi



Oye pero no dijiste que hicieramos un goto juego, ni el goto exit.
No lo dije, y no es obligatorio pero lo prefiero asi, la ventaja de usar este tipo de metodos es mantener cosas organizadas, algo que no se ve bien es que escribas el mismo comando varias veces, y una forma de evitar eso es crear modulos, o funciones, que puedas llamar en cualquier momento, ya cuando avancemos mas veras la importancia.

Cuarto paso => logica de juego.
Tal vez no estemos haciendo un The elder Scrolls, pero toda logica tiene su truco, en este caso algo sencillo como adivinar un numero puede volverse complicado si no sabes lo que haces. Empezemos definiendo la seccion Juego:, aqui lo primero que yo haria es ponerlo todo dentro de un while, y el motivo es simple, si quieres tener el control mediante los intentos, entonces quieres que Mientras los intentos sean diferentes de 0, puedas seguir jugando, asi que haremos un while (intentos != 0) {} y dentro de esas llaves pondremos todo lo que nos interesa ejecutar mientras se este jugando. una de las cosas que podemos hacer es poner en un Write el texto que pregunte por tu numero y un int que manejara el ReadLine (la forma de escribirlo seria igual que el decidir, en este caso yo lo llame opcion). Ok, ahora si lo tratas de ejecutar vera un error muy simple.



que lo unico que pide es que pienses antes de escribir, oye yo no puedo hacerlo todo por ti, si le dices goto exit, pero exit no existe pues evidentemente tienes un problema, aqui la solucion es simple, fuera de juego: crea un exit: con lo que quieras en este caso yo le pondre un Console.WriteLine("Adios") y ahora si todo funcionara como debe



Bueno ya tenemos el menú listo, si pulsamos "2" saldremos, y si pulsamos "1" bueno, aun no jugaríamos pues el juego no hace nada, pero eso vamos a arreglarlo ya. lo primero si vamos al diagrama, es ver que pide que generemos un numero al azar, lo hicimos?, Aun no, creamos un generador de generadores (Si algo extraño) la variable numero genera numeros al azar, pero debes llamarla primero, asi que haremos otro int que maneje esa llamada, en este caso puede ser algo como int rnd = numero.Next(1, 100), si numero.Next es la parte que genera un numero, numero que estara en el dominio (1, 100), no hay nada mas que sea de interes aqui asi que que haremos ahora, bueno el diagramo lo dice todo (para algo lo hicimos) debe comprobar si opcion es igual a rnd, si es asi ganamos y si no que repita, ese codigo seria algo como esto.



Muy bien, si eres un observador destacado, sabras los erroes que te dejaria ese codigo, pero tranquilo que aun no terminamos, una de las cosas que haremos ahora sera comentar las lineas de Random numero = new Random y int rnd = numero.Next(1, 100)(los ocmentarios se pueden hacer con un "//" al inicio de la linea), esto es porque, vamos a probar nuevas cosas y es mejor saber de antemano que numero es el correcto, asi saldremos con mas rapides, en mi caso decidi ponerle un valor de 50, haciendo un int rnd = 50;.

en el diagrama tambien indicamos que llevariamos un puntaje, asi que haremos una int puntos = 0; donde declaramos los intentos, de esa forma llevaremos el puntaje si ganamos o perdemos, con esto, cambiaremos el WriteLine, del exit: para mostrar el puntaje, esto lo haces indicando dentro de las comillas un {x} y fuera de ellas la variable que quieres poner (el x seria la posicion de la variable 0, 1, 2 pero ya lo veras en la foto), ya con los puntos podemos poner puntos += 10 (para sumarle 10 puntos) en la comparacion del if y si gano, porque no decirle nuevamente que vaya da decide: asi no tenemos que escribir un menu otra vez.

Igual que pasa si los intentos son 0?, bueno vamos a solucionarlo, hagamos un if que verifique si intentos == 0, y si es asi que reste 5 puntos (puntos -= 5) y que vaya a decide (una vez mas reciclamos el metodo, por eso es bueno pensar antes de hacer). Al final seria algo como esto.



Si, cuando lo pruebas veras que los intentos no se reinician, esto es porque restamos los valores en juego pero le definimos su valor antes de decide, asi que eliminaremos la asignacion (pasando de ser int intentos = 6; a ser int intentos;) y ahora en decide pondremos intentos = 6;, asi cuando pasemos por decide, se reiniciaran los intentos y no tendremos que hacer vueltas inecesarias.

Quinto paso paso => Mejoras reales.
El juego? si ya esta listo, si te gustan las cosas simples puedes abandonar la (algo larga) lectura que llevamos hasta ahora, pero si crees que puedes adivinar un numero asi, solo conociendo si es o no, pues buena suerte, porque es una tarea casi imposible. asi que vamos a darle una ayuda a los jugadores, haremos otra variable (¡Otra mas!) un int que llamare diff, y diff lo definire dentro de juego como opcion - rnd (asegurate de poner esto luego de el ReadLine de opcion, de lo contrario tendras errores de lo lindo).

Que significa?, sencillo, queremos saber si el jugador se paso en numeros, o si se quedo corto, y ya que estamos haciendo variables, hagamos una int que se llame lose (para saber cuantas perdimos), y otra win (cuantas ganamos) y a ambar dales un valor inicial de 0, eso ayudara a tener un control mejor (podrias definir aumentos de dificultad basado en eso, pero eso no lo veremos aqui)., siguiendo con el diff, si ya tenemos un if que verifica si son iguales, extendamoslo, eliminamos el ultimo else, para cambiarlo por un else if (), y ahi veremos
1 - Si el valor es mayor que 0, significa que la opcion es mayor que el numero rnd, asi que se paso.
2 - Si el numero resulto menor a 0, indicaria que rnd es mayor a la opcion, le falto.

con la logica de todo eso te quedara algo como esto.



Sexto paso => Refinando detalles.

Ya debes estar cansado no?, pues yo estoy cansado de escribir asi que te quedas, ademas ya estamos en la recta final, ya sabemos si falto si sobro, cuantas ganamos (y abras agregado lose++ en intentos == 0 si eres activo en esto), ya con esto pasamos y reforzamos lo basico. Pero ahora haremos la ultima ayuda.

Si ya sabemos si falto o sobro, y claro eso se agradece, pero que tanto falto, o por que tanto nos pasamos, y aqui haremos una aproximacion sencilla, pensemos en lo siguiente:

diff = opcion - numero; Esto dice que restara numero a opcion
else if (diff < 0). pregunta si diff es menor a cero (indicando que numero era mayor a opcion).
else if (diff > 0). pregunta si diff es mayor a cero (insinuando que opcion es mayor a numero).

que pasaria si hicieramos algunos calculos, si nuestro numero es 50 y opcion es 42 diff sera menor a 0 no?, claro que si aqui todos pasamos la primaria. pero si yo le sumara 10 a diff, ¿seguiria siendo menor?. y la respuesta es no, cambiaria su signo, y eso sera la diferencia entre, te falto mucho, a te falto poco. entonces haremos ese acercamiento, si diff < 0 entonces que haga otra comparacion. if ((diff + 10) < 0) {} else if ((diff + 10) >= 0) {}

Esa pieza de codigo sencilla no dira si al sumarle 10 a diff cambia su signo o no, y establecera como cambia el mensaje en funcion de eso. Y si el numero era mayor que 0?, pues es la misma logica, solo que en lugar de sumarle 10 le restas 10, de esta forma si al restarle sigue positivo, bueno te pasaste por mucho, pero si al restarle 10 ya no es positivo si no negativo, entonces estabas cerca de forma que el codigo quedara mas o menos asi.



tambien el numero al sumarle o restarle 10 podria ser igual a 0, por eso en los casos donde esta "cerca" se pondria <= y >= que significan menor o igual y mayor o igual.

¿Queda algo por hacer?
Todo lo que quieras, podrias hacer una lista indicando cuantas gano y cuantas perdio, al finalizar la partida, podrias evitar que el puntaje sea menor a 0, podrias aumentar la dificultad (el dominio en el que se establece el numero al azar), o incluso eliminar en funcion de eso mismo las ayudas de cerca o lejos. muchas cosas, pero eso queda a tu disposicion, quien no practica, no aprende.

Espero verlos en próximos tutoriales, si quieren alguno especifico (Manejo HTML, C#, Ruby, JS, Postgres, Git, y ahi voy con phyton y lua), escribanme un mensaje privado, una sugerencia o duda por este mismo post

Opciones
Estadísticas
Creado 21.04.2015 a las 17:46 hs
Categoría C#

  • Medallas
  • 0
    Favoritos
  • 9824
    Visitas
  • 20
    Puntos
  • 0
    Seguidores
Comentarios
0
Cargando comentarios espera un momento...
No tienes permisos para comentar.

Para poder comentar necesitas estar Registrado. O.. ya tienes usuario? Logueate!
Autor del post
Ver perfil de Martinor1 Martinor1
Hombre Novato  Mensaje
20 1 0
Medallas
No tiene medallas
Tags
Posts relacionados