Afig joc, recursos i ignora el binari ascii
This commit is contained in:
@@ -0,0 +1,358 @@
|
||||
laberinto = {}
|
||||
primera_fila = 2
|
||||
ultima_fila = 28
|
||||
primera_columna = 1
|
||||
ultima_columna = 38
|
||||
jugador = {
|
||||
x = primera_columna,
|
||||
y = primera_fila,
|
||||
velocitat = 0
|
||||
}
|
||||
malos = {{
|
||||
x = 0,
|
||||
y = 0,
|
||||
velocitat = 0,
|
||||
dx = -1,
|
||||
dy = 0,
|
||||
carrero_sense_sortida = 0
|
||||
}, {
|
||||
x = 0,
|
||||
y = 0,
|
||||
velocitat = 0,
|
||||
dx = 0,
|
||||
dy = 0,
|
||||
carrero_sense_sortida = 0
|
||||
}, {
|
||||
x = 0,
|
||||
y = 0,
|
||||
velocitat = 0,
|
||||
dx = 0,
|
||||
dy = 0,
|
||||
carrero_sense_sortida = 0
|
||||
}, {
|
||||
x = 0,
|
||||
y = 0,
|
||||
velocitat = 0,
|
||||
dx = 0,
|
||||
dy = 0,
|
||||
carrero_sense_sortida = 0
|
||||
}, {
|
||||
x = 0,
|
||||
y = 0,
|
||||
velocitat = 0,
|
||||
dx = 0,
|
||||
dy = 0,
|
||||
carrero_sense_sortida = 0
|
||||
}}
|
||||
rellotge = 0
|
||||
num_malos = 1
|
||||
|
||||
function init()
|
||||
mode(1)
|
||||
color(10, 15, 15)
|
||||
cls()
|
||||
crea_laberinto()
|
||||
pinta_laberinto()
|
||||
crea_malos()
|
||||
-- play("o4v5l1crcl4dcferl1crcl4dcgfr")
|
||||
-- print("hola",0,0)
|
||||
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()
|
||||
-- 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
|
||||
else
|
||||
laberinto[i] = 0x8F
|
||||
end
|
||||
end
|
||||
|
||||
-- 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
|
||||
|
||||
-- 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 aleatories
|
||||
local fila = primera_fila
|
||||
while fila < ultima_fila - 1 do
|
||||
if rnd(10) % 10 > 4 then
|
||||
-- 60% de probabilitat de pintar la fila sencera
|
||||
for j = primera_columna, ultima_columna do
|
||||
laberinto[(40 * fila) + j] = 0x20
|
||||
end
|
||||
else
|
||||
-- 40% de probabilitat de pintar sols un segment
|
||||
longitud = max(15, rnd(ultima_columna - primera_columna) + 1)
|
||||
inicio = rnd(ultima_columna - longitud) + primera_columna
|
||||
for j = 1, longitud do
|
||||
laberinto[(40 * fila) + j + inicio] = 0x20
|
||||
end
|
||||
end
|
||||
fila = fila + rnd(3) + 3
|
||||
end
|
||||
|
||||
-- crea columnas aleatories
|
||||
local columna = primera_columna
|
||||
while columna < ultima_columna - 1 do
|
||||
if rnd(10) % 10 > 4 then
|
||||
-- 60% de probabilitat de pintar la columna sencera
|
||||
for j = primera_fila, ultima_fila do
|
||||
laberinto[(40 * j) + columna] = 0x20
|
||||
end
|
||||
else
|
||||
-- 40% de probabilitat de pintar sols un segment
|
||||
longitud = max(5, rnd(ultima_fila - primera_fila) + 1)
|
||||
inicio = rnd(ultima_fila - longitud) + primera_fila - 1
|
||||
for j = 1, longitud do
|
||||
laberinto[(40 * (j + inicio)) + columna] = 0x20
|
||||
end
|
||||
end
|
||||
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 pintant un caracter per damunt
|
||||
if laberinto[i] == 0x8F then
|
||||
-- color(15,10)
|
||||
-- print(chr(0xCF), i % 40, flr(i / 40)-1)
|
||||
-- print(chr(0xCF), i % 40, flr(i / 40)-2)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
function pinta_jugador()
|
||||
ink(0)
|
||||
print(chr(0xF8), jugador.x, jugador.y)
|
||||
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)
|
||||
elseif btn(KEY_DOWN) then
|
||||
coloca_jugador(jugador.x, jugador.y + 1)
|
||||
end
|
||||
if btn(KEY_LEFT) then
|
||||
coloca_jugador(jugador.x - 1, jugador.y)
|
||||
elseif btn(KEY_RIGHT) then
|
||||
coloca_jugador(jugador.x + 1, jugador.y)
|
||||
end
|
||||
else
|
||||
jugador.velocitat = jugador.velocitat - 1
|
||||
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
|
||||
jugador.velocitat = 8
|
||||
end
|
||||
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)
|
||||
end
|
||||
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 = -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
|
||||
-- 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
|
||||
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
|
||||
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
|
||||
-- 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
|
||||
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
|
||||
|
||||
-- si el malo ve de un carrero sense sortida
|
||||
|
||||
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
|
||||
|
||||
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