Juego en python: adivina numero aleatorio (Parte 1)
Hoy vamos a crear un juego en Python de adivinar un numero aleatorio.
En este juego, el participante va pensar un numero aleatorio entre el 1 y el 20 y el programa le pedirá que adivine el numero. Solo hay 6 intentos, pero con la ayuda del programa que nos dirá si el numero que ingresamos es mas chico o mas alto. Si el usuario adivina el numero antes de los 6 intentos, gana.
Este juego nos sirve para aprender a trabajar los numeros aleatorios, los bucles y las entradas del usuario. También aprenderemos a convertir los valores en diferentes tipos de datos (y que se necesita para hacer esto).
Debido a que este programa es un juego, vamos a llamar al usuario: "jugador".
Esto es lo que le aparecerá al jugador una vez que ejecute el programa, el texto en azul es lo que ingresa el jugador:
Hola! Cual es tu nombre?
Albert
Hola Albert, Bienvenido a mi primer juego....
Elige un numero del 1 al 20
10
Tu numero es mas alto
Elige un numero del 1 al 20
2
Tu numero es mas bajo
Elige un numero del 1 al 20
4
Buen trabajo Albert, lo has logrado con 3 intentos
Aquí les voy a dejar el código fuente de nuestro juego de adivinar números. Al agregar este código en tu Editor de archivos (IDLE), asegúrate de prestar atención en las sangrías que hay en algunas lineas. Esto es muy importante para que nuestro juego funcione. Después de ingresar el código, guarda el juego como adivina.py y puedes ejecutarlo apretando F5 para probar como funciona y comprobar que no tenga errores. Si aparece algún tipo de error, se paciente y fíjate si todas las líneas coinciden con las del código original. Iré explicando linea a linea como funciona nuestro juego.
Nota: es muy importante que tengas instalado python 2.x en tu ordenador, si tienes la versión 3.x te dará problemas y el programa no va a correr.
Por las dudas dejo la entrada: Como instalar python
#Juego de adivinar numero aleatorio
import random
intentos = 0
print ("JUEGO DE AZAR....")
print ("Cual es tu nombre?...")
nombre = raw_input()
x = random.randint (1, 20)
print ("Hola " + nombre + ", Bienvenido a mi primer juego...." )
while intentos < 6:
intentos = intentos + 1
print ("Elige un numero del 1 al 20")
numero = raw_input()
numero = int (numero)
if numero < x:
print ("Tu numero es mas bajo")
if numero > x:
print ("Tu numero es mas alto")
if numero == x:
break
if numero == x:
print ("Eres un genio....")
print (nombre + " lo lograste con %d intentos" % (intentos))
print ("Nos vemos....")
if numero != x:
print ("Has perdido, sera en otra oportunidad...")
print ("Nos vemos")
A pesar de que estamos trabajando en el IDLE, podemos ir haciendo pruebas en el shell interactivo de python. El shell interactivo es muy practico para ir experimentando con diferentes instrucciones.
Vamos a estudiar el codigo linea a linea:
#Juego de adivinar numero aleatorio
Esta linea es un comentario. Como ya comente en la entrada anterior, todo lo que se escriba después del signo # no es interpretado como cogido por el ordenador. Esto solo nos recuerda que hace el programa, como funciona o lo que nosotros quisiéramos recordar del código.
import random
Esto es una declaración de importación. Las declaraciones no son funciones. Recordemos que las declaraciones son instrucciones que realizan algo, pero no se evalúan como un valor.
Aunque python incluye muchas funciones integradas, existen algunas funciones por fuera llamadas módulos. Los módulos son programas en python que contienen funciones adicionales. Utilizamos las funciones de estos módulos poniéndolos en nuestros programas con la declaración de importación. En este caso, estamos importando el modulo random.
La declaración de importación se compone de la palabra clave de importación: import, seguido del nombre del modulo.
Lo que hacemos en esta linea entonces, es importar el modulo random, que contiene varias funciones relacionadas con los números aleatorios.
intentos = 0
Esta linea crea una variable llamada intentos. Vamos a guardar el numero de intentos que el jugador hace en esta variable. Dado que el jugador todavía no ha hecho ningún intento, la inicializamos en 0.
print ("JUEGO DE AZAR....")
print ("Cual es tu nombre?...")
nombre = raw_input()
Las primeras dos líneas llaman a la función print(). Recuerda que una función es como un mini-programa el programa general ejecuta y cuando el programa general llama a la función esta se ejecuta. Lo que se ejecuta es lo que esta dentro de los paréntesis. La primera linea presenta nuestro juego y la segunda le pregunta el nombre al jugador.
Cuando estas dos líneas se terminan de ejecutar y el jugador escribe su nombre, el nombre se guardara en la variable nombre. Tenemos que recordar que el jugador no solo puede poner el nombre, pude escribir lo que se le ocurra.
x = random.randint (1, 20)
En la siguiente linea, otra ves llamamos a una función, esta ves es el turno de randint(), y a continuación, guarda el valor de retorno en la variable x. A esto lo llamamos valor de retorno de la función.
La función randint() devuelve un entero aleatorio entre los dos enteros que colocamos entre paréntesis, en este caso, un entero en el 1 y el 20. El numero aleatorio que devuelve la función randint() es guardado en la variable, y es el numero que el jugador va a tener que adivinar.
Si quieres, puedes practicar en el shell interactivo de python:
>>>import random
>>>x = random.randint (1, 20)
>>>x
12
>>>x
5
>>>x
9
Cada vez que queramos añadir aleatoriedad a nuestros juegos o programas podemos usar la función randint(). Recuerda cuantos juegos de mesas utilizan dados, un montón verdad?
También puedes probar diferentes rangos de números para familiarizarte con la función.
Recuerda que el programa necesita que importes random para que randint() funcione. Esta es la razón por las que los módulos de importación van al principio del programa.
Los valores escritos entre paréntesis en la función randint son llamados argumentos. Los argumentos son valores que se pasan a una función cuando se llama a la función. Los argumentos le indican a la función como comportarse.
Algunas funciones requieren que se pase valor cuando son llamadas. Miremos estas llamadas de funciones:
input()
print ("Hola")
random.randint (1, 20)
La función input no necesariamente usa argumentos, pero la función print() tiene un argumento y la función randint tiene dos. Cuando tenemos mas de un argumento los escribimos separados con comas, como en el ejemplo.
print ("Hola " + nombre + ", Bienvenido a mi primer juego...." )
En esta linea le damos la bienvenida al jugador, utilizamos también el signo de concatenación + para sumarle a "Hola" el contenido de la variable nombre + ", Bienvenido a mi primer juego....".
while intentos < 6:
intentos = intentos + 1
print ("Elige un numero del 1 al 20")
numero = raw_input()
numero = int (numero)
if numero < x:
print ("Tu numero es mas bajo")
if numero > x:
print ("Tu numero es mas alto")
if numero == x:
break
En esta linea indicamos el comienzo de un bucle while. Los bucles son parte de código que se repiten una y otra vez. Pero antes de aprender los bucles while, tendremos que aprender otros conceptos. Esos conceptos son los bloques, booleanos, operadores de comparación, condicionales y por ultimo la sentencia while.
Bloques:
Un bloque es una o mas líneas de código agrupados juntos con la misma cantidad mínima de identacion. Se puede decir que un bloque empieza y termina mirando la sangría de la linea.
Un bloque comienza cuando tiene sangría de 4 espacios o 1 tabulación. Cualquier linea de código siguiente que tenga la misma sangría es parte del mismo bloque.
A continuación se muestra un diagrama del código con los bloques señalados y numerados:
Bloques y sus sangrías. Los puntos negros representan espacios. |
Bueno hasta aquí dejo la primera parte, espero les sirva de aprendizaje tanto como a mi. Saludos
Segunda parte del juego: Juego en Python: adivina numero aleatorio (Parte 2)
Cualquier duda o sugerencia puedes dejar tu comentario.
-
Hola Diego. Empiezo hoy a estudiar este otro codigo de este segundo juego y me asalta una pequeña duda: ¿porque añades ahora a la funcion print unos parentesis ademas de las comillas delimitadoras?. ¿que diferencia hay entre ponerlos o no?
-
En realidad este juego es una traducción que hice de la versión de python 3.x. En python 3.x se necesitan paréntesis para usar print, en python 2.x no necesita paréntesis, pero tampoco nos da error. Me olvide de quitarlos.
Saludos
-
-
Muchas gracias por tu atencion. Servira para despejar dudas a los que empiezan como yo. Un abrazo
-
Hola Diego, queria hacerte solo un apunte. Como dijiste al principio de este tuto, todos proyectos que estamos trabajando los hariamos con Geany.
Al decir en este ejemplo de juego que lo escribes en IDLE, ¿es posible que Geany me de algun error o diferencia que si lo hago por IDLE o el shell interactivo? -
Escribiendo el codigo en Geany, me da error en la fila break como si estuviera mal escrita, he mirado que estuviera bien situado en los espacios y me sigue dando error de sintaxy, ¿a que puede ser debido Diego?
-
Hola Diego, sigo repasando el codigo de este primer juego de numero aleatorio y no encuentro el fallo. Cuando tu puedas hechale un vistazo haber que te parece. Te lo doy tal cual lo tengo escrito en Geany:
1 #!/usr/bin/env python
2 #-*-coding: utf-8-*-
3 #Juego de adivinar numero aleatorio
4
5 import random
6 intentos = 0
7
8 print "JUEGO DE AZAR..."
9 print "Cual es tu nombre?"
10
11 raw_input()
12 x = random.randint(1,20)
13
14 print "Hola " + nombre + ", Bienvenido a mi primer juego..."
15
16 while intentos <6:
17 intentos = intentos + 1
18 print "elige un numero del 1 al 20"
19 raw input()
20 numero = int
21 if numero x:
24 print "tu numero es mas alto"
25 if numero ==x:
26 break
27 if numero ==x:
28 print "eres un genio..."
29 print nombre + "lo lograste con %d intentos" % (intentos)
30 print "nos vemos..."
31 if numero !=x:
32 print "Has perdido, sera en otra oportunidad"
33 print "nos vemos"
ARCHIVO GUARDADO COMO: BIENVENIDO A MI PRIMER JUEGO.py
ERROR QUE ME ARROJA GEANY:SyntaxError: 'break' outside loop.
Esto es traducido que la sentencia 'break' esta fuera de rango...
Cuando puedas hechale un vistazo porque yo no encuentro el fallo -
Hola Diego, sigo repasando este codigo pero me he quedao bloqueao. Haber si tu o alguien me podeis hechar una mano a encontrar el fallo que Geany me arroja cuando introduzco este codigo anterior. ¿es correcto poner este comentario aqui o debo ponerlo en otro lugar?
-
Hola SITO, yo te diría que copies bien el código. Primero copie el tuyo y me dieron varios errores, le faltaban algunas cosas. Después copie el mio y esta funcionando bien. Saludos
-
-
Hola Diego, lo he repasado muchas veces, mas de 15, y no encuentro el fallo. Soy muy tenaz y repaso las cosas muchas veces antes de pedir ayuda. Despues de repasarlo varias veces no se si el fallo esta en los espacios o en otra parte del codigo pero el error que me marcaba Geany era en la sentencia 'break'. Pero si me dices que hay error en la copia del codigo, lo volvere a intentar de nuevo haber si encuentro el error. Ya te dire. Gracias por contestarme
-
Hola de nuevo Diego, repasando de nuevo el codigo linea a linea, he observado que habian varios fallos. El 1º y mas escandalso es que no habia puesto "(numero)" en la linea de "numero=int(numero).
El otro error estaba en las sangrias que siendo cierto que las alinie diferente a como estaba en tu codigo, ME SIGUE DANDO ERROR DE SANGRIA. Y no entiendo ahora el error de sangria cuando lo he alineado exactamente como tu.
¿es posible que el error sea en los espacios de "if numero < x:?" van separados o deben ir juntos <x?? AYUDAME POR FAVOR Diego. -
Esta parte tendria que haberte quedado asi:
while intentos < 6:
----intentos = intentos + 1
----print ("Elige un numero del 1 al 20")
----numero = raw_input()
----numero = int (numero)
----if numero < x:
--------print ("Tu numero es mas bajo")
----if numero > x:
--------print ("Tu numero es mas alto")
----if numero == x:
--------breakPara que te quede claro, las rallas son la sangria que tenes que dejar. 4 rallas es un tabulador
Espero puedas resolverlo. Saludos
-
Hola Diego, me quedo bien claro en esta leccion que un tabulador se compone de cuatro espacios y que es el minimo para cada bloque. Deseando estoy ya salir del trabajo para llegar a casa y volver a introducir en Geany el codigo cuidadosamente de nuevo haber si deja de darme errores. Te digo algo. Muchas gracias. Abrazo
-
-
Hola Dego, he estado algo liado buscando los errores de mi codigo del programa "Adivinar numero aleatorio" y desconecte unos dias por un poco de frustracion.
Ya encontrado los fallos, el programa se ejecuta bien EXCEPTO en un apartado que no me convence(supongo relacionado al codigo pero no se que es).
Geany me arroja esto:
JUEGO DE AZAR...
¿cual es tu nombre?
Hola Luis, Bienvenido a mi primer juego...
Elige un numero del 1 al 20
Tu numero es mas bajo
Has perdido, sera en otra oportunidad
Nos vemos
Elige un numero del 1 al 20Diego, es como si al primer numero que el jugador pone y no acierta, no le diera mas oportunidades(las 6 que el juego debe dar) y empezara de nuevo el juego. ¿donde puede estar ahora el error?
-
o es que el juego debe desarrollarse de esta manera...
-
Diego, en mi parecer, creia que el juego se desarrollaba de manera que, cuando el jugador elegia un numero y fallaba, el programa te responderia: "tu numero es mas alto(por ejem)" y acto seguido te volvia a responder "elige otro numero", asi hasta 6 veces y entonces si no acertabas, finalizaba el bucle despidiendose con "Has perdido, sera en otra oportunidad" y luego "nos vemos". Asi lo creo yo mas logico que se desarrollara el juego.
-
Diego, la verdad es que gracias a ti y a tu blog estoy parendiendo a buen ritmo(por el poco tiempo que tengo) aunque a veces me quede bloqueado dias y dias. Me gusta estar seguro antes de dar el siguiente paso. Cuando puedas contestame a la duda que te mencione anteriormente sobre si es correcto la respuesta de este juego. Gracias
-
Hola de nuevo Diego, otra de los problemas que tengo con el programa de "juego de numero aleatorio1" es que cuando el posible jugador acierta el numero aleatorio, no le felicita y le dice que ha ganado con %de jugadas, sino que el programa finaliza sin mas. Por favor en cuanto puedas hechame una mano para perfilar bien esta cuestion, gracias.
-
Hola SITO, me gustaría que me copies textual el código que tienes en Geany (incluso estaría bueno que me pongas las sangrías con ----, así puedo darme cuenta de tu error).
Saludos
-
-
Hola Diego, gracias ante todo por tu atencion. Te dejo el codigo copiado textualmente que escribi en Geany con sangrias incluidas:
#Juego de adivinar numero aleatorio
import random
intentos = 0print "JUEGO DE AZAR..."
print "Cual es tu nombre?..."nombre=raw_input()
x = random.randint(1,20)print "Hola " + nombre + ", Bienvenido a mi primer juego..."
while intentos < 6:
----intentos = intentos + 1
----print "Elige un numero del 1 al 20"
----numero = raw_input()
----numero int(numero)
----if numero < x:
--------print "Tu numero es mas bajo"
----if numero > x:
--------print "Tu numero es mas alto"
----if numero == x:
--------break----if numero == x:
--------print "Eres un genio"
--------print nombre + "lo lograste con %d intentos" %(intentos)
--------print "Nos vemos..."----if numero != x:
--------print "Has perdido, sera en otra oportunidad..."
--------print "Nos vemos"
raw_input()Aqui lo tienes Diego, haber si tu le encuentras el porque del que el programa se salte segun que saludos o acabe sin mas y las cuestiones que te he marque con anterioridad.
ESTA TOTALMENTE COPIADO TEXTUALMENTE. Espero tu respuesta, gracias por tu ayuda.
Abrazo-
Hola SITO, encontré tus errores:
1 - Quizá lo copiaste mal ahora, pero te comento:
----numero = raw_input()
----numero = int(numero) !!!Aca te falto el signo =2 - Los ultimos dos bloques de codigo:
----if numero == x:
------- .............
------- .............----if numero != x:
--------- ...........
--------- ...........Esos dos bloques van fuera del ciclo While, osea los if no llevan sangría si no siempre te va a dar una oportunidad sola (no se si me entendes).
el final del while es:
----if numero == x:
--------breakLo que hace esto es preguntarse si el numero que vos elegiste es igual al numero al azar, si no es igual vuelve a la parte de arriba del while y comienza de nuevo, pero si es igual se termina el ciclo (break) y pasa al siguiente codigo. El siguiente codigo que es: if numero == x: (que en este caso se cumple) te dice que has ganado. Luego pasa al otro bloque que dice: if numero != x: (que en este caso no se cumple) y por lo tanto termina en un raw_input() esperando que presiones una tecla para continuar.
Mientras tu numero no sea igual al aleatorio el ciclo while se sigue repitiendo hasta que intentos sea igual a 6. Cuando esto pase, el ciclo se termina y como dije antes, pasa a los ultimos dos bloques (los if). Como en este caso al final numero es distinto del aleatorio el bloque que se cumple es: if numero != x: y por lo tanto Perdiste!!!!
Espero te quede mas claro
Saludos
-
Muchas gracias ante todo por tu rapida contestacion y en cuanto pueda, comprobare tus correcciones y te dare los resultados. Eres todo un profesional, se nota que eres un buen sti. Es complicado empezar de cero en esto por mucho que me guste. Poco a poco
-
Hola Diego, buenos dias. Gracias por tu ayuda, he comprobado el codigo y ahora lo entiendo. El signo = lo puse bien pero me lo salte al copiartelo. El fallo estaba en las sangrias de los dos ultimos bloques finales como bien me dijiste.
Ahora funciona con la logica que por mi error carecia. Ahora puedo continuar aprendiendo en esta blog/ tutorial tan bueno que has creado.
Un abrazo
-
-
Hola! Una pregunta, si quisiera repetir el funcionamiento 3 veces, como debería dar la orden? Es decir, me gustaria que, en caso que acertara el numero, me dijera "te quedan 2 numeros por adivinar" o algo por el estilo. Gracias de antemano!
-
tengo la misma duda! si alguien pueden responder seria de gran ayuda!!
-
Hola, no lo he probado pero calculo que con un while mas se solucionaría el problema. En el correr de la semana lo hago para ver bien como quedaría. Saludos
-
Bueno sr. anonimo, frente a la pregunta que planteas en esta seccion de este blog, de si quisieras repetir el funcionamiento tres veces sobre el bucle para que te responda "te quedan tres numeros por adivinar", yo este finde tambien intentare dar con la respuesta y poder ayudarte. Mientras espero la ayuda de Diego en mi ultimo asunto. Y de paso, practicar en lo aprendido.
-
-
Hola Diego, despues de un tiempo sin internet y de vacaciones vuelvo de nuevo a repasar con Python. Pero antes de aventurarme a trabajar con los codigos de los posteriores juegos una pregunta. Si quisiera enviar, por ejemplo, este juego del numero aleatorio u otro similar a un amigo, para estar mejor presentado, complementandolo con algun grafico dentro del codigo, y ponerle una "tapa" o "caratula" de presentacion, como por ejemplo la magen que tu tienes del juego del dragon o similar. Que herramientas suele utilizar un programador para esto, sobre todo tu, que eres en todo esto despues de visitar diversas webs, mi referente. Te agradeceria me indicaras algun camino, gracias.
-
Perdon Diego, mi sistema operativo es Ubuntu 12.10 por si te sirve de ayuda
-
Como a veces las preguntas no las hago correctamente, te lo pregunto de otra manera: Una vez construido un programa y descargandolo en, por ejemplo, la carpeta de "documentos", ¿que pasos debo seguir para que...? 1º. la persona que lo reciba, solo reciba el ejecutable para probarlo(al no ser que el con el boton dcho quiera saber el codigo, cosa que no suele interesar), 2º. Tenga una "caratula", "tapa" o "empaquetado de presentacion"(como todos los juegos tienen). Gracias
-
Hola, no sabría evacuar bien tu duda. Se que para trabajar con gráficos en los juegos hechos en python se necesita el modulo pygame que voy a empezar a ver más adelante y explicaré en el blog. Saludos
-
-
La duda de como poder incluir graficos dentro de los juegos esta despejada, gracias. La otra que me queda es la siguiente: Mando uno de los juegos cuyo codigo final es correcto a otra persona por email con el fin de que lo habra y simplemente, lo utilice, lo ejecute y juegue. Pero la persona que lo recibe, al abrirlo, me dice que solo recibe el codigo escrito en python. Es decir, no lo recibe como un juego sin mas con una primera cara de presentacion y le da a ejecutar y juega sin mas, sino que lo recibe como un codigo escrito sin entender nada. ¿me comprendes ahora?. Lo envie para experimentar como recibia un juego enviado por mi una persona
-
Ya se que es dificil guiar a una persona como yo que empieza en esto completamente desde cero, por eso, admiro de antemano la paciencia y el don de enseñar y guiar a las personas como yo, ademas de tu gran dedicacion. Como guia y profesor, te admiro. Digiere bien la pregunta(jejeje) y sin prisas, me contestas. Gracias y ten paciencia conmigo, por favor
-
Hola Diego. La solucion a la pregunta que te hacia ya la tengo: yo necesito un ejecutable portable ya que python no lo tiene por defecto y si quiero ver como corre cualquiera de estos juegos u otros programas lo necesito. Hay un software que se llama cxfreeze que me congela un ejecutable pero tengo problemas para ejecutarlo en Ubuntu: me da error de que debo especificar el script o una lista de modulos. Estoy en ello. Como no, si tu sabes sobre este apartado comentamelo, gracias
-
Hola SITO, no sabría darte una respuesta. Investigue un poco y vi que está ese software que tu dices (cx_freeze) y también existe py2exe para utilizar con python 2.7. Pero como nunca he tenido que hacer un ejecutable no me he metido mucho en el tema. Espero puedas resolverlo y te invito a que nos cuentes como te fue. Saludos
-
Gracias por tu respuesta. Supuse q por tus conocimientos en informatica habrias pasado por ese tramo de los juegos, en el cual experimentas como un juego pasa de un pc a otro. Comosi tu quisieras enviarle un juego a un amigo tuyo, y como solucionar las incompatibilidades y conflictos entre sftware y sistemas ooerativos. SE QUE NO ES EL TEMA PRINCIPAL, PERO SI INTERESANTE CORRER UN JUEGO DE PYTHON EN WINDOWS. Os mantendre informados si es que el tema suscita interes. Abrazo
-
-
buenos días soy algo nuevo y tengo una inquietud por que cuando ejecuto un ejercicio en sublime text y uso la función input me genera error pruebo el mismo ejercicio en aptana o eclipse y no genera error
-
Hola, gracias por pasarte por el blog. Si puedes pasame el código de lo que estas probando en sublime así lo pruebo y te comento. Saludos
-
-
HOLAA DIEGO , enq casos se utiliza el break ????? tengo esa duda.. xfabor responde saludoss!
-
Hola Danitza, fijate en la segunda parte: https://www.pythondiario.com/2013/06/juego-en-python-adivina-numero.html
Saludos
-
-
import random
################################
##########FUNCION PRINCIPAL#########
################################
def main():
password = random.randint(1,20)
count = 0
print "NUESTRA PASSWORD ES: " , password
for i in range(6):
solucion = input("Introduce una posible solucion: " )
count += 1
if solucion < password:
print "El numero es mas bajo. "
if solucion > password:
print "El numero es mas alto. "
if solucion == password:
print "Enhorabuena"
print "INTENTOS: ", count
return
if count == 6:
print "GAME OVER"
print "Has agotado los 6 intentos"
return
print main()
Deja una respuesta
Muy interesante. Entonces, segun el ejemplo de juego de azar que has expuesto, ¿puede entenderse que los juegos de ruleta online, asi como otros muchos juegos online estan escritos en python?