Este documento presenta una clase sobre algoritmos y programación que incluye un repaso de PyGame y una introducción a la recursión. El temario cubre funciones básicas de PyGame, animaciones, manejo de eventos, definición de recursión, pila de ejecución, backtracking y diferencias entre recursión e iteración. Se proveen ejemplos de código para ilustrar conceptos como manejo de eventos, carga de imágenes, y resolución de problemas mediante recursión y backtracking.
4. 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
5. 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 pygame
import pygame
import os
import os
Import sys
Import sys
from pygame.locals import **
from pygame.locals import
www.unaj.edu.ar
6. Algoritmos y Programación
Inicialización
• Luego de importar las librerías, hay que inicializar
el módulo:
pygame.init()
pygame.init()
• ¿Abrimos una ventana?
ventana = pygame.display.set_mode((ancho,alto))
ventana = pygame.display.set_mode((ancho,alto))
pygame.display.set_caption(‘TítuloVentana')
pygame.display.set_caption(‘TítuloVentana')
www.unaj.edu.ar
8. Algoritmos y Programación
El módulo Draw
• Permite trabajar con las siguientes formas:
rect polygon circle
rect polygon circle ellipse arc
ellipse arc
line lines
line lines aaline
aaline aalines
aalines
• 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 RGB.
www.unaj.edu.ar
9. 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
10. Algoritmos y Programación
Imagenes en PyGame
Cargando imágenes ...
• pygame.image.load(filename): return Surface
• pygame.image.save(Surface, filename): return None
www.unaj.edu.ar
13. Algoritmos y Programación
Manejo de Eventos
import pygame, sys, os
from pygame.locals import *
.
.
.
.
while True:
events=pygame.event.get()
for event in events: Este bucle sencillo ejecuta el
if event.type == QUIT: programa hasta que el evento
pygame.quit() QUIT se produzca.
sys.exit()
www.unaj.edu.ar
14. Algoritmos y Programación
Manejo de Eventos
Existe 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
15. Algoritmos y Programación
Manejo de Eventos
Event.type:
Eventos relacionados al mouse:
MOUSEMOTION – MOUSEBUTTONUP – MOUSEBUTTONDOWN -
Eventos relacionados al teclado:
KEYDOWN – KEYUP
Eventos relacionados al Joystick
JOYAXISMOTION – JOYBALLMOTION – JOYHATMOTION -
JOYBUTTONUP - JOYBUTTONDOWN
Eventos generales
QUIT – ACTIVEEVENT - VIDEORESIZE - VIDEOEXPOSE
Se pueden generar eventos definidos por el usuario.
www.unaj.edu.ar
16. 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 / etc
event.key: código tecla
Muestro las imágenes y
actualizo el rectángulo que
contiene al cohete
www.unaj.edu.ar
17. Algoritmos y Programación
Resumiendo Evento atributos
QUIT none
Resumiendo...
ACTIVEEVENT gain, state
pygame.event.get() o KEYDOWN unicode, key, mod
pygame.event.poll() KEYUP key, mod
en un loop .... MOUSEMOTION pos, rel, buttons
event.type MOUSEBUTTONUP pos, button
Dependiendo del MOUSEBUTTONDOWN pos, button
evento: 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
18. 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
20. 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
21. 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
22. 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
23. 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
24. Algoritmos y Programación
Ejecución
Resultado de ejecutar la función recursiva
enviandole como parametro el numero 3.
www.unaj.edu.ar
25. Algoritmos y Programación
Pila de Ejecución
Imprime 3 en la consola y
realiza un llamado
recursivo con n-1=3-1=2
cuenta_atras
n=3
www.unaj.edu.ar
26. Algoritmos y Programación
Pila de Ejecución
Imprime 2 en la consola
y realiza un llamado
recursivo con n-1=2-1=1
cuenta_atras
n=2
cuenta_atras
n=3
www.unaj.edu.ar
27. Algoritmos y Programación
Pila de Ejecución
cuenta_atras
Imprime 1 en la consola n=1
y realiza un llamado
recursivo con n-1=1-1=0
cuenta_atras
n=2
cuenta_atras
n=3
www.unaj.edu.ar
28. Algoritmos y Programación cuenta_atras
n=0
Pila de Ejecución
cuenta_atras
Imprime “Fin!” y termina la funcion. n=1
cuenta_atras
n=2
cuenta_atras
n=3
www.unaj.edu.ar
29. Algoritmos y Programación cuenta_atras
n=0
Pila de Ejecución
cuenta_atras
Cuando concluye el llamado
•
recursivo la ejecucion se retoma en
este punto n=1
•
cuenta_atras
n=2
cuenta_atras
n=3
www.unaj.edu.ar
31. 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
32. 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
33. 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
35. Algoritmos y Programación
mayores_al_promedio mayores_al_promedio
Ejemplo con backtracking
lista=[] lista=[4]
Retorna una tupla con el suma_total=10
promedio suma_total=6
y una lista vacia. cantidad=4 cantidad=3
mayores_al_promedio
lista=[3,4]
suma_total=3
cantidad=2
mayores_al_promedio
lista=[2,3,4]
suma_total=1
cantidad=1
mayores_al_promedio
lista=[1,2,3,4]
suma_total=0
cantidad=0
www.unaj.edu.ar
36. Algoritmos y Programación
mayores_al_promedio
Ejemplo con backtracking lista=[4]
suma_total=6
cantidad=3
Cuando concluye el llamado mayores_al_promedio
recursivo la ejecucion se retoma en
lista=[3,4]
este punto
suma_total=3
cantidad=2
mayores_al_promedio
lista=[2,3,4]
Retorna una tupla con el promedio suma_total=1
y la lista [4]. cantidad=1
mayores_al_promedio
lista=[1,2,3,4]
suma_total=0
cantidad=0
www.unaj.edu.ar
37. Algoritmos y Programación
Ejemplo con backtracking
Cuando concluye el llamado mayores_al_promedio
recursivo la ejecucion se retoma en
lista=[3,4]
este punto
suma_total=3
cantidad=2
mayores_al_promedio
lista=[2,3,4]
Retorna una tupla con el promedio suma_total=1
y la lista [4].
[4,3]. cantidad=1
mayores_al_promedio
lista=[1,2,3,4]
suma_total=0
cantidad=0
www.unaj.edu.ar
38. Algoritmos y Programación
Ejemplo con backtracking
Cuando concluye el llamado
recursivo la ejecucion se retoma en
este punto
mayores_al_promedio
lista=[2,3,4]
Retorna una tupla con el promedio suma_total=1
y la lista [4].
[4,3]. cantidad=1
mayores_al_promedio
lista=[1,2,3,4]
suma_total=0
cantidad=0
www.unaj.edu.ar
39. Algoritmos y Programación
Ejemplo con backtracking
Cuando concluye el llamado
recursivo la ejecucion se retoma en
este punto
Retorna una tupla con el promedio
y la lista [4].
[4,3].
mayores_al_promedio
lista=[1,2,3,4]
suma_total=0
cantidad=0
www.unaj.edu.ar
41. 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
42. Algoritmos y Programación
Ejemplos
Ejemplo de una función que al no
definir un caso base y ser
def recurre(): invocada, esta no finaliza nunca.
recurre()
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
43. 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
44. 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
45. Algoritmos y Programación
Versiones del Factorial
Versión Iterativa Versión Recursiva
www.unaj.edu.ar
46. 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
47. 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
48. 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.
www.unaj.edu.ar