Advertisement
qwertyMAN_rus

Cube

Jan 30th, 2016 (edited)
216
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 17.00 KB | None | 0 0
  1. local output = {
  2.     name                    = "Cube",
  3.     version                 = "1.0",
  4.     autors                  = {"qwertyMAN"},
  5.     info                    =
  6.     "This is info for game Cube"
  7. }
  8. output.func                 = function(input)
  9.     local term              = require("term")
  10.     local event             = require("event")
  11.     local component         = require("component")
  12.     local gpu               = component.gpu
  13.     math.randomseed(os.time())
  14.     local level             = {}
  15.     local doors             = {}
  16.     local indicator         = {}
  17.     local nick_player
  18.     local markColor         = {0xff0000, 0xffff00, 0x00ff00, 0x00ffff, 0x0000ff, 0xff00ff, 0xffffff}
  19.     local playerColor       = 3
  20.     local sx,sy             = gpu.getResolution()
  21.     -- точка отступа/координата игрока на экране (статичные)/центр событий
  22.     sx, sy                  = math.modf(sx/4), math.modf(sy/2)
  23.     local px,py             = 3,3       -- относительные координаты игрока в комнате
  24.     local min_map, max_map  = 1, 1000   -- ограничители номеров комнат
  25.     level[1] = {number=1, color = 0xffffff,  mark=false} -- цель игры - попасть в эту комнату
  26.     -------------------------------------------------------------------------------------
  27.     ----------------------- ѓенерациЯ случайных формул длЯ дверей -----------------------
  28.     local rand_1, rand_2 ,rand_3, rand_4
  29.     while true do
  30.         rand_1, rand_2 ,rand_3, rand_4 = math.random(1,2), math.random(10,30), math.random(1,2), math.random(10,30)
  31.         if rand_1~=rand_3 and rand_2~=rand_4 then break end
  32.     end
  33.     formula     = {}
  34.     formula[1]  = function(n) return n*rand_1 + rand_2 end
  35.     formula[2]  = function(n) return n*rand_3 + rand_4 end
  36.     formula[-1] = function(n) return (n - rand_2)/rand_1 end
  37.     formula[-2] = function(n) return (n - rand_4)/rand_3 end
  38.     -------------------------------------------------------------------------------------
  39.     ---------------------- ‚озвращает или генерирует новую комнату ----------------------
  40.     function gen_level(i)
  41.         i = tonumber(i)
  42.         if not level[i] then
  43.             level[i]={number=i, color = math.random(0x000000, 0xffffff), mark=false}
  44.         end
  45.         return level[i]
  46.     end
  47.     -------------------------------------------------------------------------------------
  48.     -------------------------- Џроверка, существует ли комната --------------------------
  49.     function proverka(x,y) -- где x номер формулы, y номер текущей комнаты
  50.         local number = formula[x](y)
  51.         return number >= min_map and number <= max_map and number == math.modf(number)
  52.     end
  53.     -------------------------------------------------------------------------------------
  54.     ---------------------------- ѓенерациЯ статистики комнат ----------------------------
  55.     function sorting(sorting_table, not_sorting_table)
  56.         local trash_table={}
  57.         while true do
  58.             if #not_sorting_table==0 then
  59.                 break
  60.             else
  61.                 local new_level = not_sorting_table[1]
  62.                 local power = true
  63.                 for i=1, #sorting_table do
  64.                     if sorting_table[i][1]== new_level[1] then
  65.                         power = false
  66.                         if new_level[2] < sorting_table[i][2] then
  67.                             sorting_table[i][2]=new_level[2]
  68.                             if proverka(1,new_level[1]) then
  69.                                 trash_table[#trash_table+1] = {formula[1](new_level[1]), new_level[2]+1}
  70.                             end
  71.                             if proverka(2,new_level[1]) then
  72.                                 trash_table[#trash_table+1] = {formula[2](new_level[1]), new_level[2]+1}
  73.                             end
  74.                             if proverka(-1,new_level[1]) then
  75.                                 trash_table[#trash_table+1] = {formula[-1](new_level[1]), new_level[2]+1}
  76.                             end
  77.                             if proverka(-2,new_level[1]) then
  78.                                 trash_table[#trash_table+1] = {formula[-2](new_level[1]), new_level[2]+1}
  79.                             end
  80.                         end
  81.                         table.remove(not_sorting_table,1)
  82.                     end
  83.                 end
  84.                 if power then
  85.                     sorting_table[#sorting_table+1] = new_level
  86.                     table.remove(not_sorting_table,1)
  87.                     if proverka(1,new_level[1]) then
  88.                         not_sorting_table[#not_sorting_table+1] = {formula[1](new_level[1]), new_level[2]+1}
  89.                     end
  90.                     if proverka(2,new_level[1]) then
  91.                         not_sorting_table[#not_sorting_table+1] = {formula[2](new_level[1]), new_level[2]+1}
  92.                     end
  93.                     if proverka(-1,new_level[1]) then
  94.                         not_sorting_table[#not_sorting_table+1] = {formula[-1](new_level[1]), new_level[2]+1}
  95.                     end
  96.                     if proverka(-2,new_level[1]) then
  97.                         not_sorting_table[#not_sorting_table+1] = {formula[-2](new_level[1]), new_level[2]+1}
  98.                     end
  99.                 end
  100.             end
  101.         end
  102.         return sorting_table, trash_table
  103.     end
  104.  
  105.     -- перваЯ сортировка
  106.     local not_sorting_tb, trash_tb={}
  107.     not_sorting_tb[1]={1,0}
  108.     local sorting_tb, trash_tb = sorting({}, not_sorting_tb)
  109.  
  110.     -- последующие сортировки
  111.     while true do
  112.         not_sorting_tb = trash_tb
  113.         sorting_tb, trash_tb = sorting(sorting_tb, not_sorting_tb)
  114.         if #trash_tb == 0 then break end
  115.     end
  116.  
  117.     -- очищаем памЯть
  118.     not_sorting_tb, trash_tb = nil, nil
  119.  
  120.     -- перестраиваем таблицу
  121.     local stat_table={}
  122.     for i=1, #sorting_tb do
  123.         stat_table[sorting_tb[i][1]]=sorting_tb[i][2]
  124.     end
  125.     -------------------------------------------------------------------------------------
  126.     ------------------ Ќаходим номер самой удалЮнной комнаты от выхода ------------------
  127.     local j=1
  128.     for i=1, #sorting_tb do
  129.         if sorting_tb[i][2]>sorting_tb[j][2] then
  130.             j=i
  131.         end
  132.     end
  133.     -------------------------------------------------------------------------------------
  134.     ----------------------- “станавливаем номер стартовой комнаты -----------------------
  135.     local chamber = gen_level(sorting_tb[j][1])
  136.  
  137.     -- запишем количество комнат в игре
  138.     local max_table, max_level = #sorting_tb, sorting_tb[j][2]
  139.  
  140.     -- удалим из памЯти ненужную таблицу
  141.     sorting_tb = nil
  142.     -------------------------------------------------------------------------------------
  143.     --------------------------- ЏереставлЯет двери в комнате ----------------------------
  144.     function reload_doors()
  145.         local rezerv={}
  146.         for i=1,4 do -- занесЮм двери в базу данных, чтобы знать использованные формулы
  147.             if doors[i] then
  148.                 rezerv[#rezerv+1]=doors[i]
  149.             end
  150.         end
  151.         for i=1,4 do -- перебираем все 4 двери
  152.             if not doors[i] then
  153.                 while true do
  154.                     local rand = math.random(-2,2)
  155.                     local rezerv_2 = 0
  156.                     if rand ~= 0 then
  157.                         if #rezerv > 0 then -- проверка, есть ли комната с такой же формулой
  158.                             for j=1, #rezerv do
  159.                                 if rezerv[j] == rand then break else rezerv_2 = rezerv_2 + 1 end
  160.                             end
  161.                         end
  162.                         if rezerv_2 == #rezerv then -- если нет повторЯющихсЯ формул, то присваиваетсЯ даннаЯ формула
  163.                             doors[i] = rand
  164.                             rezerv[#rezerv+1]=rand
  165.                             break
  166.                         end
  167.                     end
  168.                 end
  169.             end
  170.         end
  171.     end
  172.     -- //даннаЯ функциЯ достаточно сложна чтобы запутатьсЯ
  173.     -------------------------------------------------------------------------------------
  174.     ---------------------------------- ђисованиЯ меток ----------------------------------
  175.     function mark_print(nx, ny, number)
  176.         if level[number].mark then
  177.             for i=1, #level[number].mark do
  178.                 gpu.setBackground(level[number].mark[i][3])
  179.                 gpu.set((level[number].mark[i][1]+nx)*2, level[number].mark[i][2]+ny, "  ")
  180.             end
  181.         end
  182.     end
  183.     -------------------------------------------------------------------------------------
  184.     ------------------------- ђисованиЯ комнаты по координатам --------------------------
  185.     function level_print(nx, ny, color, number)
  186.         number = tostring(number)
  187.         gpu.setBackground(color)
  188.         gpu.set(nx*2, ny, "      ")
  189.         gpu.set((nx+4)*2, ny, "      ")
  190.         gpu.set(nx*2, ny+6, "      ")
  191.         gpu.set((nx+4)*2, ny+6, "      ")
  192.        
  193.         gpu.set(nx*2, ny+1, "  ")
  194.         gpu.set(nx*2, ny+2, "  ")
  195.         gpu.set(nx*2, ny+4, "  ")
  196.         gpu.set(nx*2, ny+5, "  ")
  197.         gpu.set((nx+6)*2, ny+1, "  ")
  198.         gpu.set((nx+6)*2, ny+2, "  ")
  199.         gpu.set((nx+6)*2, ny+4, "  ")
  200.         gpu.set((nx+6)*2, ny+5, "  ")
  201.        
  202.         gpu.setBackground(0x000000)
  203.         gpu.set(nx*2+6-math.modf((string.len(number)-1)/2), ny+3, number)
  204.     end
  205.     -------------------------------------------------------------------------------------
  206.     ----------------------------- Џереходы между комнатами ------------------------------
  207.     pxx, pyy = {}, {}
  208.     pxx[-1]=function(nx)
  209.         local rezerv_3 = doors[1]
  210.         if proverka(rezerv_3, chamber.number) then
  211.             doors={}
  212.             doors[2] = -rezerv_3
  213.             reload_doors()
  214.             chamber = gen_level(formula[rezerv_3](chamber.number))
  215.             ppx = 6
  216.         else
  217.             ppx = px
  218.         end
  219.     end
  220.     pxx[7]=function(nx)
  221.         local rezerv_3 = doors[2]
  222.         if proverka(rezerv_3, chamber.number) then
  223.             doors={}
  224.             doors[1] = -rezerv_3
  225.             reload_doors()
  226.             chamber = gen_level(formula[rezerv_3](chamber.number))
  227.             ppx = 0
  228.         else
  229.             ppx = px
  230.         end
  231.     end
  232.     pyy[-1]=function(ny)
  233.         local rezerv_3 = doors[3]
  234.         if proverka(rezerv_3, chamber.number) then
  235.             doors={}
  236.             doors[4] = -rezerv_3
  237.             reload_doors()
  238.             chamber = gen_level(formula[rezerv_3](chamber.number))
  239.             ppy = 6
  240.         else
  241.             ppy = py
  242.         end
  243.     end
  244.     pyy[7]=function(ny)
  245.         local rezerv_3 = doors[4]
  246.         if proverka(rezerv_3, chamber.number) then
  247.             doors={}
  248.             doors[3] = -rezerv_3
  249.             reload_doors()
  250.             chamber = gen_level(formula[rezerv_3](chamber.number))
  251.             ppy = 0
  252.         else
  253.             ppy = py
  254.         end
  255.     end
  256.     -- //работает как надо, но лучше подредактировать
  257.     -------------------------------------------------------------------------------------
  258.     -------------------------------- Џередвижение игрока --------------------------------
  259.     function player_update(nx,ny)
  260.         ppx, ppy = px+nx, py+ny
  261.         if not ((ppx==0 or ppy==0 or ppx==6 or ppy==6) and ppx~=3 and ppy~=3) then
  262.             if pxx[ppx] then pxx[ppx](ppx)
  263.             elseif pyy[ppy] then pyy[ppy](ppy)
  264.             end
  265.             px,py = ppx,ppy
  266.         end
  267.     end
  268.     -- //работает как надо, но лучше подредактировать
  269.     -------------------------------------------------------------------------------------
  270.     --------------------------------- Ѓлок отображениЯ ----------------------------------
  271.     function update(nick)
  272.         nick_player = nick
  273.         term.clear()
  274.  
  275.         -- текущаЯ комната
  276.         gen_level(chamber.number)
  277.         mark_print(sx-px,sy-py, chamber.number)
  278.         level_print(sx-px,sy-py,chamber.color, chamber.number)
  279.        
  280.         -- комната слева
  281.         if proverka(doors[1], chamber.number) and px==0 then
  282.             local number = formula[doors[1]](chamber.number)
  283.             gen_level(number)
  284.             mark_print(sx-7-px,sy-py, number)
  285.             level_print(sx-7-px,sy-py,gen_level(formula[doors[1]](chamber.number)).color, gen_level(formula[doors[1]](chamber.number)).number)
  286.         end
  287.        
  288.         -- комната справа
  289.         if proverka(doors[2], chamber.number) and px==6 then
  290.             local number = formula[doors[2]](chamber.number)
  291.             gen_level(number)
  292.             mark_print(sx+7-px,sy-py, number)
  293.             level_print(sx+7-px,sy-py,gen_level(formula[doors[2]](chamber.number)).color, gen_level(formula[doors[2]](chamber.number)).number)
  294.         end
  295.        
  296.         -- комната сверху
  297.         if proverka(doors[3], chamber.number) and py==0 then
  298.             local number = formula[doors[3]](chamber.number)
  299.             gen_level(number)
  300.             mark_print(sx-px,sy-7-py, number)
  301.             level_print(sx-px,sy-7-py,gen_level(formula[doors[3]](chamber.number)).color, gen_level(formula[doors[3]](chamber.number)).number)
  302.         end
  303.        
  304.         -- комната снизу
  305.         if proverka(doors[4], chamber.number) and py==6 then
  306.             local number = formula[doors[4]](chamber.number)
  307.             gen_level(number)
  308.             mark_print(sx-px,sy+7-py, number)
  309.             level_print(sx-px,sy+7-py,gen_level(formula[doors[4]](chamber.number)).color, number)
  310.         end
  311.        
  312.         -- отображение игрока
  313.         gpu.setBackground(0xff0000)
  314.         gpu.set(sx*2, sy, "  ")
  315.        
  316.         -- текстовые индикаторы
  317.         for i=1, #indicator do
  318.         indicator[i]()
  319.         end
  320.        
  321.         -- индикатор выбранного цвета
  322.         gpu.setBackground(markColor[playerColor])
  323.         gpu.set(2, sy*2, "     ")
  324.     end
  325.     -------------------------------------------------------------------------------------
  326.     ---------------------------------- Ѓлок управлениЯ ----------------------------------
  327.     local command={}
  328.     command[200]=function() player_update(0,-1) end -- вверх
  329.     command[208]=function() player_update(0,1) end  -- вниз
  330.     command[203]=function() player_update(-1,0) end -- влево
  331.     command[205]=function() player_update(1,0) end  -- вправо
  332.     command[17]=function()                          -- ставить метку
  333.                     if not level[chamber.number].mark then level[chamber.number].mark={} end
  334.                     level[chamber.number].mark[#level[chamber.number].mark+1]={px,py,markColor[playerColor]}
  335.                 end
  336.     command[30]=function() if playerColor-1<1 then playerColor=#markColor else playerColor=playerColor-1 end end    -- цвет слева
  337.     command[32]=function() if playerColor+1>#markColor then playerColor=1 else playerColor=playerColor+1 end end    -- цвет справа
  338.     command[31]=function()                                                                              -- удалить метку
  339.                     if level[chamber.number].mark then
  340.                         for i=#level[chamber.number].mark, 1, -1  do
  341.                             if px==level[chamber.number].mark[i][1] and py==level[chamber.number].mark[i][2] then
  342.                                 table.remove(level[chamber.number].mark,i)
  343.                             end
  344.                         end
  345.                     end
  346.                 end
  347.     command[23]=function() -- включает режим разработчика
  348.         if #indicator==0 then
  349.             indicator[1]=function()
  350.                 gpu.setBackground(0x000000)
  351.                 gpu.setForeground(0xffff00)
  352.                 gpu.set(2, 2, "max level: "..max_level)
  353.                 gpu.set(2, 3, "all levels: "..max_table)
  354.                 gpu.set(2, 4, "this level: "..stat_table[chamber.number])
  355.                 gpu.setForeground(0xff0000)
  356.                 gpu.set(2, 5, "formula 1: ".."n".."*"..rand_1.." + "..rand_2)
  357.                 gpu.set(2, 6, "formula 2: ".."n".."*"..rand_3.." + "..rand_4)
  358.                 gpu.set(2, 7, "formula -1: ".."(n - "..rand_2..")/"..rand_1)
  359.                 gpu.set(2, 8, "formula -2: ".."(n - "..rand_4..")/"..rand_3)
  360.                 gpu.setForeground(0xff00ff)
  361.                 gpu.set(2, 9, "progress: " .. math.modf(100-stat_table[chamber.number]*100/max_level).."%")
  362.                 gpu.setForeground(0xff00ff)
  363.                 gpu.set(2, 10, "color: "..playerColor)
  364.                 gpu.setForeground(0xffffff)
  365.             end
  366.         else
  367.             table.remove(indicator,1)
  368.         end
  369.     end
  370.     command[35]=function()                          -- отобразить управление
  371.         term.clear()
  372.         gpu.setForeground(0xff0000)
  373.         print(input.name.." v"..input.version)
  374.         print("")
  375.         gpu.setForeground(0x00ff00)
  376.         print("Target: searching chamber 1")
  377.         print("Game 100% passable")
  378.         gpu.setForeground(0xffff00)
  379.         print("Control:")
  380.         print("Q - exit game")
  381.         print("H - help")
  382.         print("I - info")
  383.         print("W - set mark")
  384.         print("S - remove mark")
  385.         print("A - back color mark")
  386.         print("D - next color mark")
  387.         print("")
  388.         gpu.setForeground(0xffffff)
  389.         print("press enter to continue...")
  390.         while true do
  391.             _,_,_, key = event.pull("key_down")
  392.             if key == 28 then
  393.                 break
  394.             end
  395.         end
  396.     end
  397.     -------------------------------------------------------------------------------------
  398.     ---------------------- Џоказываем управление до начала игры -------------------------
  399.     command[35]()
  400.     -------------------------------------------------------------------------------------
  401.     ------------------------- Ћтображение комнат до начала игры -------------------------
  402.     reload_doors()
  403.     update(nick)
  404.     gpu.setBackground(0x000000)
  405.     -------------------------------------------------------------------------------------
  406.     ------------------------------------- ’ело игры -------------------------------------
  407.     while true do
  408.         _,_,_, key, nick = event.pull("key_down")
  409.         if key==16 then
  410.             term.clear()
  411.             gpu.setForeground(0xff0000)
  412.             print("Exit to game?")
  413.             gpu.setForeground(0xffffff)
  414.             print("")
  415.             print("y/n")
  416.             while true do
  417.                 _,_,_, key = event.pull("key_down")
  418.                 if key == 21 then
  419.                     term.clear()
  420.                     return
  421.                 elseif key == 49 then
  422.                     break
  423.                 end
  424.             end
  425.         elseif command[key] then
  426.             command[key]()
  427.         end
  428.         update(nick)
  429.         gpu.setBackground(0x000000)
  430.         if chamber.number == 1 then break end       -- цель игры, комната с этим номером
  431.         os.sleep(1/15)                              -- задержка, длЯ более удобного управлениЯ
  432.     end
  433.     -------------------------------------------------------------------------------------
  434.     ------------------------------------- Џрощание -------------------------------------
  435.     term.clear()
  436.     gpu.setForeground(0x00ff00)
  437.     print("Congratulations "..nick_player.."!")
  438.     print("You win!")
  439.     print("")
  440.     gpu.setForeground(0xffffff)
  441.     print("press enter to exit...")
  442.     while true do
  443.         _,_,_, key = event.pull("key_down")
  444.         if key == 28 then
  445.             break
  446.         end
  447.     end
  448.     term.clear()
  449.     -------------------------------------------------------------------------------------
  450. end
  451. return output
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement