SHARE
TWEET

Cube

qwertyMAN_rus Jan 30th, 2016 53 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  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
RAW Paste Data
We use cookies for various purposes including analytics. By continuing to use Pastebin, you agree to our use of cookies as described in the Cookies Policy. OK, I Understand
 
Top