diff --git a/3d_monster_jail/3d_monster_jail.lua b/3d_monster_jail/3d_monster_jail.lua index a6c2cc6..736afd9 100644 --- a/3d_monster_jail/3d_monster_jail.lua +++ b/3d_monster_jail/3d_monster_jail.lua @@ -12,7 +12,7 @@ malos = {{ x = 0, y = 0, velocitat = 0, - dx = 0, + dx = -1, dy = 0 }, { x = 0, @@ -56,89 +56,83 @@ end function update() rellotge = rellotge + 1 mou_jugador() + mou_malos() pinta_laberinto() pinta_jugador() pinta_malos() + print(malos[1].dx, 0, 0) + print(malos[1].dy, 4, 0) end function crea_laberinto() - -- Rellenalo todo a partir de la primera_fila-1 + -- genera el laberinto + local longitud, inicio for i = 0, 1199 do + -- plena tot de murs a partir de la primera_fila-1 if i < ((primera_fila - 1) * 40) then laberinto[i] = 0x20 - -- laberinto[i] = 0xD8 else laberinto[i] = 0x8F end end - -- Pon camino en la primera y última fila + -- posa cami en la primera i última fila for i = primera_columna, ultima_columna do laberinto[(40 * primera_fila) + i] = 0x20 laberinto[(40 * ultima_fila) + i] = 0x20 end - -- Pon camino en la primera y última columna + -- posa cami en la primera i última columna for i = primera_fila, ultima_fila do laberinto[(40 * i) + primera_columna] = 0x20 laberinto[(40 * i) + ultima_columna] = 0x20 end - -- Crea filas aleatorios - i = primera_fila - while i < ultima_fila - 1 do + -- crea filas aleatories + local fila = primera_fila + while fila < ultima_fila - 1 do if rnd(10) % 10 > 4 then - -- 60% de probabilidad de pintar la fila entera + -- 60% de probabilitat de pintar la fila sencera for j = primera_columna, ultima_columna do - laberinto[(40 * i) + j] = 0x20 + laberinto[(40 * fila) + j] = 0x20 end else - -- 40% de probabilidad de pintar solo un segmento + -- 40% de probabilitat de pintar sols un segment longitud = max(15, rnd(ultima_columna - primera_columna) + 1) - -- ink(0) - -- print(i, 0, i) inicio = rnd(ultima_columna - longitud) + primera_columna for j = 1, longitud do - laberinto[(40 * i) + j + inicio] = 0x20 - -- print("X", j + inicio, i + 1) + laberinto[(40 * fila) + j + inicio] = 0x20 end - -- print(inicio, 5, i) - -- print(longitud, 10, i) end - i = i + rnd(3) + 3 + fila = fila + rnd(3) + 3 end - -- Crea columnas aleatorias - i = primera_columna - while i < ultima_columna - 1 do + -- crea columnas aleatories + local columna = primera_columna + while columna < ultima_columna - 1 do if rnd(10) % 10 > 4 then - -- 60% de probabilidad de pintar la columna entera + -- 60% de probabilitat de pintar la columna sencera for j = primera_fila, ultima_fila do - laberinto[(40 * j) + i] = 0x20 + laberinto[(40 * j) + columna] = 0x20 end else - -- 40% de probabilidad de pintar solo un segmento + -- 40% de probabilitat de pintar sols un segment longitud = max(5, rnd(ultima_fila - primera_fila) + 1) - -- ink(0) - -- print(i, i, 0) inicio = rnd(ultima_fila - longitud) + primera_fila - 1 for j = 1, longitud do - laberinto[(40 * (j + inicio)) + i] = 0x20 - -- print("X", i, j + inicio) + laberinto[(40 * (j + inicio)) + columna] = 0x20 end - -- print(inicio, i, 1) - -- print(longitud, i, 2) - -- print(longitud + inicio, i, 3) end - i = i + rnd(2) + 2 + columna = columna + rnd(2) + 2 end end function pinta_laberinto() + -- pinta el laberinto en pantalla for i = 0, 1199 do ink(10) print(chr(laberinto[i]), i % 40, flr(i / 40)) - -- Crea el efecto 3D pintando un caracter encima + -- crea el efecto 3D pintant un caracter per damunt if laberinto[i] == 0x8F then -- color(15,10) -- print(chr(0xCF), i % 40, flr(i / 40)-1) @@ -153,6 +147,7 @@ function pinta_jugador() end function mou_jugador() + -- mou el jugador a la nova ubicacio en funció de les tecles apretades if jugador.velocitat == 0 then if btn(KEY_UP) then coloca_jugador(jugador.x, jugador.y - 1) @@ -165,13 +160,12 @@ function mou_jugador() coloca_jugador(jugador.x + 1, jugador.y) end else - -- if jugador.velocitat > 0 then jugador.velocitat = jugador.velocitat - 1 - -- end end end function coloca_jugador(x, y) + -- coloca el jugador en el punt x, y en cas de que siga una casella válida if laberinto[y * 40 + x] == 0x20 then jugador.x = x jugador.y = y @@ -180,6 +174,7 @@ function coloca_jugador(x, y) end function pinta_malos() + -- pina els malos en pantalla ink(4) for i = 1, num_malos do print(chr(0x07), malos[i].x, malos[i].y) @@ -187,10 +182,78 @@ function pinta_malos() end function crea_malos() + -- inicialitza el vector de malos for i = 1, num_malos do malos[i].x = ultima_columna malos[i].y = primera_fila - malos[i].dx = 0 + malos[i].dx = -1 malos[i].dy = 0 + pensa_malo(i) end end + +function mou_malos() + -- mou tots els malos a la nova ubicacio en funció de la seua direcció + 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 + pensa_malo(i) + end + else + malos[i].velocitat = malos[i].velocitat - 1 + end + end +end + +function coloca_malo(num, x, y) + -- coloca el malo en el punt x, y en cas de que siga una casella válida + if laberinto[y * 40 + x] == 0x20 then + malos[num].x = x + malos[num].y = y + malos[num].velocitat = 16 + end +end + +function pensa_malo(num) + -- el malo calcula la direcció que ha de pendre per anar cap al jugador + if malos[num].x > jugador.x then + malos[num].dx = -1 + else + if malos[num].x < jugador.x then + malos[num].dx = 1 + 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 + +end + +function num_eixides_mapa(x, y) + -- torna el numero de caselles amb cami que hi ha al voltant del punt x, y + local eixides = 0 + if laberinto[y * 40 + x + 1] == 0x20 then + eixides = eixides + 1 + end + if laberinto[y * 40 + x - 1] == 0x20 then + eixides = eixides + 1 + end + if laberinto[(y + 1) * 40 + x] == 0x20 then + eixides = eixides + 1 + end + if laberinto[(y - 1) * 40 + x] == 0x20 then + eixides = eixides + 1 + end + return eixides +end +