sábado, 7 de julio de 2012

Destruye el ladrillo




Introducción


Destruye el ladrillo es un juego parecido a "breakout". La página del juego es http://juegodelladrillo.es.tl/



Los integrantes de este equipo son:

  • JOSARETH RODRIGUEZ
  • BARBARA MADRID
  • JOSE LUIS FIGUEROA
  • MAGNELVIS ROLDAN
  • OSMAR GARCIA

Reseña


El juego Destruye el lLadrillo fue realizado utilizando Python/PyGame. Dicho juego posee diferentes funciones que se programaron para tener el resultado final. De igual manera se aplicaron colisiones, las cuales fueron de mucha importancia ya que la función collidelist verifica si la pelota (arma) chocó con alguno de los ladrillos y en caso tal, regresa el número de ladrillos contra los cuales se impactó o regresa un -1 en caso contrario (no hubo colisiones). En caso de haber colisionado, destruimos el ladrillo.

Referencias


Ellos citan como fuentes de información lo siguiente:

  1. chelintutorials.blogspot.com En este sitio web pudieron encontrar mucha información desde cómo crear un juego en Pygame desde cero, así como también diferentes tutoriales de Pythony que fueron de gran ayuda para ellos.
  2. http://razonartificial.com/tag/pygame/ En este sitio encontraron variedad de información y un juego llamado Arkanoid, el cual es parecido a Breakout.
  3. http://www.losersjuegos.com.ar/traducciones/pygame En este sitio encontraron la documentación oficial de PyGame traducida al español.

jueves, 5 de julio de 2012

Aventuras en busca de El Dorado

Hola a todos:

Esta es la reseña sobre el juego de "Aventuras en busca de El Dorado", el cual es el juego del equipo conformado por:

Pinto Leonor
Laya Oscar
Rondon Elieser
Urbano Leober
Velasquez Edibel
Vásquez Daniel

La página de su juego es la siguiente: http://aventuras.vzpla.net/personajes.html

Pido disculpas por lo breve de esta reseña- el trabajo de estos muchachos se ve muy prometedor y no se merecen una reseña tan chimba pero como saben estoy sin internet en la casa y tuve que ir a un ciber donde solo hay Guindous con Internet Explorer.  Esta basura de navegador no es compatible con Blogger y creo que voy a dejar esto hasta aqui porque de repente me dio nauseas y tengo ganas de vomitar ....  Bllaaaaarrchhhhh

martes, 3 de julio de 2012

Un parentesis ...

Hola a todos:

En estos días he estado sin internet en la casa, pudiendo conectarme apenas hoy desde la universidad.  Sin embargo, veo con preocupación que no ha habido novedades en cuanto al trabajo de cada equipo.  Evidentemente, mi preocupación se debe al corto plazo de tiempo que tenemos en lo que resta de este semestre.  Entienden que el trabajo de el videojuego vale el 60% de la nota?

Pero aparte de la nota, lo que a mi parecer es más grave es que estamos desaprovechando una excelente oportunidad para aprender colectivamente lo que implica la creación de un video juego.  Esta parte final es la parte más emocionante del curso, pero no veo animos de aprovechar la coyuntura. Será que los compañeros del curso pasado estaban mejor preparados que ustedes, y pudieron a pesar de todo desarrollar sus respectivas propuestas?

Trataré de conectarme luego.  Cuando lo haga espero ver el blog rebosante de comentarios y las propuestas de cada equipo (el código muchachos, el código) disponibles para su descarga en los respectivos blogs.

Efectos de Consola, Parte 4

En la entrada pasada vimos cómo crear animaciones y controlar los colores y otros atributos de visualización en modo texto usando secuencias de escape ANSI. En esta entrada veremos cómo utilizar una librería llamada libcaca que he portado a Python en forma castellanizada. La librería la deben instalar desde synaptic y los bindings de Python los deben descargar por aqui.

En esta entrada les traigo un pequeño script de un poco más de 100 lineas implementando el famoso juego de la culebra (recuerdan, el que venía en los Nokia?), pero en modo texto.  Ustedes pudiesen implementar su propia librería de visualización en modo texto usando secuencias de escape ANSI, pero las ventajas que ofrece libcaca es que permiten crear ventanas aparte, controlar eventos con dispositivos de entrada (ratón, teclado, etc.), etc.


El código para este juego lo pueden descargar por aqui.  Cuando vayan a correrlo, asegúrense de tener "caca.py" en el mismo directorio.  O instalen uds. mismos caca.py en /usr/local/... no-se-que-diablos para disponer de esta librería en todo momento.

Post-data: he probado el juego en python 2.7 pero hay problemas en la detección de eventos de presionado de teclas con libcaca. No sé si esto tenga que ver con la falta del paquete libcacadev (?).  En todo caso, no me he puesto a resolver este problema con detenimiento aún.

viernes, 29 de junio de 2012

Metal of Fire

Metal of Fire, o Metal de Fuego, en palabras del équipo:


Es un juego de acción del tipo arcade, basado en el video juego de GALAXI (1981) desarrollado por la compañía namco para las consolas Atari 2600, Atari 7800, Arcade, Commodore 64, Famicom Disk System, J2ME, MSX, Xbox 360, Nintendo Wii. Tenía como objetivo controlar una nave que debe enfrentarse contra un enjambre de marcianos que le atacarán disparando bombas y actuando como kamikazes. Éste es uno de los primeros juegos con un nivel de bonus, además fue continuado y mejorado con el tiempo y en varias versiones en diferentes consolas de video.
La finalidad de METAL OF FIRE es controlar nuestro avión (Zukhoi) de un lado a otro de manera horizontal (de izquierda a derecha) evitando y atacando a los aviones enemigos de manera tal que cada vez que eliminemos a todos podamos subir de nivel. Cada nivel que se aumente vendrá acompaño de un grado más de dificultad para el usuario, ataques más constantes y más veloces y aviones contrincantes. METAL OF FIRE representa otra versión más de este grandioso juego que rompió barreras en la modalidad de acción y tripulación de una aeronave, invitamos a la comunidad de programadores de pygame en el mejoramiento y continuación de él.


¡Que gratos recuerdos cuando mencionaron la Commodore 64 y el Atari 2600!

El équipo está integrado por:

  • Mirianni Medina
  • Feliz Verde
  • Anthony Silva
  • Kenner Muñoz
  • Argenis Mata
  • Wuilder Bravo

Y la página web es http://metaloffires.blogspot.com/ .

Invasión y Batalla

Los muchachos de Invasión y Batalla me hicieron llegar la información sobre el blog de su juego.  Dicho juego será colgado en http://invasionybatalla.blogspot.com/ .  Los integrantes de este equipo son:

  • Amundarain, Darcy
  • Cordoba, Pedro
  • Oropeza, Jesús
  • Obregon, Walter
  • Rodriguez, Jessica
  • Vielma, Lismar
A continuación una captura de pantalla y una breve reseña del videojuego tomada textualmente de su blog:


INVASION Y BATALLA... ES UN VIDEO JUEGO DE ACCION BASADO EN UN PAISAJE NATURAL, LA ESTRATEGIA CONSISTE EN DERRIBAR LOS HELICOPTEROS QUE VAN SOBREVOLANDO EL AREA, PARA ELLO EXISTE UN SOLDADO DE COMBATE QUE DEBE IMPEDIR LA INVASION Y EL BOMBARDEO DE SU TERRITORIO ATACANDO CON SU ARMA PARA TRATAR DE ELIMINAR LA MAYOR CANTIDAD POSIBLE DE HELICÓPTEROS Y BOMBAS QUE VAN DISMUYENDO LA VIDA DEL SOLDADO. MIENTRAS MAS SE ELIMINEN LOS INVASORES SE OBTENDRÁ MAS PUNTAJE Y AUMENTARA DE NIVEL. ES MUY FACIL DE JUGAR, AL EJECUTAR EL VIDEO JUEGO SOLO TIENES QUE PRECIONAR CUALQUIER TECLA PARA EMPEZAR LA DIVERSION. PARA EMPEZAR A DISPARAR SOLO NECESITAS EL MOUSE Y HACER MUCHOS CLIC, Y SI DESEAS SALIR DEL JUEGO SOLO PRECIONA LA TECLA "ESCAPE" 

miércoles, 27 de junio de 2012

Un correo esoterico revelado (Parte 2)

Para no dejar este problema inconcluso, doy a continuación su solución.

Primeramente, la data textual del correo cifrado, que se encuentra dispuesto en grupos de 8 cifras binarias, nos hace sospechar que cada octeto de bits representa un caractér ASCII.  El problema consistiría en leer este archivo e ir conviertiendo cada número de 8 bits a su correspondiente caracter ASCII. La cadena de todos estos caracteres sería el correo decifrado.

En segundo lugar, observamos que cada octeto de bits está separado por un espacio.  Entonces tenemos que leer el archivo y descomponerlo en una lista de octetos, cada uno de los cuales a su vez será convertido a un valor numérico que será el código ASCII del caractér en cuestión.

Sin más preámbulos, damos una primera solución:


#!/usr/bin/python
# -*- coding: latin-1 -*-
archivo=open("correo_esoterico.txt","r")
decifrado=""
for i in archivo:
    lis=i.split(" ")
    for j in lis:
        decifrado+=chr(int(j,2))
archivo.close()
archivo=open("decifrao.txt","w")
archivo.write(decifrado)
archivo.close()

Observen que el método split divide una cadena en una lista de cadena, donde se supone que el punto de división (caractér separador) es el espacio " ".  Observen también que la función int convierte una cadena a un número entero, donde también podemos indicar la base de representación numérica, que en este caso es 2 (números binarios).  Por último, la función chr retorna el caracter correspondiente al código numérico indicado en su argumento.

Alternativamente, podemos ahorrarnos todos esos for y trabajar con la programación funcional:

#!/usr/bin/python
# -*- coding: latin-1 -*-
archivo=open("correo_esoterico.txt","r")
cifrado=archivo.read().split(" ")
decifrado="".join([chr(int(x,2)) for x in cifrado])
archivo.close()
archivo=open("decifrao.txt","w")
archivo.write(decifrado)
archivo.close()

Quedan advertidos: el mensaje que me envió mi amigo (una vez decifrado), es burda de cursi, pero por lo menos nos sirvió para practicar  Python.

PyGame con sabor venezolano

Hola a todos:

Esta entrada del blog se corresponde a la reseña del equipo que está elaborando un material instruccional sobre Python/PyGame. En palabras del grupo, se pretende elaborar una "documentación clara y sencilla de introducción a python y los juegos que puedes realizar sin necesidad de usar pygame, como crear un video juego usando pygame y todas las soluciones del curso pasado a las dudas que tuvieron en el curso, dejarlas plasmadas en una sola documentación".  Los integrantes de este equipo son:

  • Quintero Sor Mary
  • Sanchez Ensor
  • Romero Hector
  • Colaiacovo Maria Fernanda
  • Mondello Giovanni

Esto es un trabajo en progreso, cuyos capitulos se iran colgando la siguiente página:



domingo, 27 de mayo de 2012

Un correo esotérico, parte 1

Habiendo mencionado un poco sobre la lectura/escritura de archivos de texto, les puedo proponer un simpático problema de programación que pueden resolver utilizando los conocimientos de Python que se han dado hasta ahora en este blog.

Un amigo mío me mando un día el siguiente correo:

:
:
:

El correo original consta de 22 páginas de ... ¡ceros y unos!  Pueden descargar el archivo de texto con la secuencia de dígitos binarios en este enlace.  La misión de ustedes será hacer un script en Python para "decifrar" esta secuencia de ceros y unos.  Quiero que observen lo siguiente:
  • Los ceros y unos están agrupados en grupos de 8 bits (cifras binarias).
  • Cada grupo de 8 bits seguramente representa algo... ¿Una letra o un caracter?
  • ¿Cómo representámos caracteres y letras en un computador? ¿Cuál sistema de codificación se usa más frecuentemente?
Traten de decifrar el mensaje antes de que yo publique el script para decifrarlo como siguiente entrada de este blog.




Archivos de texto

En esta entrada veremos como trabajar con archivos simples en python.  El tipo más simple de archivos es sin duda el archivo de texto.  Un archivo de texto es una sucesión de caracteres organizada en secuencias de líneas que reside en "algún lugar" de un dispositivo de almacenamiento secundario (disco duro, pen drive, cd rom, etc.) y al cual podemos acceder mediante su ruta.  La ruta es el camino en la jerarquía de directorios que indica de manera univoca en que parte de cual dispositivo de almacenamiento secundario reside el archivo. 


Un poco sobre las rutas de archivos


En linux, la raiz de toda ruta es "/". A partir de allí se indican los directorios y subdirectorios sucesivos separando los mismos mediante la barra diagonal "/". Por ejemplo,

/home/jlaurentum/Documentos/nota.txt

sería la ruta completa de un archivo llamado "nota.txt" que reside en el disco duro de mi computadora.  Notese que el elemento final de la ruta es el nombre del archivo en sí y que los archivos tienen terminaciones o sufijos que se indican despues del punto "." en su nombre.  Así, algunas terminaciones comunes son ".tex", ".odt", ".bin" que van asociadas a los archivos de LaTeX, Libre Office Writer y programas ejecutables en Linbux respectivamente.  Un sufijo de nombre de archivo particularmente importante para nosotros es ".py", el cual denota archivos de código fuente en Python, los cuales por cierto son archivos de texto tambien.

En Güindou$, el caracter separador de directorio en las rutas es la barra diagonal invertida "\".  Para especificar la raiz, hay que identificar el dispositivo de almacenamiento o la partición del disco duro mediante una letra seguida de ":".  Así por ejemplo, en la computadora de mis esposa (que es Guindou$-dependiente), tengo un archivo cuya ruta es:

C:\Mis documentos\jlaurentum\nota.txt

Yo evito usar espacios y caracteres raros en los nombres de mis directorios o de mis archivos.  Para separar las palabras de un nombre, utilizo el caracter de piso "_" o el guión "-" en vez del espacio " ".  Bueno, con esto estamos listos para ver cómo se trabajan con archivos en python.

El protocolo de trabajo con archivos de texto: abrir, leer/escribir y cerrar


Desde el punto de vista de programación en Python, podemos ver los archivos como objetos.  Cuando creamos una instancia de tipo archivo (mediante la sentencia open), indicamos la ruta del archivo y el modo de acceso al archivo, siendo este:

  • de escritura, indicado por "w" en el argumento modo de open.  Sólo será posible escribir al archivo.  Si no existe el archivo en la ruta, al abrirlo se crea.
  • de lectura, indicado por "r" en el argumento modo de open.  Sólo será posible leer el arhivo.
  • para anexar, indicado por "a" en el argumento modo de open.  Se podrá escribir sólo al final del archivo, sin modificar el contenido existente.
  • de lectura/escritura, indicado por "r+" en el argumento modo de open.  Se podrá leer y escribir al archivo.
Existen otros argumentos para modo, pero con estos basta.  Si abrimos un archivo para lectura pero este no existe en la ruta proporcionada, se genera un error.  Por ejemplo, vamos a suponer que me equivoco al escribir el nombre de nota.txt y escribo nata.txt (el cual no existe). Entonces, al abrir el archivo en Python, tendría un error:


>>> mi_archivo = open("/home/jlaurentum/Documentos/nata.txt","r")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IOError: [Errno 2] No existe el archivo o el directorio: '/home/jlaurentum/Documentos/nata.txt'
>>>


En otro post veremos como acceder a algunas funciones del sistema operativo verificar si un archivo existe, obtener un listado de archivos en un directorio, etc.  Supóngase pues, que "nota.txt" es un archivo de texto que contiene lo siguiente (puedes copiar y pegar este archivo y guardarlo en tu computadora para hacer las pruebas):


Este es un archivo de prueba.
Esta es la segunda línea.
Y esta es la tercera línea.


Intentamos una vez más abrir el archivo (habiendolo guardado previamente en la ruta que indicamos):


>>> mi_archivo = open("/home/jlaurentum/Documentos/nota.txt","r")
>>>


¡Éxito!  Notese que el método open, cuando es exitoso, crea una instancia nueva de la clase file (archivo). Así, mi_archivo es un objeto tipo file:

>>> type(mi_archivo)
<type 'file'>
>>>



Una vez que abrimos un archivo para lectura, estamos listos para acceder a él.  Vamos a visualizar el contenido de "nota.txt" con el siguiente script:


>>> for linea in mi_archivo:
...     print linea
...
Este es un archivo de prueba.

Esta es la segunda línea.

Y esta es la tercera línea.

>>>


Observen la sentencia for- es bastante elocuente para entender que python "vé" los archivos de texto como una secuencia de líneas.  Sin darnos cuenta, ya hemos leido todas estas líneas e inclusive las hemos imprimido. Pero ... algo anda mal. ¿Porqué hay un espacio adicional entre las líneas?  Resulta que cada línea en el archivo original termina en "\n", que es el caracter invisible que indica una nueva línea.  Cuando se imprime el "\n" al final de cada línea, se imprime un salto de línea adicional al salto de línea que imprime la sentencia print.  Por eso tenemos el interlineado de arriba.  Para corregir esto, lo que tenemos que hacer es eliminar el caracter final de cada línea cuando este es un "\n".  Sin embargo, tenemos que volver a abrir el archivo nuevamente porque en el último for lo leimos todo hasta el final:


>>> mi_archivo=open("/home/jlaurentum/Documentos/nota.txt","r")
>>> for linea in mi_archivo:
...     if linea[-1]=="\n":
...             linea=linea[:-1]
...     print linea
...
Este es un archivo de prueba.
Esta es la segunda línea.
Y esta es la tercera línea.
>>>


¡Qué éxito! Pero se nos ha olvidado algo muy importante: cerrar el archivo tras haber trabajado con él:


>>> mi_archivo.close()
>>>


No se puede repetir lo suficiente lo importante que es cerrar los archivos al final.  Si no lo hacemos, los cambios que hacemos al archivo en modo escritura se pueden perder o peor aún, el archivo puede corromperse y quedar inservible.

Ahora vamos a probar la escritura de archivos.  Normalmente, cuando yo quiero procesar el contenido de un archivo, lo que hago es abrir una copia en modo lectura y crear otro archivo en modo escritura al cual voy a escribir el contenido del primer archivo procesado.  Por ejemplo, supóngase que quiero recorrer todo el archivo "nota.txt" para cambiar la palabra "la" por "su":


>>> mi_archivo.close()
>>> mi_archivo=open("/home/jlaurentum/Documentos/nota.txt","r")
>>> otro_archivo=open("/home/jlaurentum/Documentos/nota2.txt","w")
>>> for linea in mi_archivo:
...     linea=linea.replace("la","su")
...     otro_archivo.write(linea)
...
>>> otro_archivo.close()
>>> mi_archivo.close()
>>>



Entonces, buscamos el archivo "nota2.txt" y lo abrimos con el editor de texto, verificando su contenido:


Este es un archivo de prueba.
Esta es su segunda línea.
Y esta es su tercera línea.



Para este ejemplo, tuvimos suerte.  El método replace sustituye todas las ocurrencias de su primer argumento por la cadena suministrada en su segundo argumento.  Si hubiesemos tenido una palabra como "reemplazarla", se hubiese cambiado a "reemplazarsu", lo cual seguramente no hubiesemos querido.  En otra entrada de este blog hablaremos de expresiones regulares, que nos permitirán hacer un procesamiento más avanzado con data de texto.


Exiten otras formas de leer un archivo, por ejemplo, podemos leer el archivo caracter por caracter.  El siguiente script cuenta el número de caracteres de nuestro archivo de ejemplo:


>>> mi_archivo=open("/home/jlaurentum/Documentos/nota.txt","r")
>>> contador=0
>>> caracter=mi_archivo.read(1)
>>> while caracter!="":
...     contador+=1
...     caracter=mi_archivo.read(1)
...
>>> print contador
87
>>> mi_archivo.close()
>>>



Este archivo contiene 87 caracteres, es decir, su tamaño es de 87 bytes.  Observen que esto concuerda con lo que nos reporta la consulta de las propiedades de ese archivo.  Tambien podemos leer el archivo de un sólo trancazo en memoria, como una lista de cadenas:


>>> mi_archivo=open("/home/jlaurentum/Documentos/nota.txt","r")
>>> lineas=mi_archivo.readlines()
>>> print lineas
['Este es un archivo de prueba. \n', 'Esta es la segunda l\xc3\xadnea.\n', 'Y esta es la tercera l\xc3\xadnea.\n']
>>> mi_archivo.close()
>>>



Los elementos raros en esta lista de cadenas se corresponden a caracteres especiales, como la "í" con acento en "línea", cuya codificación  utf-8, en 2 bytes, es c3ad.

Finalmente, hasta las páginas web se pueden leer como archivos de texto.  Por ejemplo, el siguiente script abre la página de la primera entrada de este blog:


from urllib import *
pagina=urlopen("http://mont-epython.blogspot.com/2011/06/como-primera-entrada-de-este-blog.html")
for linea in pagina:
    print linea[:-1]
pagina.close()


No se indicó la salida del interprete python en rojo porque este script imprime muchas líneas.  Observen que el tratamiento de una página web es virtualmente idéntico al de un archivo de texto: lo abrimos, lo leemos y lo cerramos.  La ruta del archivo es simplemente la dirección URL de la página, pero al abrir esta página y leerla, no vemos lo que veriamos en el navegador, vemos otra cosa.  ¿Qué exactamente? ¡Corran el script y averigüenlo!






Referencias