IriaSantos-web

Actividad voluntaria (actividad dirigida 3)

Esta actividad, al igual que la actividad obligatoria previa, consiste en realizar la programación literaria de un nuevo código, que se había había llevado a cabo en la materia de Programación, aplicaciones, herramientas y soportes por algún grupo de nuestros compañeros.

A continuación se muestra el código y se explica con programación literaria, como indica la actividad:

Código fuente

import random
intentosRealizados = 0
numero = random.randint(1, 100)
print("Juego del Calamar. Adivina el número secreto o morirás.")
print("Quiero saber quién eres. Escribe tu nombre.")
nombre = input()
print("Jugador", nombre, "," " tienes diez intentos para salvar tu vida. ¿Quieres continuar? Responde si o no.")
resp = input ()
while (resp == "si","no"):
  if (resp == "si"):
   print("Muy bien. Eres valiente. Escribe tu primer intento")
  if (resp == "no"):
    print("Te jodiste. Igual debes continuar o morirás. Escribe tu primer intento.")
  break
while intentosRealizados < 10:
 estimacion = input()
 estimacion = int(estimacion) 
 intentosRealizados = intentosRealizados + 1
 if estimacion < numero:
  print("Tu estimación es muy baja. Te quedan", 10-intentosRealizados, "intentos")
 if estimacion > numero:
  print('Tu estimación es muy alta. Te quedan', 10-intentosRealizados,"intentos")
 if estimacion == numero:
  break;
if estimacion == numero:
 print('¡Has adivinado el número secreto en ' , intentosRealizados , 'intentos! Te salvaste')
if estimacion != numero:
 print('El número era', numero,"; Vas a morir.")

Este código, denominado Juego del Calamar, es un código básico empleado en muchas ocasiones para el aprendizaje de programación. Se trata de un juego en el que el usuario/jugador debe adivinar en menos de 10 intentos el número aleatorio que ha pensado la máquina para ganar.

¿Cómo se lleva a cabo?

Importamos el módulo

En el caso de esta actividad, tan solo empleamos la librería random, que no es necesario instalar, ya que se trata de un módulo propio de Python, que permite generar números aleatorios.

import random

Objetos/variables

A continuación, vamos a realizar una serie de objetos o variables:

  1. Primero añadiremos una variable con valor numérico de nombre intentosRealizados al que le daremos un valor inicial de 0.
intentosRealizados = 0
  1. Le indicamos a la máquina que queremos crear una nueva variable de nombre numero, que consiste en la selección de un número aleatorio a través de la librería previamente creada. Para ello, se le indica que queremos que el número seleccionado sea un valor entre 0 y 100. El código para ello es numero = random.randint(1, 100).
numero = random.randint(1, 100)
  1. Para continuar se imprimen dos textos: Juego del Calamar. Adivina el número secreto o morirás. y Quiero saber quién eres. Escribe tu nombre.. Estos códigos son impresos gracias a la llamada print.
print("Juego del Calamar. Adivina el número secreto o morirás.")
print("Quiero saber quién eres. Escribe tu nombre.")
Juego del Calamar. Adivina el número secreto o morirás.
Quiero saber quién eres. Escribe tu nombre.
  1. Para que el usuario/jugador pueda escribir su nombre se hace una llamada a la variable nombre = input() con valor de entrada de texto. El usuario/jugador deberá escribir su nombre y pulsar enter para que este se registre y continúe el juego.
nombre = input()
Iria
  1. Se imprimirá el texto Jugador (seguido del nombre)* , tienes diez intentos para salvar tu vida. ¿Quieres continuar? Responde si o no.* También usando la llamada print.
print("Jugador", nombre, "," " tienes diez intentos para salvar tu vida. ¿Quieres continuar? Responde si o no.")
Jugador Iria , tienes diez intentos para salvar tu vida. ¿Quieres continuar? Responde si o no.
  1. Se volverá a añadir una variable de entrada de texto, en este caso de nombre resp. El usuario/jugador deberá responder si o no. Se añade posteriormente un bucle while cuyas respuestas posibles son si y no. Mientras el resultado sea igual a si se imprimirá el texto Muy bien. Eres valiente. Escribe tu primer intento. Si la respuesta es no se imprimirá el texto Te jodiste. Igual debes continuar o morirás. Escribe tu primer intento. Esto obligará al jugador a continuar con el juego. Al no existir otras opciones, si la respuesta es otra no habrá ninguna impresión.
resp = input ()
while (resp == "si","no"):
  if (resp == "si"):
   print("Muy bien. Eres valiente. Escribe tu primer intento")
  if (resp == "no"):
    print("Te jodiste. Igual debes continuar o morirás. Escribe tu primer intento.")
  break
si
Muy bien. Eres valiente. Escribe tu primer intento
  1. De nuevo se añadirá un bucle while, pero en este caso el condicional es el número de intentos, que mientras es inferior a 10 estará en funcionamiento.
while intentosRealizados < 10:
 estimacion = input()
 estimacion = int(estimacion) 
 intentosRealizados = intentosRealizados + 1
 if estimacion < numero:
  print("Tu estimación es muy baja. Te quedan", 10-intentosRealizados, "intentos")
 if estimacion > numero:
  print('Tu estimación es muy alta. Te quedan', 10-intentosRealizados,"intentos")
 if estimacion == numero:
  break;
if estimacion == numero:
 print('¡Has adivinado el número secreto en ' , intentosRealizados , 'intentos! Te salvaste')
if estimacion != numero:
 print('El número era', numero,"; Vas a morir.")
10
Tu estimación es muy baja. Te quedan 9 intentos
90
Tu estimación es muy alta. Te quedan 8 intentos
50
Tu estimación es muy baja. Te quedan 7 intentos
70
Tu estimación es muy baja. Te quedan 6 intentos
80
Tu estimación es muy alta. Te quedan 5 intentos
77
Tu estimación es muy alta. Te quedan 4 intentos
74
Tu estimación es muy baja. Te quedan 3 intentos
76
Tu estimación es muy alta. Te quedan 2 intentos
75
¡Has adivinado el número secreto en  9 intentos! Te salvaste

Código fuente alternativo

Un código fuente alternativo para un juego similar sería el que sigue:

import random
import os

ganadores = []

while True:
    intentosRealizados = 0
    numero = random.randint(1, 100)
    #print(numero) #DEBUG

    print ('Dame tu nombre')
    nombre = input()
    os.system('clear')

    print(nombre + ', adivina el número que estoy pensando entre 1 y 100 en menos de 20 intentos')

    while intentosRealizados < 20:
        print('Intenta adivinar')
        estimacion = input()
        estimacion = int(estimacion)
        intentosRealizados = intentosRealizados+1
        if estimacion < numero:
            print('Tu estimacion es muy baja')
        if estimacion > numero:
            print('Tu estimacion es muy alta')
        if estimacion == numero:
            break

    if estimacion == numero:
        if intentosRealizados < 20:
            ganadores.append([intentosRealizados, nombre])
        intentosRealizados = str(intentosRealizados)
        print('Has adivinado mi numero en ' + intentosRealizados + ' intentos!')

    if estimacion != numero:
        print('Pues no. El número que estaba pensando era el ' + numero)
    
    print('¿Nueva partida? ([Si]/No)')
    seguir = input()
    seguir = seguir.lower()
    os.system('clear')
    if seguir == 'no':
        break

os.system('clear')
print ('Ranking:\n')
ganadores.sort()

for i in range(len(ganadores)):
    pos = str(i + 1)
    print (pos + '. ' + ganadores[i][1] + ', ' + str(ganadores[i][0]) + ' intentos')

Ya que se trata de un código bastante similar, se comentarán las diferencias en el mismo:

Importar módulos

Además del módulo random, también se importa el módulo os, que ya habíamos visto en la Actividad 3 y que se trata de un módulo que permite el uso de código perteneciente al sistema operativo. Al igual que en esa actividad previa, este código sería el empleado para limpiar la pantalla con os.system('clear') y aquí tendría que hacerse con cls() para emplear con Jupyter.

import os

Objetos/variables

Se inicia con una variable de tipo lista vacía, también vista en la Actividad 3, pero en este caso de nombre ganadores.

ganadores = []

A continuación se inicia un bucle de valor booleano con el valor True, ya que en todo caso será cierto para que se inicie el juego. Dentro de este bucle se añadin diferentes objetos o variables:

  1. Después de añadir las variables que ya se vieron en la versión previa de intentosRealizados = 0 y numero = random.randint(1, 100) se añade #print(numero) #DEBUG, que al tener el # estará comentado y no tendrá valor, pero que en caso de quitarle esta almuadilla mostrará el valor de la máquina. Se trata de una trampa, que se comenta a la hora de mostrar el programa al usuario/jugador, pero que al estar destapado ayudará al programador a tener que dar menos vueltas para revisar los errores que pueda haber en el código.
while True:
    intentosRealizados = 0
    numero = random.randint(1, 100)
    #print(numero) #DEBUG

    print ('Dame tu nombre')
    nombre = input()
    os.system('clear')

    print(nombre + ', adivina el número que estoy pensando entre 1 y 100 en menos de 20 intentos')
  1. Se añade otro bucle basado en los intentos realizados, en el cuál el número máximo de intentos serán 20. El resto del código es similar, pero el texto impreso varía de forma leve.
while intentosRealizados < 20:
        print('Intenta adivinar')
        estimacion = input()
        estimacion = int(estimacion)
        intentosRealizados = intentosRealizados+1
        if estimacion < numero:
            print('Tu estimacion es muy baja')
        if estimacion > numero:
            print('Tu estimacion es muy alta')
        if estimacion == numero:
            break
  1. Al acabar la partida, si la estimación es igual al número y el número de intentos es inferior a 20 se añadirá el nombre del usuario/jugador a la lista vacía inicial. También se imprimirá el mensaje de felicitación. En caso contrario, se le dirá cuál es el número. Posteriormente se imprimirá la pregunta de si quiere jugar una partida nueva.
  2. Se crea la variable seguir con un valor de entrada de texto. Al escribir la respuesta se añade a la variable la respuesta.
  3. Posteriormente se limpia la pantalla.
  4. Si el valor se corresponde con no finalizará el juego.
if estimacion == numero:
        if intentosRealizados < 20:
            ganadores.append([intentosRealizados, nombre])
        intentosRealizados = str(intentosRealizados)
        print('Has adivinado mi numero en ' + intentosRealizados + ' intentos!')

    if estimacion != numero:
        print('Pues no. El número que estaba pensando era el ' + numero)
    
    print('¿Nueva partida? ([Si]/No)')
    seguir = input()
    seguir = seguir.lower()
    os.system('clear')
    if seguir == 'no':
        break

6.a. De ser así se limpiará la pantalla y se imprimirá el ranking con el nombre de los jugadores que hayan conseguido adivinar el número en menos de 20 intentos. 6.b. El siguiente bucle for indica que la lista ganadores estará ordenada por la posición de los jugadores en el ranking, dónde a menor número de intentos antes aparecerá en el listado el nombre. Se imprimirá de esta forma la posición, el nombre y el número de intentos realizados.

os.system('clear')
print ('Ranking:\n')
ganadores.sort()

for i in range(len(ganadores)):
    pos = str(i + 1)
    print (pos + '. ' + ganadores[i][1] + ', ' + str(ganadores[i][0]) + ' intentos')