+ All Categories

Clase2

Date post: 07-Jul-2015
Category:
Upload: jorge-gamez
View: 564 times
Download: 1 times
Share this document with a friend
48
www.unaj.edu.ar Algoritmos y Programación Clase 2: Repaso PyGame - Recursión
Transcript
Page 1: Clase2

www.unaj.edu.ar

Algoritmos y Programación

Clase 2:

Repaso PyGame - Recursión

Page 2: Clase2

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.

Page 3: Clase2

www.unaj.edu.ar

Algoritmos y Programación

Repaso: PyGame

Page 4: Clase2

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/

Page 5: Clase2

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 *

Page 6: Clase2

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')

Page 7: Clase2

www.unaj.edu.ar

Algoritmos y Programación

Ventanas

Page 8: Clase2

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

Page 9: Clase2

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?

Page 10: Clase2

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

Page 11: Clase2

www.unaj.edu.ar

Algoritmos y Programación

¿Nos vamos al espacio?

Page 12: Clase2

www.unaj.edu.ar

Algoritmos y Programación

Eventos

El manejo de eventos está sólo aquí (QUIT)

Page 13: Clase2

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.

Page 14: Clase2

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

Page 15: Clase2

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.

Page 16: Clase2

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

Page 17: Clase2

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

Page 18: Clase2

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)))

Page 19: Clase2

www.unaj.edu.ar

Algoritmos y Programación

Recursion

Page 20: Clase2

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.

Page 21: Clase2

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.

Page 22: Clase2

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.

Page 23: Clase2

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.

Page 24: Clase2

www.unaj.edu.ar

Algoritmos y Programación

Ejecución

Resultado de ejecutar la función recursiva enviandole como parametro el numero 3.

Page 25: Clase2

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

Page 26: Clase2

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

Page 27: Clase2

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

Page 28: Clase2

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.

Page 29: Clase2

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

Page 30: Clase2

www.unaj.edu.ar

Algoritmos y Programación

Pila de Ejecución••

Finaliza la ejecución del programa.

Page 31: Clase2

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.

Page 32: Clase2

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.

Page 33: Clase2

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.

Page 34: Clase2

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

Page 35: Clase2

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.

Page 36: Clase2

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].

Page 37: Clase2

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].

Page 38: Clase2

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].

Page 39: Clase2

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].

Page 40: Clase2

www.unaj.edu.ar

Algoritmos y Programación

Ejemplo con backtracking

Finaliza el programa e imprime como resultado (2, [4,3])

Page 41: Clase2

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.

Page 42: Clase2

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.

Page 43: Clase2

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:

Page 44: Clase2

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.

Page 45: Clase2

www.unaj.edu.ar

Algoritmos y Programación

Versiones del Factorial

Versión Iterativa Versión Recursiva

Page 46: Clase2

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.

Page 47: Clase2

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.

Page 48: Clase2

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.


Recommended