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