Contribuyentes

martes, 20 de noviembre de 2012

Nos vamos!


Me mudaré de página por que ya casi no hago mucho en esta e iré poniendo todo lo que he ido escribiendo a lo largo del tiempo en la nueva página antes de dar de baja esta.

La nueva dirección de la página es:

http://miguelpinia.wordpress.com

los espero por allá.

Saludos!

miércoles, 22 de junio de 2011

Expresiones regulares en Java

Hola a todos, ya tenía mucho tiempo que no escribía nada en el blog, la mayor parte del tiempo fueron por mis responsabilidades con la escuela, pero hoy vamos a tratar un tema que nos puede servir mucho para realizar validaciones de cadenas, reconocer patrones en las mismas, etc., las posibilidades son varias, así que vamos a empezar con las expresiones regulares.
Una expresión regular, es una expresión que permite describir un conjunto de cadenas sin enumerar sus elementos; estas expresiones nos permiten enumerar conjuntos de cadenas de manera formal y así decidir si una cadena esta dentro del conjunto descrito en la expresión regular.
Por ejemplo, en teoría de la computación (autómatas y lenguajes formales), una expresión regular serían las siguientes: a, aaa, a+, a*; los primeros dos elementos enumerados anteriormente representan conjuntos de una sola 'a' y tres 'a's respectivamente, mientras que la a con el signo "más" representa una o más veces la repetición de la a y con el signo '*' representa cero o más veces.
Otros ejemplos:

  • (ab)*: repeticiones de ab's cero o más veces
  • (azul|morado) busca las cadenas que digan azul o morado
  • ((ab)*(ab)+) todas las cadenas de ab que tengan al menos un par
En java se provee de un motor de búsqueda para cazar con dichas expresiones utilizando dos clases: Pattern  y Matcher. La clase Pattern, es la representación compilada de la expresión regular y la clase Matcher permite crear objetos a partir de Pattern.matcher con la cual se pueden realizar operaciones sobre la cadena de caracteres que queremos validar o en la secuencia de caracteres que queremos buscar.
Ya que di una pequeña explicación sobre las clases que permiten realizar el uso de expresiones regulares, vamos a realizar un pequeño ejemplo:


public class Ejemplo{

public static void main(String args[]){
        if(Pattern.matches("[A-Za-zñÑ]+", "Soy una Piña"))
            System.out.println("True");
        else
            System.out.println("false");
}

}
Una vez que se ha ejecutado este código el resultado va a imprimir en pantalla "True", dado que evalúa la cadena y determina que dentro de dicha cadena, cada uno de sus caracteres, entra en el intervalo dado en la expresión regular.
Una pequeña curiosidad en la expresión regular es el uso después de los corchetes del símbolo "+", este símbolo denota que la cantidad de elementos que caen dentro de la expresión regular debe ser de al menos uno, en cambio, si quisiéramos que el número de caracteres fuera exactamente cero, sustituimos el símbolo "+" por el símbolo "*", que sirve para denotar cero o más veces.
Con esto doy el pequeño ejemplo de las expresiones regulares en Java y en próximos posts escribiré sobre la forma de las expresiones regulares que nos permitirán tener mejores filtros para nuestras cadenas a evaluar.

Saludos.


miércoles, 19 de enero de 2011

Python (programación de videojuegos con pygame IV)

Esta será la entrada en la que terminemos nuestro pequeño juego, nuestro remake de Pong, en esta ocasión le añadiremos texto para poner el sistema de puntuación de nuestro juego así como mostraré de manera sencilla la forma de introducir sonido en nuestro juego. Comencemos!!!
Para poder tener un marcador de puntos de nuestro juego, es necesario que modifiquemos nuestra clase Pala que teníamos anteriormente, el método que modificaremos será el método actualizar, al cual le modificaremos su firma de la función para que acepte un parámetro más, el parámetro puntos, el cual nos permitirá poder modificar en pantalla el marcador, así como introducir unas cuantas lineas de código para modificar el valor de la variable puntos, lo cual es muy bueno, ya que no será necesario modificar de manera abrupta el código que ya teníamos, solo modificaremos la firma de la función y añadiremos las siguientes líneas de código:

#cambiamos los parametros del metodo para anadirle los puntos
def actualizar ( self,time,pala ,pala_cpu,puntos):
    #cuando pase de largo aumentamos un punto como corresponda
    if self.rect.left <= 0:
        puntos[1]+=1
    if self.rect.right >= ANCHO:
        puntos[0]+=1
    return puntos
Las líneas anteriores solo las añadimos en la parte intermedia de nuestro método, así como la simple modificación de la firma del método y al final del mismo le añadimos la sentencia "return". 
Ahora crearemos otro método que nos permita manipular el texto que mostraremos en pantalla, así que el código es el siguiente:

#Metodo para manipular el texto que queremos mostrar en pantalla
#el cual creara un sprite y la regresara junto con su imagen recien 
#creada
def texto(texto, posicion_x, posicion_y, color=(255,255,255)):
    #Cargamos la fuente para mostrar en pantalla
    fuente = pygame.font.Font('images/17-years-ago.ttf',25)
    #el texto lo pasamos por la fuente elegida
    salida = pygame.font.Font.render(fuente,texto,1,color)
    #creamos un sprite para mostrarlo en pantalla
    salida_rect = salida.get_rect()
    #al sprite con el texto lo ponemos en una posicion 
    #dentro de la pantalla
    salida_rect.centerx = posicion_x
    salida_rect.centery = posicion_y
    return salida,salida_rect

Este código nos sirve para poder insertar texto en nuestro juego de manera sencilla.
Ahora, procederemos a modificar nuestro Game Loop, el cual nos servirá para poder actualizar en cada momento de la partida nuestra puntuación y así mostrarla en pantalla. Lo que haremos, será crear una lista que nos permitirá almacenar los puntos del jugador, así como el de la máquina, además de crear los sprites necesarios para mostrarlos en pantalla durante cada ciclo del juego, la modificación es muy sencilla, la cual es la siguiente (si quieren ver de manera completa el código, junto con los archivos de la fuente y el sonido,  click aquí):

#anadimos las siguientes lineas al metodo
def game_loop ():
    
    #creamos una lista para almacenar los puntos
 #de ambos jugadores
    puntos = [0,0]
    while True:  
        puntos = bola.actualizar(time,pala,pala_cpu,puntos)
        #creamos los sprites de los puntos del jugador
        puntos_jug, puntos_jug_rect = texto("Jugador Puntos: "+str(puntos[0]), 140, 40)
        #creamos los sprites de los puntos del cpu
        puntos_cpu, puntos_cpu_rect = texto("Maquina Puntos: "+str(puntos[1]), ANCHO-ANCHO/4,40)
        
        #actualizamos los puntos en pantalla
        pantalla.blit(puntos_jug,puntos_jug_rect)
        pantalla.blit(puntos_cpu,puntos_cpu_rect)


y así de sencillo hemos añadido nuestro marcador a pantalla. Ahora solo falta añadir el audio a nuestro juego, este audio será el que suene cuando la bola choque contra alguna de las paletas del juego, la modificación será en la clase Bola, está modificación es muy sencilla, la cual será ilustrada a continuación:

#modificar en las secciones indicadas
class Bola(pygame.sprite.Sprite) :
    def __init__ ( self ):
        #cargamos el audio de choque contra una pared o raqueta
        self.sound = pygame.mixer.Sound('audios/rebote.wav')        
    def actualizar ( self,time,pala ,pala_cpu,puntos):
        if pygame.sprite.collide_rect(self,pala) :
            self.speed[0] = -self.speed[0]
            self.rect.centerx += self.speed[0]*time
            #al chocar con las palas generar sonido
            self.sound.play()
        if pygame.sprite.collide_rect(self,pala_cpu) :
            self.speed[0] = -self.speed[0]
            self.rect.centerx += self.speed[0]*time
            #al chocar con las palas generar sonido
            self.sound.play()

Y así hemos añadido de manera sencilla el audio en nuestro juego, el cual no es fue muy difícil ¿verdad?
Entonces con esto hemos terminado nuestro pequeño remake del Pong, el cual se ve así:

Fue divertido hacer nuestro primer videojuego con python, y muy sencillo, con esto hemos terminado y como en el post anterior, el código desarrollado esta aquí.
¡Hasta la próxima!

lunes, 17 de enero de 2011

Python (programación de videojuegos con pygame III)

Continuamos con el desarrollo de nuestro juego con python y su módulo pygame, en el post anterior creamos nuestro entorno del juego (la ventana), en esta ocasión cargaremos la interfaz gráfica en la pantalla, así como desarrollaremos el entorno del jugador (la pala) y el comportamiento de la bola en nuestro juego.
En nuestro código anterior le modificaremos para tener un método que nos permita maniobrar con imágenes, este soporte nos los brinda de manera parcial pygame, por lo que nuestro código a desarrollar es el siguiente:
#Metodo para cargar una imagen a nuestro juego 
#de manera semiautomatica
def cargar_imagen(nombre, transparent = False):
    """metodo para cargar una imagen dada su 
    ubicacion"""
    try:
        #intentamos cargar la imagen por su ubicacion
        #si no funciona mandamos un error
        imagen = pygame.image.load(nombre)
    except pygame.error, message:
        raise SystemExit, message
    #Optimizamos la calidad de la imagen, para
    #que esta no influya en de manera sustancial
    #en el consumo de recursos
    imagen = imagen.convert()
    if transparent:
        color = imagen.get_at((0,0))
        imagen.set_colorkey(color,RLEACCEL)
    return imagen

este método nos permite maniobrar de manera sencilla con las imágenes, para que veamos como funciona modificaremos nuestro método "Game_loop" para que nos cargue el fondo de pantalla para nuestro remake, antes de mostrar el código modificado, es necesario crear un directorio con el nombre images, donde pondremos los gráficos de nuestro juego (sprites), y la imagen a mostrar en el juego es la siguiente:

Ya que tenemos nuestra imagen base mostraré el código modificado, el cual es el siguiente:

#metodo que contiene a nuestro "Game Loop"
def game_loop ():
    #Creamos la ventana y la asignamos a una variable
    pantalla = pygame.display.set_mode((ANCHO,ALTO))
    #Le ponemos nombre a nuestra ventana
    pygame.display.set_caption("Remake de pong")
    #cargamos la imagen y la almacenamos en una variable
    fondo = cargar_imagen('images/fondo_pong.png')
    while True:  
        for eventos in pygame.event.get():
            if eventos.type == QUIT:
                sys.exit(0)
        #anadimos la imagen a la pantalla
        pantalla.blit(fondo,(0,0))
        #actualizamos la pantalla
        pygame.display.flip()
    return 0

Ya que tenemos modificado a nuestro archivo, lo ejecutamos y vemos el resultado de nuestra modificación, el cual se asemejará a ésta imagen:

¡Bien! Ahora nuestra aplicación se va asemejando cada vez al clásico Pong, por lo que ahora crearemos a la pala del jugador y a la bola de juego, para esto los desarrollaremos como clases que permitirán crear un conjunto de instancias de clases para nuestros propósitos, los cuales son el desarrollar la pala y la bola. Las imágenes de la pala y la bola son las siguientes, de igual forma las almacenaremos en el directorio images.



El código de la clase Pala es la siguiente:
#Clase Pala, esta es usada tanto para el jugador, como 
#por la computadora para poder jugar
class Pala(pygame.sprite.Sprite) :
    """Clase Pala: hereda atributos directamente de la clase 
    Sprite, que se encuentra en el paquete pygame.sprite"""

    #Metodo constructor de la clase, el parametro self es utilizada
    #por todos los metodos de cualquier clase, y el parametro
    #centerx es para indicarle a que altura del eje x iniciaremos a nuestra 
    #pala (esta es una analogia con el plano cartesiano)
    def __init__ ( self, centerx ):

        #inicializamos al metodo constructor de nuestra clase padre
        pygame.sprite.Sprite.__init__(self)
        
        #cargamos la imagen de la pala y la guardamos en una variable
        self.image = cargar_imagen("images/pala.png")
        
        #esta variable nos sirve para poder interactuar con los elementos
        #dentro de nuestro juego
        self.rect = self.image.get_rect()
        
        #indicamos la altura en el eje x
        self.rect.centerx = centerx
        
        #indicamos de manera default donde estara en el eje Y
        self.rect.centery = ALTO / 2
        
        #velocidad usada cuando apretemos una tecla
        self.speed = 0.5

    #metodo que permitira manipular a la pala
    def mover ( self, time, keys ):
        
        #las siguientes condicionales nos permitiran
        #que nuestra pala se mueva y ademas no se salgan
        # de la pantalla
        if self.rect.top >= 0 :
            if keys[K_UP] :
                self.rect.centery -= self.speed * time
        if self.rect.bottom <= ALTO:
            if keys[K_DOWN] :
                self.rect.centery += self.speed * time

    #Metodo que controlara nuestra computadora de manera automatica
    #es decir, la inteligencia artificial de nuestro oponente
    def ia( self, time, ball ):
        #Estas condicionales sirven para detectar el movimiento de 
        #la bola y entonces poder realizar una accion
        if ball.speed[0] >= 0 and ball.rect.centerx >= ANCHO/2 :
            if self.rect.centery < ball.rect.centery :
                self.rect.centery += self.speed*time
            if self.rect.centery > ball.rect.centery :
                self.rect.centery -= self.speed*time

El código anterior es el nuestra pala y como poder moverla en nuestro juego, así como la inteligencia artificial sencilla que nos permite crear un oponente controlado por computadora.
El siguiente código va a ser el de nuestra bola, que se moverá tal y como lo hacía en aquel entrañable juego que era el Pong

#Clase Bola, la cual permite tener una bola que se mueve de manera natural 
#en el juego
class Bola(pygame.sprite.Sprite) :
    """Clase Bola: hereda atributos directamente de la clase 
    Sprite, que se encuentra en el modulo pygame.sprite"""
    
    #Metodo constructor de la bola, no tiene ningun parametro
    def __init__ ( self ):
        #cargamos la imagen y la almacenamos en una variable
        self.image = cargar_imagen("images/ball.png",True)
        #esta variable nos sirve para poder interactuar con los 
        #elementos dentro del juego
        self.rect = self.image.get_rect()
        #lugar de inicio por default
        self.rect.centerx = ANCHO/2
        self.rect.centery =  ALTO/2
        #velocidad utilizada para desplazarse en los dos ejes
        self.speed = [0.5,0.5]

    #Este metodo funciona para actualizar en pantalla los elementos de 
    #de nuestro juego
    def actualizar ( self,time,pala ,pala_cpu):
        #actualizando la posicion de la bola en pantalla
        self.rect.centerx += self.speed[0]*time
        self.rect.centery += self.speed[1]*time
        
        #cambiar la posicion de la bola al chocar con las paredes
        if self.rect.left <= 0 or self.rect.right >=ANCHO :
            self.speed[0] = -self.speed[0]
            self.rect.centerx += self.speed[0] * time   
        if self.rect.top <= 0 or self.rect.bottom >= ALTO :
            self.speed[1] = -self.speed[1]
            self.rect.centery += self.speed[1]*time
            
        #cambiar la posicion de la bola al colisionar con alguna de 
        #de las palas
        if pygame.sprite.collide_rect(self,pala) :
            self.speed[0] = -self.speed[0]
            self.rect.centerx += self.speed[0]*time
        if pygame.sprite.collide_rect(self,pala_cpu) :
            self.speed[0] = -self.speed[0]
            self.rect.centerx += self.speed[0]*time

El código anterior, nos muestra de manera sencilla como se mueve de manera autónoma la bola sin necesidad de interferir el usuario. Y finalmente para poder utilizarlos en nuestro juego, volvemos a modificar el método "Game_loop", la modificación es la siguiente:

#metodo que contiene a nuestro "Game Loop"
def game_loop ():
    #Creamos la ventana y la asignamos a una variable
    pantalla = pygame.display.set_mode((ANCHO,ALTO))
    #Le ponemos nombre a nuestra ventana
    pygame.display.set_caption("Remake de pong")
    #cargamos la imagen y la almacenamos en una variable
    fondo = cargar_imagen('images/fondo_pong.png')
    #creamos una instancia de la clase Bola
    bola = Bola()
    #Ahora creamos dos instancias de la clase pala: una para
    #el usuario y otra para el computador
    pala = Pala(30)
    pala_cpu = Pala(ANCHO-30)
    #creamos una instancia de Clock para evitar que nuestro juego 
    #sobrepase una cantidad de frames preestablecidos
    clock = pygame.time.Clock()
    while True:  
        #igual que la variable clock, creamos otra para la limitacion
        #de los frames en pantalla
        time = clock.tick(60)
        #creamos una variable para almacenar las teclas presionadas
        #en cada momento del juego
        keys = pygame.key.get_pressed()
        for eventos in pygame.event.get():
            if eventos.type == QUIT:
                sys.exit(0)
        #actualizamos los datos del juego en cada uno de los ciclos
        #del juego
        bola.actualizar(time,pala,pala_cpu)
        pala.mover(time,keys)
        pala_cpu.ia(time,bola)
        #anadimos la imagen y demas elementos a la pantalla
        pantalla.blit(fondo,(0,0))
        pantalla.blit(bola.image,bola.rect)
        pantalla.blit(pala.image,pala.rect)
        pantalla.blit(pala_cpu.image,pala_cpu.rect)
        #actualizamos la pantalla
        pygame.display.flip()
    return 0

La apariencia resultante es la siguiente:

Con esto ya tenemos jugable nuestro pequeño programa, pero aún falta introducir texto en pantalla para mostrar la puntuación de cada uno de los jugadores y posiblemente introducirle sonido, por lo que hoy terminamos con esto y en el próximo post le enseñaré como introducir el texto en pantalla y el sonido de manera sencilla para que terminemos nuestro remake del Pong. Hasta la próxima :).

Nota: el código que hoy hicimos, así como las imágenes las podrán descargar desde aquí.

sábado, 15 de enero de 2011

Python (programación de videojuegos con pygame II)

Continuaremos con nuestro pequeño trabajo sobre como desarrollar un videojuego sencillo en python con la ayuda del módulo pygame, entonces el juego que haremos será un remake del clásico pong.
Antes de iniciar es necesario tener instalado pygame en nuestro sistema, si eres usuario linux con una distribución Ubuntu, la forma de instalarlo en nuestro sistema es la siguiente:

sudo apt-get install python-pygame

Y si eres usuario windows puedes darle click aquí, y escoger la versión de pygame de acuerdo con la versión de python que estés utilizando.

Bueno continuando con el desarrollo del videojuego, podemos iniciar de manera sencilla creando un script de python, por ejemplo, "pong.py", el cual contendrá lo siguiente:

#! /usr/bin/env python
import sys, pygame
from pygame.locals import *

#Constantes para nuestra ventana que crearemos
ALTO = 480
ANCHO = 640

#metodo que contiene a nuestro "Game Loop"
def game_loop ():
    #Creamos la ventana y la asignamos a una variable
    screen = pygame.display.set_mode((ANCHO,ALTO))
    #Le ponemos nombre a nuestra ventana
    pygame.display.set_caption("Remake de pong")
    while True:  
        for eventos in pygame.event.get():
            if eventos.type == QUIT:
                sys.exit(0)


if __name__ == '__main__':
    pygame.init()
    game_loop()


Con esto crearemos el entorno del juego (la ventana), la cuál se verá como la siguiente:

y con el sencillo script de arriba hemos creado nuestra ventana que contendrá a nuestro juego.
En el siguiente post les mostraré como añadirle imágenes a nuestro juego y crearemos a nuestros primeros personajes del juego: la pelota y la pala de juego.

Python (programación de videojuegos con pygame)

Bien, hoy programaremos un videojuego sencillo con python, utilizando un módulo que permite la creación de videojuegos en dos dimensiones cuyo nombre es “pygame”. Pygame permite desarrollar y prototipar rápidamente videojuegos en 2 dimensiones, además de ser una interfaz para SDL (Simple Direct Layer) orientada para el dibujado en 2D.
Antes de iniciar a programar nuestro primer videojuego en python, es necesario conocer como está estructurada la anatomía de un videojuego, que nos servirá como referencia para poder desarrollar nuestro videojuego en pygame.
Un videojuego se compone de la siguientes características:
  • Entrada:
    Claramente un videojuego necesita comunicarse con el usuario de alguna manera, esto será a través de un dispositivo de entrada como un joystick o un teclado.
  • Visualización:
    Esta característica tiene que ver con la capacidad de transmitir el estado interno del videojuego a una salida gráfica. Ya sea que el videojuego sea en 2D o 3D, esta característica es importante, ya que, a partir de ella será fundamental el que sea agradable visualmente al jugador. Para este pequeño tutorial será en 2D, dadas las características de programación con las que trabajamos (el módulo pygame solo trabajo con Sprites en 2 dimensiones).

  • Sonido:
    Esta característica también es muy importante, ya que el audio proporcionado al jugador le transmitirá un conjunto de sensaciones que le permitirán determinar si el juego es agradable o no (pygame proveé un conjunto de herramientas para trabajar con audio de manera sencilla).

  • Comunicaciones:
    Actualmente los juegos en línea y más los juegos sociales van ganando más adeptos dentro del mercado de los videojuegos. Normalmente los videojuegos en línea utilizan comunicación TCP/IP, lo cual permite que juguemos con otras personas en nuestra red local o que se encuentra en otros lugares del globo. Como pygame está basado como una interfaz de SDL, nos permite maniobrar con este tipo de cosas, pero este tema sale de nuestro pequeño tutorial.

  • Game loop:
    Esta característica, tal como su nombre indica, es la que realiza el ciclo del juego y se encarga de realizar las actividades antes mencionadas. En la figura siguiente se muestra de manera sencilla como es que está estructurado el “Game Loop”.


Ya que hemos analizado como es que funciona un videojuego, procederemos a realizar el videojuego prometido. El videojuego que haremos será el clásico pong, el cual realizaremos en python, pero para eso lo empezaremos a hacer en el siguiente post, en el cual ya nos dedicaremos directamente a programar en python junto con el módulo pygame.

viernes, 14 de enero de 2011

El algoritmo genético simple (AGS)

En el libro Mathematical Foundations of Programming, Holland propone una manera de seleccionar individuos y de cruzarlos. Actualmente existen muchas otras propuestas, pero las de Holland constituyen aún hoy la base de muchos desarrollos teóricos y prácticos en el área. Goldberg en "On Computable Numbres with Application to the Entscheidungsproblem" publicado en Proceedings of the London Mathematical Society, retomó el algoritmo de Holland y lo popularizó llamándolo algoritmo genético simple (AGS). En éste se considera que los códigos genéticos están en binario. Explicado con detalle el proceso de un AGS es:
  1. Decidir cómo codificar el dominio del problema.
  2. Generar un conjunto aleatorio (población inicial) de N posibles soluciones codificadas al problema. A ésta se le llamará la población actual.
  3. Calificar cada posible solución (individuo) de la población actual.
  4. Seleccionar dos individuos de la población actual con una probabilidad proporcional a su calificación.
  5. Lanzar una moneda al aire (con probabilidad pc cae cara).
  6. Su cayó cara mezclar los códigos de los dos individuos seleccionados para formar dos híbridos, a los que llamaremos nuevos individuos.
  7. Si cayó cruz llamamos a los individuos seleccionados nuevos individuos.
  8. Por cada bit de cada nuevo individuo lanzar otra moneda al aire (con probabilidad pm cae cara).
  9. Si cae cara cambiar el bit en turno por su complemento.
  10. Si cae cruz el bit permanece inalterado.
  11. Incluir a los dos nuevos individuos en una nueva población.
  12. Si la nueva población tiene ya N individuos, llamarla población actual y regresar al paso 3, a menos que se cumpla alguna condición de terminación.
  13. Si no, regresar al paso 4.
En el algoritmo se utiliza el término "lanzar una moneda al aire" para decir un experimento de Bernoulli (aquel en el que pueden ocurrir exclusivamente dos eventos posibles, uno con probabilidad p y otro con probabilidad 1-p). Es decir, el lanzamiento de una moneda "extraña" en la que no necesariamente ambas caras son equiprobables.

La condición de terminación, a la que se hace referencia en el paseo 12, puede definirse de muchas maneras. Se puede fijar un número máximo de generaciones que se pretende ejecutar el algoritmo, o puede decidirse hacer alto cuando la mayoría de la población, digamos el %85, tenga una calificación que este dentro de 0.6 desviaciones estándar de la media. En fin, opciones hay muchas. Generalmente depende del problema o de las preferencias personales la decisión acerca de cuándo es conveniente detenerse.