Actualizado 3d_monster_jail
This commit is contained in:
@@ -13,31 +13,36 @@ malos = {{
|
|||||||
y = 0,
|
y = 0,
|
||||||
velocitat = 0,
|
velocitat = 0,
|
||||||
dx = -1,
|
dx = -1,
|
||||||
dy = 0
|
dy = 0,
|
||||||
|
carrero_sense_sortida = 0
|
||||||
}, {
|
}, {
|
||||||
x = 0,
|
x = 0,
|
||||||
y = 0,
|
y = 0,
|
||||||
velocitat = 0,
|
velocitat = 0,
|
||||||
dx = 0,
|
dx = 0,
|
||||||
dy = 0
|
dy = 0,
|
||||||
|
carrero_sense_sortida = 0
|
||||||
}, {
|
}, {
|
||||||
x = 0,
|
x = 0,
|
||||||
y = 0,
|
y = 0,
|
||||||
velocitat = 0,
|
velocitat = 0,
|
||||||
dx = 0,
|
dx = 0,
|
||||||
dy = 0
|
dy = 0,
|
||||||
|
carrero_sense_sortida = 0
|
||||||
}, {
|
}, {
|
||||||
x = 0,
|
x = 0,
|
||||||
y = 0,
|
y = 0,
|
||||||
velocitat = 0,
|
velocitat = 0,
|
||||||
dx = 0,
|
dx = 0,
|
||||||
dy = 0
|
dy = 0,
|
||||||
|
carrero_sense_sortida = 0
|
||||||
}, {
|
}, {
|
||||||
x = 0,
|
x = 0,
|
||||||
y = 0,
|
y = 0,
|
||||||
velocitat = 0,
|
velocitat = 0,
|
||||||
dx = 0,
|
dx = 0,
|
||||||
dy = 0
|
dy = 0,
|
||||||
|
carrero_sense_sortida = 0
|
||||||
}}
|
}}
|
||||||
rellotge = 0
|
rellotge = 0
|
||||||
num_malos = 1
|
num_malos = 1
|
||||||
@@ -197,7 +202,11 @@ function mou_malos()
|
|||||||
for i = 1, num_malos do
|
for i = 1, num_malos do
|
||||||
if malos[i].velocitat == 0 then
|
if malos[i].velocitat == 0 then
|
||||||
coloca_malo(i, malos[i].x + malos[i].dx, malos[i].y + malos[i].dy)
|
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)
|
pensa_malo(i)
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
@@ -208,34 +217,98 @@ end
|
|||||||
|
|
||||||
function coloca_malo(num, x, y)
|
function coloca_malo(num, x, y)
|
||||||
-- coloca el malo en el punt x, y en cas de que siga una casella válida
|
-- 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
|
if laberinto[y * 40 + x] == 0x20 then
|
||||||
malos[num].x = x
|
malos[num].x = x
|
||||||
malos[num].y = y
|
malos[num].y = y
|
||||||
malos[num].velocitat = 16
|
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
|
end
|
||||||
|
return exito
|
||||||
end
|
end
|
||||||
|
|
||||||
function pensa_malo(num)
|
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
|
-- 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
|
malos[num].dx = -1
|
||||||
else
|
end
|
||||||
if malos[num].x < jugador.x then
|
|
||||||
|
if malos[num].x < jugador.x and es_cami(malos[num].x + 1, malos[num].y) then
|
||||||
malos[num].dx = 1
|
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
|
else
|
||||||
malos[num].dx = 0
|
malos[num].dx = 0
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
if malos[num].y > jugador.y then
|
-- si el malo ve de un carrero sense sortida
|
||||||
malos[num].dy = -1
|
|
||||||
else
|
|
||||||
if malos[num].y < jugador.y then
|
|
||||||
malos[num].dy = 1
|
|
||||||
else
|
|
||||||
malos[num].dy = 0
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -257,3 +330,29 @@ function num_eixides_mapa(x, y)
|
|||||||
return eixides
|
return eixides
|
||||||
end
|
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
|
||||||
|
|||||||
Reference in New Issue
Block a user