Diseño de Paginas Web en Marbella

Programación de juegos en Python - Tutorial 1

En este tutorial vamos a tomar contacto con el lenguaje python, y hacer un jueguecito muy simple en modo consola.

El objetivo es que nos familiaricemos con el lenguaje y veamos el sistema de la mayoria de los juegos, esto es:
procesar -> mostrar -> interactuar -> procesar ….

La idea del juego es que el ordenador elije un numero y nosotros tenemos que adivinarlo en menos de los intentos que le digamos.
El ordenador nos dará pistas de si nuestro numero es mayor o menor que el secreto.

Como veis, es muy simple, apenas 20 lineas …

Podeis descargaros el código fuente de aquí: Código fuente tutorial 1


IMPORTAR LIBRERIAS
El primer paso es importar las librerias (o bibliotecas) que vayamos a necesitar, en este caso usaremos la libreria random, que nos da la posibilidad de generar números aleatorios (esto es una de las bases de los juegos, los números aleatorios, ya hablaremos de las semillas, y que no son tan “aleatorios” como parecen más adelante).
Esto se hace con la siguiente instrucción:

import random

Las sentencias acaban tal cual, nada de puntos y comas al final. (A los que vengan de otros lenguajes les costará acostumbrarse a esto).


LA FUNCIÓN MAIN
Para ser clásicos y ordenados, crearemos una función main, que es la principal del programa, la que realizará todas las tareas.
Es conveniente acostumbrarse a trabajar con funciones, para tener mas abstracción, esto es, dividir el problema grande en problemas más pequeños (divide y vencerás).

En este juego solo vamos a usar la función principal (main).

Las funciones se definen de la siguiente manera:

def main():
    # Esta es la funcion principal

#Esto no está dentro de la funcion principal
if __name__ == ‘__main__’: main()

Aquí viene una de las carácteristicas de python, y es que no usa llaves para englobar, usa código sangrado.
Así definimos la función con def, luego el nombre de la funcion, despues dos puntos, y todo lo que esté sangrado pertenecerá a la función.

Todo lo que empiece por almuadilla (#) será interpretado como comentario y no vale más que para informar a quién lo lea.

La ultima instrucción es un truco para que se ejecute el main si todo va bien.


EMPEZAMOS EL DESARROLLO
Dentro de la función main, cambiamos el comentario por el siguiente código:

def main():

    numero_secreto = random.randint(1, 60)
    print “\nTienes que adivinar un numero !!!!\nEn cuantos intentos crees que lo conseguiras?”
    intentos = input(”Introduce numero de intentos: “)
    print “Bien asi que lo haras antes de “, intentos, ” intentos …\nA ver si es verdad !!\n”
    acertado = 0
    cont=1

En la primera instrucción generamos un número aleatorio y entero entre 1 y 60 y lo guardamos en la variable numero_secreto.

Informamos al usuario mediante la función print. Todo lo que vaya entre comillas aparecera en pantalla, y el retorno de carro es \n.

En la tercera instrucción le pedimos al usuario que nos de el número de intentos que tendrá y lo guardamos en la variable intentos.
NOTA: no pongais ningún caracter de salto de linea en la función input, o no funcionará.

Por último mostramos al usuario el numero de intentos y lo retamos a jugar.
Cabe destacar que para mostrar una varible en la funcion print hay que separar por comas la función.

La función print es mucho, pero muho más completa de lo que parece, al igual que input y su hermana gemela raw_input, estaría bién echarles un ojo …

Por último decimos que aún no lo ha acertado (acertado=0) y que va a realizar el primer intento (cont=1)


EL BUCLE PRINCIPAL
Este es el nucleo del juego, donde se realiza lo principal, vamos a ver el código:

while (not acertado and cont< =intentos):
    print "\nIntento numero ", cont
    num_user = input("Introduce un numero (entre 1 y 60): ")
    if(num_user == numero_secreto):
        acertado=1
        break
    elif(num_user > numero_secreto):
        print “\nEl numero secreto es MENOR que ” , num_user
    elif(num_user < numero_secreto):
        print “\nEl numero secreto es MAYOR que ” , num_user
    cont = cont + 1

Es un bucle while, que significa “mientras”, en este caso su tradución sería:
Mientras no lo haya acertado y el numero de intentos sea menor o igual a los que dijo, haz …

Y se repetirá una y otra vez hasta que pase alguna de las condiciones de salida.

Luego se informa al usuario de los intentos que lleva y le pedimos un nuevo número.

Ahora comparamos el número que nos ha dado con el secreto mediante la sentencia if (que se traduce como: SI “condicion”, haz …).
Si ha adivinado el número marcamos que ha acertado y utilizamos la sentencia break, que se encarga de parar el bucle que la contiene y salir (en este caso no haría falta, pero es necesario conocerla para evitar los “bucles infinitos sin control”).
La siguiente sentencia solo se ejecuta si no es correcta la de arriba, asi, si no es el numero secreto, miro si es mayor, y si lo es informo al usuario, sino, miro si es menor (aunque por lógica no haga falta) he informo al usuario.

Por último aumento el numero de intentos.
Y volveriamos al while … mostrar -> interactuar -> procesar -> mostrar …


GAME OVER
Si ha salido del bucle puede ser por dos motivos, que haya acertado el número, o que se le hayan acabado los intentos, vamos a ver cómo sabemos que ha ocurrido …


if(acertado):
    print “\nGUUAAAUUU !!!! Lo acertaste !!!\n\n El numero secreto era ” , numero_secreto
    print “\n\n Gracias por jugar !!!”
else:
    print “\nOOOOHHHHHH !!!! Lo siento, pero NO has acertado …\nEl numero secreto era ” , numero_secreto
    print “\n\n Gracias por jugar !!!”

Simple, miramos si ha acertado, y si es asi, mostramos mensaje de ganador, sino, mensaje de perdedor.


NOTAS FINALES
Para los que ya hayan programado les habrá parecido muy simple, muy básico, pero era necesario un juego en consola para acostumbrarnos un poco a python, pero ya no habrá más juegos por consola, los siguientes seran en sdl (pygame).

ESTE JUEGO NO ESTA TERMINADO …
Si quereis practicar un poco mientras salen nuevos tutoriales, podeis probar las siguientes mejoras:

- Cuando se acaba el juego, el jugador podría querer volver a jugar, ¿podrias solucionar eso?
- Como todo programa informático, este script tiene bugs, y uno de ellos es que si en vez de insertar un número, introducimos una cadena (tu nombre, por ejemplo) el programa peta (petar es que no va, que se rompe). ¿Podrias solucionar esto? ( Vendría bién mirar la función type() … quizas te sirva de algo).


Como siempre, cualquier error, corrección y mejora serán bienvenidos.

30 Responses a “Programación de juegos en Python - Tutorial 1”

  1. falcon-k Dice:

    Estoy deseando echarle un vistazo a la próxima entrega, aunque espero vaya un poco más cargadita ;D

  2. urizuka Dice:

    No esta mal para ser la primera entrega i el primer contacto con el lenguaje, aunque como bien dices, esto es algo bastante basico que, si has programado alguna vez, es lo primero que programas. A ver que tal el Proximo Capitulo, SDL. Esto se puede poner interesante…

    Saludos ;)

  3. Leon Dice:

    Pues yo antes de nada echaría un ojo por aquí para aprender más o menos cómo vá esto del python, porque así en frío, hay cosas que pueden no entenderse. =) Me parece una iniciativa muy interesante ésto de enseñar a programar para juegos y espero que el tutorial no se quede sólo en sdl, y se enseñe algún aspecto en el que se pueda tirar de algo más avanzado, del tipo cliente/servidor o algo así. =P Estaría bien que un servidor pensara un número y entre 3 o 4 haya que acertarlo el primero. Tampoco estaría mal sacar con otro .py el número que ha pensado el .randint, o cosas así.

  4. Jaime Dice:

    ¡Genial! Tenía ganas de aprender Python, así que me parece una buena manera, mediante juegos.

    Por cierto, hay algunas faltas tipográficas y una negrita sin cerrar a medio camino…

  5. moeblog Dice:

    […] /08/21/programacion-de-juegos-con-python-presentacion” target=”_parent”>, primera parte y segúnda parte. La primera parte es ba […]

  6. Rodrigo Dice:

    EL PATETICO PYTHON

    De python se dice:
    “El mejor lenguaje de programacion que se ha podido crear”
    “Es como debiera ser java”
    “El reemplazo de Perl”
    “El lenguaje script perfecto”

    Si es tan bueno como dicen, porque para el entorno grafico debe llamar a otro lenguaje de programacion para que le ayude a hacer lo que el no puede por si solo?

    Es como si el GUI de Java necesitara de VB para hacer las aplicaciones de su maquina virtual.

    Se que Python es script, y que TCL tambien lo es, acepto que usen librerias compiladas en C/C++ porque ninguno de ellos por si mismo compila, se que python inicio antes que TCL y que es mas rapido y robusto, pero deja mucho que desear el que las versiones libres de python que se consiguen traigan dentro al lenguaje TCL.

    Es como si para que funcionara Linux, necesitara arrancar primero FreeBSD.

    Para mi Windows sigue siendo un gestor de ventanas sobre DOS, que aunque hayan intentado ocultarlo, ni siquiera han podido hacer un instalador de WIndows sin DOS incluido.

    No hay alguna API grafíca que haya sido hecho en python propiamente, y que se pueda añadir al python sin que dependa de otros lenguajes??

  7. dvl Dice:

    Rodrigo, python es un lenguaje más, y como programador lo veo como una herramienta, me vale para algo determinado, si no te gusta, no te es cómodo o es “eticamente incorrecto” usas otro (esto es lo bueno de la diversidad), verás que todos en el fondo son iguales y todo depende del uso que le vayas a dar.

    Y he de admitir que para aprender a hacer juegos va de maravilla, facil, sin problemas de compilación, multiplataforma, si vamos a hacer juegos en 2D que “cualquier hardware” puede soportar … ¿Para que queremos un destornillador de 100 € si con el de 1 € podemos apretar el tornillo sin problema?

    Al fin y al cabo, esto es un tutorial para aprender a programar juegos, y no para aprender a programar en python.

  8. Antoine Dice:

    Para poder escribir correctamente en castellano, esto es para poner acentos y demás, hay que poner:

    # -*- coding: iso-8859-1 -*-

    En la primera o segunda línea del fichero adivinaNumero.py

    La información completa se puede consultar en:

    http://www.python.org/peps/pep-0263.html

    Un saludo.

  9. dvl Dice:

    Muchas gracias Antoine, lo probaré en el siguiente.

  10. Done Dice:

    parece que a Rodrigo no le gusta nada, este no sabe ni lo que quiere, para que se mete en cosas que no le agradan, mira he probado python y me va de perlas, no más que tengo excusas con mi distro de suse por no contar con ERIC ni BOA pero así le jalo con kdevelop o otro IDE, aquí estamos para colaborarnos y corregirnos linux es un sistema genial, a pesar de que guindos nos gane la partida con la aceleración disponible para los juegos, pero como sabemos eso no es culpa de los programadores de LInux sino de los capitalistas ingenieros que crean las tarjetas 3D y los videojuegos.
    cuando comprenderan que la sociedad tiene que ser libre. amén.

  11. Pachecon Dice:

    Amen hermano (XD)

    mmm,,, al parecer yo sobro aqui… …uso windows….

    Pues esto de los tutoriales esta vien, todavia no cheko los demas, pero espero ver alguno donde muestre como hacer un rpg o algo por el estilo.

  12. HIPOLITO Dice:

    SOY MUY NUEVO EN ESTO, NUNCA HABIA VISTO A PYTHON, PERO EL EJEMPLO ES EXCELENTE, MUY ILUSTRATIVO
    FELICIDADES.

  13. David Snake Dice:

    - Cuando se acaba el juego, el jugador podría querer volver a jugar, ¿podrias solucionar eso? esto como se hace?? esque lo he intentao pero no me sale

  14. karrigan Dice:

    facil al final de todo pones la funcion inicial que guarda todo el proceso osea main() y taran!!!!
    el programa corre again =) lo estoy haciendo con algunas modificaciones las hare pequeñas para q el programa valla creciendo ^^ ok? :P

  15. karrigan Dice:

    por cierto me refiero a la pregunta ” Cuando se acaba el juego, el jugador podría querer volver a jugar, ¿podrias solucionar eso? esto como se hace?” :D

  16. ZladMat Dice:

    Respondiendo a la primera pregunta:

    […]
    kkk = raw_input(’¿Quieres volver a intentarlo (s/n)? ‘)
    if kkk == ’s’:
    main()
    else: pass

    A lo segundo, simplemente tienes que tratar el raw_Imput como si preguntara por una cadena de caracteres, así que para que no de errores hay que anidarlo en str:

    str(raw_input(’Nº de intentos: ‘))
    […]

    Y problema solucionado.

  17. ZladMat Dice:

    Perdón, la segunda respuesta no es del todo correcta; si bien con str no da error, no se puede operar con la variable que la define, que es “intentos”.

    Así que, en mi opinión, lo mejor es algo como:

    intentos = input(â€Introduce numero de intentos: “)
    if type(intentos) == int: pass
    else:
    print ‘Esto no es ningún numero’

  18. bichotll Dice:

    me gusta el tuto, si kereis aprender python muy rapidamente pasaros por esta pagina, de aqui aprendi:
    http://www.freenetpages.co.uk/hp/alan.gauld/spanish/
    Learning to program

    GRACIAS

  19. alex Dice:

    el link para bajar el codigo fuente no funciona

  20. ctm Dice:

    python es una huevada

  21. Giancarlo velasquez valmori Dice:

    ESTOIY LEYENDOE STO Y ESTA ABURRIDO ALEX SE COPIO ESTO Y NO LE FUNCIONO JEJE

  22. Dokan Dice:

    … como ejecuto el juego???

  23. Uno Dice:

    Para Dokan: en Linux, guarda el código fuente en AdivinaNumero.py, abre una consola en esa carpeta y escribe python AdivinaNumero.py

    En Windows, no me acuerdo, supongo que tienes que guardar el fuente y ejecutarlo desde el IDE (creo)

  24. Dokan Dice:

    he conseguido q funcione retocando algunas cosillas (por cierto, el link al archivo con el código fuente no va…)
    respecto al comentario de Antoine, yo he solucionado el tema de los acentos y eñes poniendo por consejo de minid en este post :
    #!/usr/bin/python
    # -*- coding: utf-8 -*-

    el problema es que todavía no consigo que no pete cuando se le da una cadena en vez de un número, seguí los cosejos de ZladMat, aunque como no funcionaba cambié el if por un while:
    while type(intentos) int:
    print “Esto no es ningún número!!!\n Vuelve a intentarlo….\nIntroduce número de intentos: ”

    pero sigue sin funcionar y no se muy bien que más puedo intentar, (soy novato!!!)
    algún consejo más???
    gracias por el tuto
    un saludo

  25. NIcolas Dice:

    Hola, me gusto mucho pero le falto algo, quisiera saber como hago ahora para guardar lo que hice y probarlo despues

  26. Xil Dice:

    Es facil, copia el programa en un editor de textos, vi, joe, el bloc de notas, el que mas te guste. Guardalo con la extensión “.py” y siempre que quieras lo podras modificar o ejecutar. Por si acaso, para ejecutar un modulo es F5.
    Un saludo

  27. Luis Dice:

    Me temo que el enlace del código fuente no funciona, a ver si podéis subirlo de nuevo pronto ^__^. Muchas gracias por este tutorial. Hace tiempo que dejé un proyecto en Fenix con el que estaba muy ilusionado y espero que con Pygame pueda avanzarlo un poco :)

  28. aaron Dice:

    soy nuevo en esto quise aprender programacion y me intereso python porq dice q es mas funcional pero no lo entiendo nada!!
    para hacer paginas webs y quiero poner algo en la parte superir digamos, dice q le pongamos algo entre las plantillas pero en el caso de python no se usa la misma forma y por eso no lo entiendo y quiero q alguien me allude para poder entenderlo, quiero aser juegos y porgramas pero no tengo idea de como desarrollar lo q se porfas alludenme!!!

    aaron_1030@yahoo.com aaron-1030@hotmail.com aaron1030@gmail.com

  29. jose y mari Dice:

    el sexo es lo mejor

  30. Juan Oviedo Dice:

    Hola, me gustó mucho este primer tuto, voy a probar con los otros :D
    El tema de preguntar al usuario si desea seguir jugando lo solucioné “envolviendo” todo el programa en un ciclo q se ejecuta mientras el usuario no desee salir.
    El error que tira cuando se ingresa una letra en los lugares en que se pide un número lo traté con excepciones (aunq tuve q investigar un poco para eso ya que no está tratado en el tuto).

    Suerte.

Responder