Juego en python: reino del dragon (parte 2)

Juego en python
Reino del dragón

Seguimos con la segunda parte del juego en python: reino del dragón, si no viste la primera parte, aquí el enlace: .
Juego en python: reino del dragon (parte 1).

En la entrada anterior termine de explicar como definir una función (en ese caso, la función CambiarCueva()), que nos iba a retornar la cueva que el jugador eligiese.
La palabra clave return solo aparece cuando estamos definiendo funciones. Recordemos como la función input() nos devuelve el valor que el jugador tecleo, o como la función randint() devuelve un valor entero aleatorio. Nuestra función también va a devolver un valor, en este caso la cueva optada por el jugador.
Esto quiere decir, que si nosotros tenemos una linea de código:
cueva = CambiarCueva(), lo que estamos haciendo es guardar en la variable cueva el retorno de la función CambiarCueva(). En este caso el valor de la variable cueva seria 1 o 2 (es lo que va a retornar la función CambiarCueva()).

De la misma manera que nuestras variables son borradas una ves estamos fuera del programa, las variables creadas en una función también son borradas después que la ejecución sale de la función. No solo eso, si no que cuando la ejecución esta dentro de la función, no podemos cambiar las variables fuera de la función o las variables dentro de otras funciones.  Las únicas variables que se pueden usar dentro de una función son las que creamos dentro de la función (o las variables de parámetros).
Si tenemos una variable que se llama cueva fuera de la función, y una variable cueva dentro de una función, el interprete de python tendrá en cuenta que son dos variables diferentes. Esto quiere decir que podemos cambiar el valor de la variable en una función sin modificar la que esta por fuera.

Variable Global y Variable Local
El ámbito exterior de todas la funciones se llama Global. El alcance de una función se llama ámbito local. Todo el programa solo tiene un ámbito global y cada función tiene su propio ámbito local.
Las variables definidas en un ámbito global (dentro del programa, pero fuera de las funciones), pueden ser leídas fuera y dentro de las funciones, pero solo pueden ser modificadas fuera de las funciones. Las variables definidas dentro de las funciones solo se pueden leer y modificar dentro de dicha función.


Definiendo cheqcueva(CambiarCueva)


def cheqcueva(CambiarCueva):
    print ("Te acercas a la Cueva...")
    time.sleep(2)
    print ("Esta oscuro y tenebroso...")
    time.sleep(2)
    print ("Un gran dragon salta delante tuyo, abre su boca y...")
    print ("")
    time.sleep(2)

    FriendlyCueva = random.randint (1, 2)
   
    if CambiarCueva == str(FriendlyCueva):
        print ("Te entrega el tesoro...")
    else:
        print ("El dragon te come de un bocado....")

Ahora definimos la función cheqcueva(). Notar que ponemos CambiarCueva dentro de los paréntesis. Los nombres de las variables que están dentro de los paréntesis son llamadas parámetros. 
Los parámetros son los valores de entrada que recibe una función. Si la función no tiene nada entre los paréntesis es porque no necesita ningún dato de entrada, pero nuestra función cheqcueva(CambiarCueva), necesita un dato de entrada.
Voy a poner un ejemplo sencillo para que se pueda entender:

def suma (numero1, numero2):
    return numero1 + numero2  

Definimos la función suma y dentro de los paréntesis agregamos 2 datos de entrada, numero1 y numero2 (al definir la función podemos poner cualquier nombre dentro de los paréntesis, yo podría haber puesto n1, n2 o num1, num2, pero siempre tiendo relación con lo que se desea hacer).
Una ves definida la función, la llamamos: 

print suma (7, 6)

En este caso le pasamos 7 que va a ser tratado como numero1 y 6 que va a ser tratado como numero2. Entonces la función hará lo siguiente:

return numero1(7) + numero2(6)

Si yo quiero guardar el valor de retorno de esta funcion en una variable hago lo siguiente:

resultado = suma(7, 6) #Resultado guarda el retorno de la función (13 en este caso)

Viendo los resultados del juego

print ("Te acercas a la Cueva...")
    time.sleep(2)

Mostramos un poco de texto en la pantalla y luego llamamos a la función time.sleep(). El modulo time tiene una función sleep() que hará una pausa en el programa durante los segundos que le pasemos como parámetro (en nuestro caso pasamos 2 segundos).

print ("Esta oscuro y tenebroso...")
    time.sleep(2)

Hacemos lo mismo con un poco mas de texto y la espera de 2 segundos. Estas pausas cortas le dan un poco de suspenso al juego en lugar de mostrar todo el texto de una ves. 

print ("Un gran dragon salta delante tuyo, abre su boca y...")
    print ("")
    time.sleep(2)

Que es lo que pasa ahora? Como el programa decide que es lo que pasa?

Decidir en que cueva esta el dragón amistoso

FriendlyCueva = random.randint (1, 2)

Ahora vamos a decidir al azar (con el modulo random) en que cueva esta el dragón amistoso. Nuestra llamada a la función random.randint(1, 2) nos devolverá 1 o 2 y guardara este valor en la variable FriendlyCueva.

if CambiarCueva == str(FriendlyCueva):
        print ("Te entrega el tesoro...")
    else:
        print ("El dragon te come de un bocado....")

Ahora comprobamos si el numero entero de la cueva que elegimos ("1" o "2") es igual a la cueva seleccionada al azar para encontrar el dragón amistoso. Pero, un momento, el valor de  CambiarCueva era una cadena (raw_input devuelve cadenas) y el valor de FriendlyCueva es un entero (porque random.randint() devuelve enteros). No se puede comparar cadenas y numeros porque siempre seran diferentes ("1" no es lo mismo que 1). Lo que hacemos es pasar a cadena la variable FriendlyCueva (str(FriendlyCueva)).

Luego sigue la palabra clave else que se ejecuta si la condición en la sentencia if es falsa. Pensémoslo así: si la condición se cumple, hacer esto, si no, hacer lo otro.
Podemos notar que siempre se ponen dos puntos al final del if, else, while y def. Los dos puntos marcan el final de la declaración, y nos dice que la linea siguiente es el comienzo de un nuevo bloque.

Donde comienza el programa realmente

EmpezarNuevo = ("si")

Esta es la primera linea de código que no es una declaracion def, o sea, no esta dentro de una función. En esta linea realmente es donde comienza nuestro juego. Las declaraciones def anteriores simplemente definen las funciones que esperan ser llamadas. Las funciones deben ser definidas antes de ser llamadas.

while EmpezarNuevo == ("s") or EmpezarNuevo == ("si"):

Este ciclo while va a ser verdadero mientras que EmpezarNuevo sea igual a "s" o a "si". Por eso es que inicializamos la variable EmpezarNuevo con el valor "si", para que la primera ves que entramos al juego el ciclo sea verdadero y se inicie el mismo.

Llamando a las funciones de nuestro programa
 
introduccion()

Aquí llamamos a la función introduccion(), esta no es una función que python incorpore, si no que es una función hecha por nosotros, definida anteriormente en el programa y que podemos utilizarla cuando nosotros queramos. Cuando se llama a esta función, la ejecución del programa salta a la primera linea de la función.

NumCaverna = CambiarCueva()

Esta linea también llama una función creada por nosotros. Recordar que la función CambiarCueva() permite elegir al jugador a que cueva quiere entrar. Lo que elija el jugador se va a guardar en la variable NumCaverna.

cheqcueva(NumCaverna)

Diagrama de Flujo
Diagrama de Flujo

Esta linea llama a nuestra función cheqcueva() con el argumento NumCueva (que va a ser 1 o 2 dependiendo de lo que elija el jugador).  Esta es la funcion que va a retornar "Te entrega el tesoro..." o
"El dragon te come de un bocado...." dependiendo del ingreso del jugador y del azar del juego.

Dando la opción de jugar de nuevo

print ("Quieres jugar de nuevo? (si o no)")
    EmpezarNuevo = raw_input()

Una ves que el juego se termine, se le preguntara al jugador si quiere hacerlo de
nuevo. Dependiendo de lo que ingrese, el ciclo while se termina o sigue.

Por cualquier duda o sugerencia espero sus comentarios en la entrada. Saludos

  1. Unknown dice:

    genial solo una duda dices que una variable declarada en una función solo pude ser usada y modificada en dicha función y no puede ser usada ni modificada globalmente
    mi pregunta es por ejemplo como le digo a python que una variable es global y otra no es así ?

    #mi ejemplo corrígeme si estoy en lo correcto
    def hola():
    quetal = ""
    #arriba ya puse una variable se supone que es local

    #pero aqui si dejo un espacio de linea y pongo la misma variable ya python la interpreta de que es otra variable distinta ejemplo:
    quetal = 5

    estoy bien o mal por favor explícame tiene que ver con dejar una linea en blanco y ya que las de las funciones no puedes saltarte linea o como ?

    1. PythonDiario dice:

      Hola Angel, gracias por tu comentario. Con respecto a tu pregunta, los espacios en blanco no tienen nada que ver.
      Después de definir una función, ejemplo:
      def hola():
      Todo el código que venga acá abajo con una sangría de 4 espacios (identacion) pertenece a la función.
      Ejemplo:
      def que_tal():
      hola = "" #pertenece a la función
      hola2 = "" #pertenece a la función

      hola3 = "" #pertenece a la función
      hola4 = "" # NO PERTENECE A LA FUNCIÓN

      Espero haberte aclarado un poco la duda, cualquier cosa me contas. Saludos

    2. PythonDiario dice:

      Perdón, los comentarios no me respetan los espacios. La variable hola, hola2 y hola3 tienen una sangría de 4 espacios. La variable hola4 no tiene sangría.

    3. Unknown dice:

      ¡aaa ya! gracias diego por aclarar mi duda seguiré visitando tu blog continua mente me gustaría que hablaras sobre pyQt si no es mucha molestia 😉
      Gracias por tu respuesta una ves mas.

    4. PythonDiario dice:

      Ángel: claro que escribiré sobre PyQt. También decirte que estoy creando una entrada sobre las variables locales y globales en python para sacar las dudas porque yo también tuve inconvenientes con el tema cuando empecé con Python. Gracias por visitar el blog. Saludos

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Juego en python: reino del dragon (parte 1)

Juego en python
Reino de Dragones

Otro juego divertido para aprender a programa con python. Espero les guste y cualquier duda o sugerencia espero sus comentarios.

También se pueden ver los demás juegos que vamos aprendiendo en la sección juegos en python.

En el juego de hoy vamos aprender a crear nuestras propias funciones. Una ves que tengamos claro el concepto y la implementación de las funciones, todo sera mas fácil y organizado.

Los temas que se van a tratar en este juego:

  • El modulo time
  • La función time.sleep()
  • La palabra clave return
  • Creación de funciones con la palabra clave def
  • Los operadores booleanos and, or y not
  • Tablas de verdad
  • Variables (locales y globales)
  • Parámetros y argumentos
  • Diagramas de flujo

Como jugar al Reino del Dragón
En este juego, el jugador se encuentra en una tierra llena de dragones. Los dragones viven en sus cuevas y en ellas guardan sus tesoros. Algunos dragones son buenos y compartirán su tesoro, otros dragones son codiciosos y hambrientos y se comerán a cualquiera que pise su cueva. El jugador se encuentra frente a las dos cuevas, una con un dragón amable y otra con un dragón hambriento. El jugador tiene que elegir a cual cueva entrar, sin saber de ante mano donde esta uno u el otro. 
Abre tu editor de python (en mi caso Eclipse + Pydev) y pega el código siguiente. A lo largo de esta entrada explicare como funciona.

#! /usr/bin/env python
# -*- coding: utf-8 -*-



#Reino del Dragon....
import random
import time

def introduccion():
    print ("Estamos en una tierra llena de dragones. Delante de nuestro,")
    print ("se ven dos cuevas. En una cueva, el dragon es amigable")
    print ("y compartira el tesoro contigo. El otro dragon")
    print ("es codicioso y hambriento, y te va a comer ni bien te vea.")
    print ("")

def CambiarCueva():
    cueva = ""
    while cueva != "1" and cueva != "2":
        print ("Ha que cueva quieres entrar? 1 o 2?")
        cueva = raw_input()
       
    return cueva

def cheqcueva(CambiarCueva):
    print ("Te acercas a la Cueva...")
    time.sleep(2)
    print ("Esta oscuro y tenebroso...")
    time.sleep(2)
    print ("Un gran dragon salta delante tuyo, abre su boca y...")
    print ("")
    time.sleep(2)
   
    FriendlyCueva = random.randint (1, 2)
   
    if CambiarCueva == str(FriendlyCueva):
        print ("Te entrega el tesoro...")
    else:
        print ("El dragon te come de un bocado....")
   
EmpezarNuevo = ("si")

while EmpezarNuevo == ("s") or EmpezarNuevo == ("si"):
   
    introduccion()
   
    NumCaverna = CambiarCueva()
   
    cheqcueva(NumCaverna)
   
    print ("Quieres jugar de nuevo? (si o no)")
    EmpezarNuevo = raw_input()
   
Empecemos a trabajar

import random
import time

Empezamos importando 2 módulos: el modulo random y el modulo time. Como vimos en el juego anterior, el modulo random nos va a ser útil para elegir números al azar. En este juego también vamos a usar el modulo time para hacer algunas funciones relacionadas con el tiempo.

Definición de la función introduccion()

def introduccion():
    print ("Estamos en una tierra llena de dragones. Delante de nuestro,")
    print ("se ven dos cuevas. En una cueva, el dragon es amigable")
    print ("y compartira el tesoro contigo. El otro dragon")
    print ("es codicioso y hambriento, y te va a comer ni bien te vea.")
    print ("")

Como su nombre los dice, la función introduccion(), cuando es llamada brinda al usuario la presentación del juego.

Las funciones se componen de la siguiente manera: la palabra clave def, seguido del nombre que va a tener la función con paréntesis, y luego dos puntos, a partir de ahí, todo lo que este con sangría debajo de la función es lo que se llama el bloque de la función, lo que nuestra función va a realizar.
La declaración def significa que estamos creando una función y podemos llamarla cuando la necesitemos. Después de definir nuestra función, podemos llamarla de la misma manera que llamamos a otras funciones. Una ves sea llamada, se ejecuta lo que esta dentro del bloque de dicha función.
También decir que cuando el programa llega al código def, este no es ejecutado, si no que la función se ejecuta una ves sea llamada. Cuando la función es llamada, el código salta al def para saber lo que tiene que hacer.
Cuando llamamos a la función introduccion(), la ejecución del programa salta a la linea def introduccion(): y cuando este bloque de código se termina, el programa vuelve a la linea donde fue llamada la función.

Voy a explicar todas las funciones que utiliza el juego antes de explicar la parte principal del programa. Puede ser un poco confuso conocer el programa en el orden que se ejecuta. Pero tenemos que tener en claro que las funciones permanecen inactivas hasta que son llamadas.

Definiendo la función CambiarCueva()

def CambiarCueva():
    cueva = ""
    while cueva != "1" and cueva != "2":
        print ("Ha que cueva quieres entrar? 1 o 2?")
        cueva = raw_input()
       
    return cueva

Aqui definimos la funcion CambiarCueva(). Esta funcion le hara elegir al usuario entre la cueva 1 o la cueva 2.
Dentro de esta funcion se crea una nueva variable llamada cueva que almacena una cadena vacía. Después, comenzamos con un ciclo while,  que se va a repetir si el usuario no elije 1 o 2 (este ciclo se utiliza para evitar errores, si el usuario elije otro numero o cualquier otro caracter, el ciclo se repite)
La primera ves que se llama la función, la sentencia:
while cueva != "1" and cueva != "2":
Va a evaluar lo que esta dentro de la variable cueva (que en un principio esta vacía), por lo tanto  cueva != "1" es verdadero y cueva != "2" también es verdadero (si estas dos condiciones son verdaderas la función entra en el ciclo)
Una ves que la función entre en el ciclo, va a preguntar al jugador en que cueva quiere entrar. Cualquier cosa que el jugador escriba se va a guardar en la variable cueva: cueva = raw_input(). Si el jugador escribió 1 o 2 el while va a ser falso y por lo tanto va a terminar retornando lo que esta guardado en la variable cueva: return cueva. Si el jugador escribió cualquier otra cosa, el while va a ser verdadero y por lo tanto se va a repetir.

En la segunda parte seguiremos con el juego. Cualquier duda o sugerencia espero sus comentarios.

  1. Xurand Gomez dice:

    Genial, se ve interesante... espero con ansias el sgte tuto!!

    Saludos!!

    1. PythonDiario dice:

      Hola Xurand, me alegro que te haya gustado, voy a tratar de hacer la segunda parte en estos días. Saludos

  2. JAndresPLP dice:

    Genial idea, me has picado al blog. Añadido a marcadores diarios.

    1. PythonDiario dice:

      Me alegro de que te haya gustado.

  3. Anónimo dice:

    esta genial apenas estoy empezando en esto de python y este post me hizo de mucho para entender como funciona espero el siguiente 😉

    1. PythonDiario dice:

      Gracias, me alegro te guste el juego en python. Te cuento que la segunda parte ya la subí hace un tiempo. En el final de este post esta el enlace, si no puedes acceder desde aquí: http://www.pythondiario.com/2013/06/juego-en-python-reino-del-dragon-parte-2.html
      Saludos

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Subir

Te has suscrito correctamente al boletín

Se produjo un error al intentar enviar tu solicitud. Inténtalo de nuevo.

Mi Diario Python will use the information you provide on this form to be in touch with you and to provide updates and marketing.