Saltar a contenido

El juego de las adivinanzas

Llegados a este punto, vamos a crear nuestro primer juego.

El programa

El texto del programa es el siguiente:

AdivinarUnNumero.py
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# Adivina un número

from random import randint

jugar = True
while jugar:

    print('Adivina un número entre 1 y 100.')
    print('Introduce 0 para abandonar.')

    numero = randint(1,100)

    while True:
        intento = int(input("\n> "))   # añadir un salto de línea previo

        if intento == 0:
            jugar = False
            break
        if intento == numero:
            print(f"Lo adivinaste. Es {numero}.\n")
            break
        elif intento < numero:
            print("Te quedaste corto")
        else:
            print("Te pasaste")

print("Adios.")

Lo que muestra algo así como:

Adivina un número entre 1 y 100.
Introduce 0 para abandonar.

> 27
Te quedaste corto

> 55
Te pasaste

> 43
Te pasaste

> 42
Lo adivinaste. Es 42.

Adivina un número entre 1 y 100.
Introduce 0 para abandonar.

> 0
Adios.

¿Para que necesitamos la variable jugar? Porque al escribir la sentencia:

break

salimos del bucle interno, pero no del externo. Estaríamos abandonando el juego actual y forzando un nuevo juego. Necesitamos una forma de salir del programa definitivamente.

Control de errores

¿Que sucedería si el usuario introduce algo que no es un número?

Adivina un número entre 1 y 100.
Introduce 0 para abandonar.

> Hola

Traceback (most recent call last):
  File "/usr/lib/python3.13/idlelib/run.py", line 590, in runcode
    exec(code, self.locals)
    ~~~~^^^^^^^^^^^^^^^^^^^
  File "/mnt/compartidas/Pública/python/prueba/prueba.py", line 14, in <module>
    intento = int(input("\n> "))

ValueError: invalid literal for int() with base 10: 'Hola'

La sentencia:

intento = int(input("\n> "))

toma el texto devuelto por la función input() y trata de convertirlo en número entero.

Queremos evitar que se detenga el programa. En lugar de esta sentencia, escribimos:

try:
    intento = int(input("\n> "))
except:
    intento = 0

lo que significa:

intentar ejecutar lo siguiente:
    sentencia1
    sentencia2
    sentencia3
si se produce algún fallo, ejecutar:
    sentencia4
    sentencia5

otras sentencias a ejecutar

Los bloques try se ejecutarán bajo supervisión, y en el caso de que se produzca cualquier fallo, en lugar de detener el programa, gestionaremos el error de forma elegante ejecutando lo que hay en el bloque except.

Como sucede con los bloques condicionales, no olvidar los dos puntos que hay tras las sentencias try y except.

El programa completo:

AdivinarUnNumero.py
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
## Adivina un número

from random import randint

jugar = True
while jugar:

    print('Adivina un número entre 1 y 100.')
    print('Introduce 0 para abandonar.')

    numero = randint(1,100)

    while True:

        try:
            intento = int(input("\n> "))
        except:
            intento = 0

        if intento == 0:
            jugar = False
            break
        if intento == numero:
            print(f"Lo adivinaste. Es {numero}.\n")
            break
        elif intento < numero:
            print("Te quedaste corto")
        else:
            print("Te pasaste")

print("Adios.")