From 2cf9dd1921a412b09532cd78259e238da1c05802 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sergio=20Valor=20Mart=C3=ADnez?= Date: Tue, 18 Oct 2022 20:10:53 +0200 Subject: [PATCH] Actualizado 3d_monster_jail --- 3d_monster_jail/3d_monster_jail.lua | 137 ++++++++++++++++++++++++---- 1 file changed, 118 insertions(+), 19 deletions(-) diff --git a/3d_monster_jail/3d_monster_jail.lua b/3d_monster_jail/3d_monster_jail.lua index 736afd9..fdc2c91 100644 --- a/3d_monster_jail/3d_monster_jail.lua +++ b/3d_monster_jail/3d_monster_jail.lua @@ -13,31 +13,36 @@ malos = {{ y = 0, velocitat = 0, dx = -1, - dy = 0 + dy = 0, + carrero_sense_sortida = 0 }, { x = 0, y = 0, velocitat = 0, dx = 0, - dy = 0 + dy = 0, + carrero_sense_sortida = 0 }, { x = 0, y = 0, velocitat = 0, dx = 0, - dy = 0 + dy = 0, + carrero_sense_sortida = 0 }, { x = 0, y = 0, velocitat = 0, dx = 0, - dy = 0 + dy = 0, + carrero_sense_sortida = 0 }, { x = 0, y = 0, velocitat = 0, dx = 0, - dy = 0 + dy = 0, + carrero_sense_sortida = 0 }} rellotge = 0 num_malos = 1 @@ -197,7 +202,11 @@ function mou_malos() for i = 1, num_malos do if malos[i].velocitat == 0 then coloca_malo(i, malos[i].x + malos[i].dx, malos[i].y + malos[i].dy) - if num_eixides_mapa(malos[i].x, malos[i].y) > 2 then + -- if num_eixides_mapa(malos[i].x, malos[i].y) > 2 then + -- Si hi ha cami dalt o baix i a la esquerra o dreta, es a dir, + -- si hi ha cami tant vertical com horitzontal al voltant del + -- malo, recalcula cap on toca anar + if cami_vertical(malos[i].x, malos[i].y) and cami_horitzontal(malos[i].x, malos[i].y) then pensa_malo(i) end else @@ -208,34 +217,98 @@ end function coloca_malo(num, x, y) -- coloca el malo en el punt x, y en cas de que siga una casella válida + local exito if laberinto[y * 40 + x] == 0x20 then malos[num].x = x malos[num].y = y malos[num].velocitat = 16 + exito = 1 + else -- en aquest cas, havem arribat al final de un carrero sense sortida + exito = 0 + -- pensa_malo(num) + malos[i].carrero_sense_sortida = 1 + malos[num].dx = malos[num].dx * -1 + malos[num].dy = malos[num].dy * -1 end + return exito end function pensa_malo(num) + -- el malo pensara de la següent manera. Quan arriba a un encreuament ha de triar + -- una de les quatre direccions posibles valorant la idoneitat de cada una en funcio de la + -- distancia i de si ha de desfer cami. Despres començarà per la mes idonea per vore si te + -- cami en eixa direcció i passarà a la següent en cas contrari. També pot donar-se el cas + -- de que no vullga una de les opcions perque està eixint de un cami sense sortida + + -- primer guarda la direccio que tenia el malo per si la necesitem mes endavant + local ultim_dx = malos[num].dx + local ultim_dy = malos[num].dy + -- posa a cero totes les direccions + malos[num].dx = 0 + malos[num].dy = 0 + + -- esta funcio calcula la distancia entre dos punts + function calcula_distancia(x1, y1, x2, y2) + local dist + dist = abs(x2 - x1) + abs(y2 - y1) + return dist + end + + -- valora quin es el millor cami (N,S,E,O) + local N = calcula_distancia(jugador.x, jugador.y, malos[num].x, malos[num].y - 1) + local S = calcula_distancia(jugador.x, jugador.y, malos[num].x, malos[num].y + 1) + local E = calcula_distancia(jugador.x, jugador.y, malos[num].x - 1, malos[num].y) + local O = calcula_distancia(jugador.x, jugador.y, malos[num].x + 1, malos[num].y) + + local opcions = {N, S, E, O} + table.sort(opcions) + + local opcio = 1 + while (true) do + if opcio == 5 or fer(opcions[opcio]) == true then + break + end + opcio = opcio + 1 + end + -- el malo calcula la direcció que ha de pendre per anar cap al jugador - if malos[num].x > jugador.x then + -- sempre i quan hi haja cami + + if malos[num].x > jugador.x and es_cami(malos[num].x - 1, malos[num].y) then malos[num].dx = -1 - else - if malos[num].x < jugador.x then - malos[num].dx = 1 + end + + if malos[num].x < jugador.x and es_cami(malos[num].x + 1, malos[num].y) then + malos[num].dx = 1 + end + + if malos[num].y > jugador.y and es_cami(malos[num].x, malos[num].y - 1) then + malos[num].dy = -1 + end + + if malos[num].y < jugador.y and es_cami(malos[num].x, malos[num].y + 1) then + malos[num].dy = 1 + end + + -- el malo soles pot moures en un eix, per tant en cas de que intente moure's en els dos, + -- s'ha de decidir en quin es millor + + -- per altra banda, si tornem de un carreró sense sortida segur que arribem a un encreuament + -- amb sortides en els dos eixos + + -- per tant, si el malo arriba a un encreuament tria un dels dos camins i si ve d'un carreró + -- ha de obviar el cami d'on ve + + if malos[num].dx ~= 0 and malos[num].dy ~= 0 then + -- si la distancia en x es major que en y, mantenim el moviment en x + if abs(malos[num].x - jugador.x) > abs(malos[num].y - jugador.y) then + malos[num].dy = 0 else malos[num].dx = 0 end end - if malos[num].y > jugador.y then - malos[num].dy = -1 - else - if malos[num].y < jugador.y then - malos[num].dy = 1 - else - malos[num].dy = 0 - end - end + -- si el malo ve de un carrero sense sortida end @@ -257,3 +330,29 @@ function num_eixides_mapa(x, y) return eixides end +function es_cami(x, y) + -- torna vertader si en eixa coordenada hi ha cami + if laberinto[y * 40 + x] == 0x20 then + return true + else + return false + end +end + +function cami_vertical(x, y) + -- torna vertader si hi ha cami dalt o baix + if es_cami(x, y - 1) or es_cami(x, y + 1) then + return true + else + return false + end +end + +function cami_horitzontal(x, y) + -- torna vertader si hi ha cami dalt o baix + if es_cami(x + 1, y) or es_cami(x - 1, y) then + return true + else + return false + end +end