diff --git a/README.md b/README.md index 65213fe..f4a423d 100644 --- a/README.md +++ b/README.md @@ -1,29 +1,29 @@ -# Catacumbas +# Pac-Man #### Belén Gamero García y Edgar López Hernández ## Objetivos · El objetivo de este proyecto es la creación de un juego de mesa en entorno texto mediante la cooperación del equipo de desarrollo. -· El juego escogido es una Aventura Gráfica llamada "*Catacumbas*" que consta con Enemigos, Botines, Acertijos, Objetos especiales y Portales, donde el jugador consta de un inventario. +·El juego escogido es "pac-man" que contiene laberintos donde debe comer puntos pequeños, puntos mayores y otros premios con forma de frutas y otros objetos. +El objetivo del personaje es comer todos los puntos de la pantalla, momento en el que se pasa al siguiente nivel o pantalla. Sin embargo, cuatro fantasmas recorren el laberinto para intentar capturar a Pac-Man. Estos fantasmas son, respectivamente, de colores rojo, rosa, cian y naranja. ## Planificación -· El desarrollo del proyecto se dividirá en cuatro fases, la fase de investigación y desarrollo conceptual, la fase de traslado en entornos de programa, la fase de codificación y creación de funciones, y finalmente la fase de pruebas y corrección de errores. +· El desarrollo del proyecto se dividirá en cuatro fases, la fase de investigación y desarrollo conceptual, la fase de traslado en entornos de programa, la fase de codificación y creación de funciones, y finalmente la fase de pruebas y corrección de errores, que de esta ultima fase (pruebas y errores) no introducimos nada por que no sabiamos que poner en especifico. ### IDC (Investigación y desarrollo conceptual) -· En esta fase procedemos a buscar información sobre el funcionamiento básico del juego, teniendo en cuenta que este proyecto fue creado desde 0 nos basamos un poco en la idea esencial de la saga de juegos comúnmente conocida ***Zelda***, nos basamos en la idea de crear un mapa en el cual se encuentran ciertos enemigos y ciertas recompensas para el jugador. - +· En esta fase procedemos a buscar información sobre el funcionamiento básico del juego, despues de un tiempo nos dimos cuenta de que se nos complicaba la idea original. +Decidimos investigar otras ideas y nos inclinamos más por el juego "Pac-Man" e intentamos mantener la idea del juego original. + +· En el código importaremos lo siguiente + +#### "freegames" +``` +python -m pip install freegames +``` ### TEP (Traslado a entorno de programa) -???? · Seguidamente, se creará el pseudocódigo y este deberá modificarse para adaptarse al lenguaje de programación en cuestión, en este caso Python 3, para ello se recogerán todos los requisitos redactadas y se pasarán a un lenguaje más técnico describiendo qué función interna llevarán a cabo sobre el programa principal. ### CCF (Codificación y creación de funciones) -???? -· En esta fase es donde se creará el código de la aplicación, es una de las fases más importantes y duraderas del proyecto, en está se creará un archivo principal que recogerá todas las funciones relacionadas con el juego y su estructura. En otros dos archivos aparte se irán desarrollando en paralelo distintos menús o subprocesos que finalmente se fusionarán en el archivo principal mediante una adaptación de las variables y valores para que todo encaje correctamente. - -### PCE (Pruebas y corrección de errores) -???? - -## Diseño del Mapa -![imagen mapa](https://user-images.githubusercontent.com/91567318/212129973-94195d63-5096-49d6-b043-5be997ca3225.png) +· En esta fase es donde se creará el código de la aplicación, es una de las fases más importantes y duraderas del proyecto, en está se creará un archivo principal (pacman.py) que recogerá todas las funciones relacionadas con el juego y su estructura. --- diff --git a/pacman/main.py b/pacman/main.py new file mode 100644 index 0000000..b1f412d --- /dev/null +++ b/pacman/main.py @@ -0,0 +1,174 @@ +"""Pacman""" + + +from random import choice +from turtle import * + +from freegames import floor, vector + +puntos = {'puntuacion': 0} #Puntuación del usuario. +camino = Turtle(visible=False) #Caminos del mapa. +movimiento = Turtle(visible=False) #Movimientos del pacman y de los fantasmas +aim = vector(5, 0) #Apuntado +pacman = vector(-40, -80) #Posicion inicial del pacman + +#Posicion inicial fantasmas +ghosts = [ + [vector(-180, 160), vector(5, 0)], + [vector(-180, -160), vector(0, 5)], + [vector(100, 160), vector(0, -5)], + [vector(100, -160), vector(-5, 0)], +] +#Mapa +casillas = [ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, + 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, + 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, + 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 0, 0, + 0, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, + 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 1, 0, 0, 1, 0, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 0, 1, 0, 0, 1, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 0, 0, + 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, + 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, + 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, + 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, + 0, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, + 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, + 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +] +# fmt: on + + +def cuadado(x, y): + """Dibuja un cuadrado usando la ruta en (x, y).""" + camino.up() + camino.goto(x, y) + camino.down() + camino.begin_fill() + + for count in range(4): + camino.forward(20) + camino.left(90) + + camino.end_fill() + + +def desplazamiento(point): + """Devuelve el desplazamiento del punto en casillas.""" + x = (floor(point.x, 20) + 200) / 20 + y = (180 - floor(point.y, 20)) / 20 + index = int(x + y * 20) + return index + + +def validador(point): + """Devuelve True si el punto es válido en casillas.""" + index = desplazamiento(point) + + if casillas[index] == 0: + return False + + index = desplazamiento(point + 19) + + if casillas[index] == 0: + return False + + return point.x % 20 == 0 or point.y % 20 == 0 + + +def mapeado(): + """Dibuja el mapa usando la ruta.""" + bgcolor('black') + camino.color('blue') + + for index in range(len(casillas)): + tile = casillas[index] + + if tile > 0: + x = (index % 20) * 20 - 200 + y = 180 - (index // 20) * 20 + cuadado(x, y) + + if tile == 1: + camino.up() + camino.goto(x + 10, y + 10) + camino.dot(2, 'white') + + +def move(): + """Mueve pacman y todos los fantasmas.""" + movimiento.undo() + movimiento.write(puntos['puntuacion']) + + clear() + + if validador(pacman + aim): + pacman.move(aim) + + index = desplazamiento(pacman) + + if casillas[index] == 1: + casillas[index] = 2 + puntos['puntuacion'] += 1 + x = (index % 20) * 20 - 200 + y = 180 - (index // 20) * 20 + cuadado(x, y) + + up() + goto(pacman.x + 10, pacman.y + 10) + dot(20, 'yellow') + + for point, course in ghosts: + if validador(point + course): + point.move(course) + else: + options = [ + vector(5, 0), + vector(-5, 0), + vector(0, 5), + vector(0, -5), + ] + plan = choice(options) + course.x = plan.x + course.y = plan.y + + up() + goto(point.x + 10, point.y + 10) + dot(20, 'red') + + update() + + for point, course in ghosts: + if abs(pacman - point) < 20: + return + + ontimer(move, 100) + + +def cambiar(x, y): + """Change pacman aim if valid.""" + if validador(pacman + vector(x, y)): + aim.x = x + aim.y = y + + +setup(420, 420, 370, 0) +hideturtle() +tracer(False) +movimiento.goto(160, 160) +movimiento.color('white') +movimiento.write(puntos['puntuacion']) +listen() +onkey(lambda: cambiar(5, 0), 'Right') +onkey(lambda: cambiar(-5, 0), 'Left') +onkey(lambda: cambiar(0, 5), 'Up') +onkey(lambda: cambiar(0, -5), 'Down') +mapeado() +move() +done()