Date post: | 07-Jul-2015 |
Category: |
Documents |
Upload: | jorge-gamez |
View: | 564 times |
Download: | 1 times |
www.unaj.edu.ar
Algoritmos y Programación
Clase 2:
Repaso PyGame - Recursión
www.unaj.edu.ar
Algoritmos y Programación
Temario• Repaso de PyGame
– Funciones básicas– Animaciones y Juegos sencillos– Manejo de eventos
• Recursión– Definicion de Recursion.– Pila de Ejecucion.– Backtracking– Recursion infinita.– Recursion vs Iteracion.
www.unaj.edu.ar
Algoritmos y Programación
Repaso: PyGame
www.unaj.edu.ar
Algoritmos y Programación
¿Qué es PyGame?• PyGame es un conjunto de módulos
escritos en Python diseñados para escribir juegos en dos dimensiones.
• Incluye gráficos y bibliotecas de sonido diseñadas para ser utilizadas directamente bajo Python.
• No es nuevo: desde año 2000...• Es portable y libre. • Url: http://www.pygame.org/
www.unaj.edu.ar
Algoritmos y Programación
Modulos PyGame• Vamos a ver primero algunos módulos para
realizar gráficos sencillos.– Cómo crear una ventana y dibujar luego en ella.
• PyGame provee varios módulos para representar líneas, polígonos, círculos, etc.
• Para utilizarlos, debemos importar la librería PyGame y otras más que serán necesarias:
import pygameimport osImport sysfrom pygame.locals import *
import pygameimport osImport sysfrom pygame.locals import *
www.unaj.edu.ar
Algoritmos y Programación
Inicialización• Luego de importar las librerías, hay que inicializar
el módulo:
• ¿Abrimos una ventana?
pygame.init()pygame.init()
ventana = pygame.display.set_mode((ancho,alto))pygame.display.set_caption(‘TítuloVentana')
ventana = pygame.display.set_mode((ancho,alto))pygame.display.set_caption(‘TítuloVentana')
www.unaj.edu.ar
Algoritmos y Programación
Ventanas
www.unaj.edu.ar
Algoritmos y Programación
El módulo Draw• Permite trabajar con las siguientes formas:
• Los dibujos se realizan sobre una superficie y todas las funciones de dibujo se limitan al área de recorte para esa superficie.
• Generalmente las funciones contienen un argumento width que representa el tamaño del borde del dibujo. Si tiene valor 0, la función pintará la figura entera como sólida.
• La mayoría de las funciones aceptan un argumento color, que en general es una terna o tupla RGBRGB. .
rect polygon circle ellipse arcline lines aaline aalinesrect polygon circle ellipse arcline lines aaline aalines
www.unaj.edu.ar
Algoritmos y Programación
¿Y estas funciones?• ¿Se acuerdan?
– copy(): Realizamos una copia de la superficie. En este caso, de la ventana
– blit(): Nos permite representar un objeto sobre una superficie.
• ¿Para qué las usábamos?
www.unaj.edu.ar
Algoritmos y Programación
Imagenes en PyGameCargando imágenes ...• pygame.image.load(filename): return Surface• pygame.image.save(Surface, filename): return None
www.unaj.edu.ar
Algoritmos y Programación
¿Nos vamos al espacio?
www.unaj.edu.ar
Algoritmos y Programación
Eventos
El manejo de eventos está sólo aquí (QUIT)
www.unaj.edu.ar
Algoritmos y Programación
Manejo de Eventosimport pygame, sys, osfrom pygame.locals import *....
while True: events=pygame.event.get() for event in events: if event.type == QUIT: pygame.quit() sys.exit()
Este bucle sencillo ejecuta el programa hasta que el evento QUIT se produzca.
www.unaj.edu.ar
Algoritmos y Programación
Manejo de EventosExiste un módulo especial para manejar eventos.Los eventos se manejan a través de una cola de eventos.Se manejan como objetos que contienen un tipo de evento y un conjunto de datos de sólo lectura.Funciones get y poll: Obtienen eventos de la cola y los elimina.
• pygame.event.get(): return EventList• pygame.event.poll(): return Event
www.unaj.edu.ar
Algoritmos y Programación
Manejo de EventosEvent.type:
Eventos relacionados al mouse:MOUSEMOTION – MOUSEBUTTONUP – MOUSEBUTTONDOWN -
Eventos relacionados al teclado:KEYDOWN – KEYUP
Eventos relacionados al JoystickJOYAXISMOTION – JOYBALLMOTION – JOYHATMOTION - JOYBUTTONUP - JOYBUTTONDOWN
Eventos generales QUIT – ACTIVEEVENT - VIDEORESIZE - VIDEOEXPOSE
Se pueden generar eventos definidos por el usuario.
www.unaj.edu.ar
Algoritmos y Programación
¿Nos vamos al espacio?(parte II)Establecemos la sup a mover
En nuestro caso, el que delimita al cohete
Obtenemos los eventos de la cola de eventos
event.type:KEYDOWN / KEYUP / etcevent.key: código tecla
Muestro las imágenes y actualizo el rectángulo que contiene al cohete
www.unaj.edu.ar
Algoritmos y Programación
Resumiendo Resumiendo...
pygame.event.get() o pygame.event.poll() en un loop ....
event.typeDependiendo del evento:
Evento atributosQUIT none
ACTIVEEVENT gain, state
KEYDOWN unicode, key, mod
KEYUP key, mod
MOUSEMOTION pos, rel, buttons
MOUSEBUTTONUP pos, button
MOUSEBUTTONDOWN pos, button
JOYAXISMOTION joy, axis, value
JOYBALLMOTION joy, ball, rel
JOYHATMOTION joy, hat, value
JOYBUTTONUP joy, button
JOYBUTTONDOWN joy, button
VIDEORESIZE size
VIDEOEXPOSE none
USEREVENT code
www.unaj.edu.ar
Algoritmos y Programación
¿Llegamos a la luna?Textos ... fuente=pygame.font.SysFont(None, 48) texto=fuente.render(' Llegaste! ', True, (255,255,255), (255,0,0)))
www.unaj.edu.ar
Algoritmos y Programación
Recursion
www.unaj.edu.ar
Algoritmos y Programación
Conceptos• La recursión es una técnica de programación muy
poderosa, en la cual una función realiza llamadas a misma en pos de resolver un problema.
• Razones para su uso:– Problemas “casi” irresolubles con las estructuras iterativas.– Soluciones elegantes.– Soluciones más simples.
www.unaj.edu.ar
Algoritmos y Programación
Identificación de casos• En las funciones recursivas bien definidas se
puede identificar dos elementos:– Caso Base: Se da cuando el calculo es tan
simple que se puede resolver directamente sin necesidad de hacer una llamada recursiva.
– Caso Recursivo: aquí la función realiza algunas operaciones con las que se reduce la complejidad del problema y luego realiza un llamado a si misma.
www.unaj.edu.ar
Algoritmos y Programación
Comenzando...
• Codificar una función que tome un parámetro numérico y que cuente hacia atrás comenzando desde el numero ingresado.
www.unaj.edu.ar
Algoritmos y Programación
Resolución en Python
Caso Base: Cuando el parametro es 0, la función imprime “Fin!” y termina.
Caso Recursivo: Cuando el parametro distinto de 0, la función imprime el parametro y vuelve a invocar a la función con el parametro disminuido en 1.
www.unaj.edu.ar
Algoritmos y Programación
Ejecución
Resultado de ejecutar la función recursiva enviandole como parametro el numero 3.
www.unaj.edu.ar
Algoritmos y Programación
Pila de Ejecución
cuenta_atras
n=3
Imprime 3 en la consola y realiza un llamado recursivo con n-1=3-1=2
www.unaj.edu.ar
Algoritmos y Programación
Pila de Ejecución
cuenta_atras
n=3
cuenta_atras
n=2
Imprime 2 en la consola y realiza un llamado recursivo con n-1=2-1=1
www.unaj.edu.ar
Algoritmos y Programación
Pila de Ejecución
cuenta_atras
n=3
cuenta_atras
n=2
cuenta_atras
n=1Imprime 1 en la consola y realiza un llamado recursivo con n-1=1-1=0
www.unaj.edu.ar
Algoritmos y Programación
Pila de Ejecución
cuenta_atras
n=3
cuenta_atras
n=2
cuenta_atras
n=1
cuenta_atras
n=0
Imprime “Fin!” y termina la funcion.
www.unaj.edu.ar
Algoritmos y Programación
Pila de Ejecución••
cuenta_atras
n=3
cuenta_atras
n=2
cuenta_atras
n=1
Cuando concluye el llamado recursivo la ejecucion se retoma en este punto
cuenta_atras
n=0
www.unaj.edu.ar
Algoritmos y Programación
Pila de Ejecución••
Finaliza la ejecución del programa.
www.unaj.edu.ar
Algoritmos y Programación
Backtracking• El backtracking (ó vuelta atrás) es una estrategia
para solucionar problemas utilizando algoritmos recursivos.
• El backtracking va construyendo soluciones parciales a medida que progresa la ejecución del algoritmo recursivo. Estas soluciones parciales van construyendo una solución completa.
www.unaj.edu.ar
Algoritmos y Programación
Backtracking• El algoritmo tiene éxito si, procediendo de esta
forma, se puede encontrar una solución. – En este caso el algoritmo puede bien detenerse (si solo
se necesita una solución) o bien seguir buscando soluciones alternativas (si se necesitan todas).
• Por otra parte, el algoritmo falla si en alguna etapa la solución parcial construida hasta el momento no se puede completar. – En tal caso, el recorrido vuelve atrás eliminando sobre la
marcha los elementos que se hubieran añadido en cada etapa.
•
www.unaj.edu.ar
Algoritmos y Programación
Ejemplo con backtracking
• Codificar una función que tome una lista de números y retorne una tupla en la cual contenga en la primera posición el promedio y en la segunda los números de la lista mayores al promedio.
www.unaj.edu.ar
Algoritmos y Programación
Ejemplo con backtracking
mayores_al_promediolista=[3,4]suma_total=3cantidad=2
mayores_al_promediolista=[4]suma_total=6cantidad=3
mayores_al_promediolista=[]suma_total=10cantidad=4
mayores_al_promediolista=[1,2,3,4]suma_total=0cantidad=0
mayores_al_promediolista=[2,3,4]suma_total=1cantidad=1
www.unaj.edu.ar
Algoritmos y Programación
Ejemplo con backtracking
mayores_al_promediolista=[3,4]suma_total=3cantidad=2
mayores_al_promediolista=[4]suma_total=6cantidad=3
mayores_al_promediolista=[]suma_total=10cantidad=4
mayores_al_promediolista=[1,2,3,4]suma_total=0cantidad=0
mayores_al_promediolista=[2,3,4]suma_total=1cantidad=1
Retorna una tupla con el promedio y una lista vacia.
www.unaj.edu.ar
Algoritmos y Programación
Ejemplo con backtracking
mayores_al_promediolista=[3,4]suma_total=3cantidad=2
mayores_al_promediolista=[4]suma_total=6cantidad=3
mayores_al_promediolista=[1,2,3,4]suma_total=0cantidad=0
mayores_al_promediolista=[2,3,4]suma_total=1cantidad=1
Retorna una tupla con el promedio y la lista [4].
Cuando concluye el llamado recursivo la ejecucion se retoma en este punto
Retorna una tupla con el promedio y la lista [4].
www.unaj.edu.ar
Algoritmos y Programación
Ejemplo con backtracking
mayores_al_promediolista=[3,4]suma_total=3cantidad=2
mayores_al_promediolista=[1,2,3,4]suma_total=0cantidad=0
mayores_al_promediolista=[2,3,4]suma_total=1cantidad=1
Retorna una tupla con el promedio y la lista [4].
Cuando concluye el llamado recursivo la ejecucion se retoma en este punto
Retorna una tupla con el promedio y la lista [4,3].
www.unaj.edu.ar
Algoritmos y Programación
Ejemplo con backtracking
mayores_al_promediolista=[1,2,3,4]suma_total=0cantidad=0
mayores_al_promediolista=[2,3,4]suma_total=1cantidad=1
Retorna una tupla con el promedio y la lista [4].
Cuando concluye el llamado recursivo la ejecucion se retoma en este punto
Retorna una tupla con el promedio y la lista [4,3].
www.unaj.edu.ar
Algoritmos y Programación
Ejemplo con backtracking
mayores_al_promediolista=[1,2,3,4]suma_total=0cantidad=0
Retorna una tupla con el promedio y la lista [4].
Cuando concluye el llamado recursivo la ejecucion se retoma en este punto
Retorna una tupla con el promedio y la lista [4,3].
www.unaj.edu.ar
Algoritmos y Programación
Ejemplo con backtracking
Finaliza el programa e imprime como resultado (2, [4,3])
www.unaj.edu.ar
Algoritmos y Programación
Recursividad infinita• Si una función recursiva no alcanza nunca el caso
base, seguirá haciendo llamadas recursivas para siempre y nunca terminaría. Esta circunstancia se conoce como recursion infinita.
• Un programa con recursividad infinita no se ejecuta realmente para siempre. Python informara con un mensaje de error cuando se alcance el nivel máximo de recursividad.
www.unaj.edu.ar
Algoritmos y Programación
Ejemplos
def recurre(): recurre()
Ejemplo de una función que al no definir un caso base y ser invocada, esta no finaliza nunca.
En este caso se llama a la función con un dato en el parametro que hace que nunca se alcance el caso base.
www.unaj.edu.ar
Algoritmos y Programación
Calculando el factorial• Se necesita un función en Python para calcular el
numero factorial de un numero pasado por parámetro.
• La definición matemática del factorial es la siguiente:
www.unaj.edu.ar
Algoritmos y Programación
Alternativas• Existen dos alternativas para resolver el problema
del calculo del factorial:– Codificar una función iterativa.– Codificar una función recursiva.
www.unaj.edu.ar
Algoritmos y Programación
Versiones del Factorial
Versión Iterativa Versión Recursiva
www.unaj.edu.ar
Algoritmos y Programación
Comparación• Ahora si comparamos las dos alternativas:
– ambas están basadas en una estructura de control.
– ambas involucran repetición.– ambas incluyen una condición para terminar.– Si no se tiene cuidado en ambas se puede
incurrir en un loop infinito.
www.unaj.edu.ar
Algoritmos y Programación
¿Recursión o Iteración?• Ventajas de la Recursión ya conocidas:
– Soluciones simples, claras.– Soluciones elegantes.– Soluciones a problemas complejos.
www.unaj.edu.ar
Algoritmos y Programación
¿Recursión o Iteración?• Desventajas de la Recursión: INEFICIENCIA
– Sobrecarga asociada con las llamadas recursivas, una llamada puede generar un gran numero de llamadas recursivas.(factorial_recursivo(n) genera n llamadas recursivas)
• ¿La claridad compensa la sobrecarga?• El valor de la recursividad reside en el hecho de que
se puede usar para resolver problemas sin fácil solución iterativa.