Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- local os = require("os")
- local term = require("term")
- local event = require("event")
- local component = require("component")
- local gpu = component.gpu
- math.randomseed(os.time())
- -- приветствие
- term.clear()
- print("Cube v0.2")
- print("")
- print("Target: go to chamber 1")
- print("Game 100% passable")
- print("Press Q at any time to exit game")
- print("Press E to set mark")
- print("Press X to remove mark")
- print("Press Z to back color mark")
- print("Press C to next color mark")
- print("")
- print("press any key to continue...")
- event.pull("key_down")
- local level = {}
- local doors = {}
- local nick_player
- local markColor = {0xff0000, 0xffff00, 0x00ff00, 0x00ffff, 0x0000ff, 0xff00ff, 0xffffff}
- local playerColor = 7
- local sx,sy = gpu.getResolution()
- sx, sy = math.modf(sx/4), math.modf(sy/2) -- точка отступа/координата игрока на экране (статичные)/центр событий
- local px,py = 3,3 -- относительные координаты игрока в комнате
- local min_map, max_map = 1, 1000000 -- ограничители номеров комнат, чтобы сильно не запутаться при прохождении
- level[1] = {number=1, color = 0xffffff} -- цель игры - попасть в эту комнату
- local rand_1, rand_2 ,rand_3, rand_4 = math.random(1,3), math.random(-200,200), math.random(1,3), math.random(-200,200)
- formula={} -- создаём случайные формулы для дверей
- formula[1]=function(n) return n*rand_1 + rand_2 end
- formula[-1]=function(n) return (n - rand_2)/rand_1 end
- formula[2]=function(n) return n*rand_3 - rand_4 end
- formula[-2]=function(n) return (n + rand_4)/rand_3 end
- function gen_level(i)
- if not level[i] then
- level[i]={number=i, color = math.random(0x000000, 0xffffff), mark=false}
- end
- return level[i]
- end
- function proverka(x,y) -- где x номер формулы, y номер текущей комнаты
- local rezerv_4 = formula[x](y)
- return rezerv_4>=min_map and rezerv_4<=max_map and rezerv_4==math.modf(rezerv_4)
- end
- local rezerv_6 = 1 -- начальная комната/текущая, в программном смысле
- local rezerv_7 = -1 -- предыдущая использованная формула
- for i=1, 100 do -- делаем максимум 50 ходов из стартовой комнаты, чтобы запутаться
- local rezerv_10 = rezerv_6
- for j=1, 30 do -- если за 30 попыток не будет перехода, то делаем откат на 1 шаг
- -- подбираем формулу
- local rand = math.random(-2,2)
- if rand ~=0 and rezerv_7 ~= rand and proverka(rand,rezerv_6) then -- проверим не обратная ли это формула
- rezerv_6 = formula[rand](rezerv_6)
- rezerv_7 = -rand
- break
- end
- end
- if rezerv_6 == rezerv_10 then -- если нет изменений то шаг назад
- rezerv_6 = formula[rezerv_7](rezerv_6)
- rezerv_7 = -rezerv_7
- end
- end
- local chamber = gen_level(rezerv_6) -- создаём номер запутанной стартовой комнаты
- function reload_doors() -- переставляет двери в комнате / данная функция достаточно сложна
- local rezerv={}
- for i=1,4 do -- занесём двери в базу данных, чтобы знать использованные формулы
- if doors[i] then
- rezerv[#rezerv+1]=doors[i]
- end
- end
- for i=1,4 do -- перебираем все 4 двери
- if not doors[i] then
- while true do
- local rand = math.random(-2,2)
- local rezerv_2 = 0
- if rand ~= 0 then
- if #rezerv > 0 then -- проверка, есть ли комната с такой же формулой
- for j=1, #rezerv do
- if rezerv[j] == rand then break else rezerv_2 = rezerv_2 + 1 end
- end
- end
- if rezerv_2 == #rezerv then -- если нет повторяющихся формул, то присваивается данная формула
- doors[i] = rand
- rezerv[#rezerv+1]=rand
- break
- end
- end
- end
- end
- end
- end
- function mark_print(nx, ny, number) -- алгоритм рисования меток
- if level[number].mark then
- for i=1, #level[number].mark do
- gpu.setBackground(level[number].mark[i][3])
- gpu.set((level[number].mark[i][1]+nx)*2, level[number].mark[i][2]+ny, " ")
- end
- end
- end
- function level_print(nx, ny, color, number) -- алгоритм рисования комнаты по координатам
- number = tostring(number)
- gpu.setBackground(color)
- gpu.set(nx*2, ny, " ")
- gpu.set((nx+4)*2, ny, " ")
- gpu.set(nx*2, ny+6, " ")
- gpu.set((nx+4)*2, ny+6, " ")
- gpu.set(nx*2, ny+1, " ")
- gpu.set(nx*2, ny+2, " ")
- gpu.set(nx*2, ny+4, " ")
- gpu.set(nx*2, ny+5, " ")
- gpu.set((nx+6)*2, ny+1, " ")
- gpu.set((nx+6)*2, ny+2, " ")
- gpu.set((nx+6)*2, ny+4, " ")
- gpu.set((nx+6)*2, ny+5, " ")
- gpu.setBackground(0x000000)
- gpu.set(nx*2+6-math.modf((string.len(number)-1)/2), ny+3, number)
- end
- pxx, pyy = {}, {}
- pxx[-1]=function(nx)
- local rezerv_3 = doors[1]
- if proverka(rezerv_3, chamber.number) then
- doors={}
- doors[2] = -rezerv_3
- reload_doors()
- chamber = gen_level(formula[rezerv_3](chamber.number))
- ppx = 6
- else
- ppx = px
- end
- end
- pxx[7]=function(nx)
- local rezerv_3 = doors[2]
- if proverka(rezerv_3, chamber.number) then
- doors={}
- doors[1] = -rezerv_3
- reload_doors()
- chamber = gen_level(formula[rezerv_3](chamber.number))
- ppx = 0
- else
- ppx = px
- end
- end
- pyy[-1]=function(ny)
- local rezerv_3 = doors[3]
- if proverka(rezerv_3, chamber.number) then
- doors={}
- doors[4] = -rezerv_3
- reload_doors()
- chamber = gen_level(formula[rezerv_3](chamber.number))
- ppy = 6
- else
- ppy = py
- end
- end
- pyy[7]=function(ny)
- local rezerv_3 = doors[4]
- if proverka(rezerv_3, chamber.number) then
- doors={}
- doors[3] = -rezerv_3
- reload_doors()
- chamber = gen_level(formula[rezerv_3](chamber.number))
- ppy = 0
- else
- ppy = py
- end
- end
- function player_update(nx,ny)
- ppx, ppy = px+nx, py+ny
- if not ((ppx==0 or ppy==0 or ppx==6 or ppy==6) and ppx~=3 and ppy~=3) then
- if pxx[ppx] then pxx[ppx](ppx)
- elseif pyy[ppy] then pyy[ppy](ppy)
- end
- px,py = ppx,ppy
- end
- end
- function update(nick)
- nick_player = nick
- term.clear() -- очистка экрана
- gpu.setBackground(markColor[playerColor]) -- отобразить текущий цвет
- gpu.set(2, 2, " ")
- ------------- рисуем комнаты -------------
- -- текущая комната
- gen_level(chamber.number)
- mark_print(sx-px,sy-py, chamber.number)
- level_print(sx-px,sy-py,chamber.color, chamber.number)
- -- комната слева
- -- проверяет, удовлетворяет ли комната критериям. если да то отрисовывает
- if proverka(doors[1], chamber.number) and px==0 then
- local number = formula[doors[1]](chamber.number)
- gen_level(number)
- mark_print(sx-7-px,sy-py, number)
- level_print(sx-7-px,sy-py,gen_level(formula[doors[1]](chamber.number)).color, gen_level(formula[doors[1]](chamber.number)).number)
- end
- -- комната справа
- if proverka(doors[2], chamber.number) and px==6 then
- local number = formula[doors[2]](chamber.number)
- gen_level(number)
- mark_print(sx+7-px,sy-py, number)
- level_print(sx+7-px,sy-py,gen_level(formula[doors[2]](chamber.number)).color, gen_level(formula[doors[2]](chamber.number)).number)
- end
- -- комната сверху
- if proverka(doors[3], chamber.number) and py==0 then
- local number = formula[doors[3]](chamber.number)
- gen_level(number)
- mark_print(sx-px,sy-7-py, number)
- level_print(sx-px,sy-7-py,gen_level(formula[doors[3]](chamber.number)).color, gen_level(formula[doors[3]](chamber.number)).number)
- end
- -- комната снизу
- if proverka(doors[4], chamber.number) and py==6 then
- local number = formula[doors[4]](chamber.number)
- gen_level(number)
- mark_print(sx-px,sy+7-py, number)
- level_print(sx-px,sy+7-py,gen_level(formula[doors[4]](chamber.number)).color, number)
- end
- -- отображение игрока
- gpu.setBackground(0xff0000)
- gpu.set(sx*2, sy, " ")
- end
- reload_doors()
- update(nick)
- gpu.setBackground(0x000000)
- local command={} -- управление
- command[200]=function() player_update(0,-1) end -- вверх
- command[208]=function() player_update(0,1) end -- вниз
- command[203]=function() player_update(-1,0) end -- влево
- command[205]=function() player_update(1,0) end -- вправо
- command[18]=function() -- ставить метку
- if not level[chamber.number].mark then level[chamber.number].mark={} end
- level[chamber.number].mark[#level[chamber.number].mark+1]={px,py,markColor[playerColor]}
- end
- command[44]=function() if playerColor-1<1 then playerColor=7 else playerColor=playerColor-1 end end -- цвет слева
- command[46]=function() if playerColor+1>7 then playerColor=1 else playerColor=playerColor+1 end end -- цвет справа
- command[45]=function() -- удалить метку
- local kostili=false
- if level[chamber.number].mark then
- for i=#level[chamber.number].mark, 1, -1 do
- if px==level[chamber.number].mark[i][1] and py==level[chamber.number].mark[i][2] then
- table.remove(level[chamber.number].mark,i)
- end
- end
- end
- end
- while true do
- _,_,_, key, nick = event.pull("key_down")
- if key==16 then gpu.setBackground(0x000000) term.clear() return elseif command[key] then command[key]() end
- update(nick)
- gpu.setBackground(0x000000)
- if chamber.number == 1 then break end
- os.sleep(1/15) -- для удобного управления
- end
- -- прощание
- term.clear()
- print("Congratulations "..nick_player.."!")
- print("")
- print("you win!")
- print("press any key to continue...")
- event.pull("key_down")
- term.clear()
- -- P.S. извините за резервные переменные. Просто фантазии нет как их назвать.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement