Google+ Seguidores

sábado, 8 de junio de 2013

Juego en python: reino del dragon (parte 2)

    5

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

5 comentarios:
Write comentarios
  1. 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 ?

    ResponderEliminar
    Respuestas
    1. 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

      Eliminar
    2. 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.

      Eliminar
    3. ¡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.

      Eliminar
    4. Á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

      Eliminar

Tu comentario es importante y nos motiva a seguir escribiendo...

Entradas más recientes

© 2014 Mi diario Python. Designed by Bloggertheme9 | Distributed By Gooyaabi Templates
Powered by Blogger.