Advertisement
CaptainSpaceCat

Slippery Square

Jul 13th, 2015
295
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 6.70 KB | None | 0 0
  1. local events, lost, won
  2. local w, h = term.getSize()
  3. local midW, midH = math.floor(w/2), math.floor(h/2)
  4. local map = {}
  5. local flood = {}
  6. for i = 1, 15 do
  7.     flood[i] = {}
  8. end
  9. local pos = {
  10.     x = 8,
  11.     y = 8
  12. }
  13. local dirsTab = {
  14.     {-1, 0},
  15.     {0, 1},
  16.     {1, 0},
  17.     {0, -1}
  18. }
  19.  
  20. local function clearScreen()
  21.     term.setBackgroundColor(colors.black)
  22.     term.clear()
  23.     term.setCursorPos(1, 1)
  24. end
  25.  
  26. local function genMap()
  27.     for y = 1, 15 do
  28.         map[y] = {}
  29.         for x = 1, 15 do
  30.             if not (y == 8 and x == 8) then
  31.                 map[y][x] = math.random(1, 10) == 1 and true or false
  32.             end
  33.         end
  34.     end
  35. end
  36.  
  37. local function floodFill(yPos, xPos)
  38.     for y = 1, 15 do
  39.         for x = 1, 15 do
  40.             flood[y][x] = 225
  41.         end
  42.     end
  43.     flood[yPos][xPos] = 0
  44.     local flag = false
  45.     for i = 1, 225 do
  46.         flag = true
  47.         for y = 1, 15 do
  48.             for x = 1, 15 do
  49.                 if flood[y][x] < 225 then
  50.                     if y > 1 and not map[y - 1][x] and flood[y - 1][x] == 225 then
  51.                         flood[y - 1][x] = flood[y][x] + 1
  52.                     end
  53.                     if x < 15 and not map[y][x + 1] and flood[y][x + 1] == 225 then
  54.                         flood[y][x + 1] = flood[y][x] + 1
  55.                     end
  56.                     if y < 15 and not map[y + 1][x] and flood[y + 1][x] == 225 then
  57.                         flood[y + 1][x] = flood[y][x] + 1
  58.                     end
  59.                     if x > 1 and not map[y][x - 1] and flood[y][x - 1] == 225 then
  60.                         flood[y][x - 1] = flood[y][x] + 1
  61.                     end
  62.                 elseif not map[y][x] then
  63.                     flag = false
  64.                 end
  65.             end
  66.         end
  67.         if flag then break end
  68.     end
  69. end
  70.  
  71. local function findPath()
  72.     floodFill(pos.y, pos.x)
  73.     local min = 225
  74.     local minPos = {}
  75.     for i = 2, 14 do
  76.         if not map[1][i] and min > flood[1][i] then
  77.             min = flood[1][i]
  78.             minPos = {1, i}
  79.         end
  80.         if not map[i][1] and min > flood[i][1] then
  81.             min = flood[i][1]
  82.             minPos = {i, 1}
  83.         end
  84.         if not map[i][15] and min > flood[i][15] then
  85.             min = flood[i][15]
  86.             minPos = {i, 15}
  87.         end
  88.         if not map[15][i] and min > flood[15][i] then
  89.             min = flood[15][i]
  90.             minPos = {15, i}
  91.         end
  92.     end
  93.     if min < 225 then
  94.         floodFill(minPos[1], minPos[2])
  95.         return false
  96.     end
  97.     return true
  98. end
  99.  
  100. local function moveSquare()
  101.     local min = 225
  102.     local dir = 0
  103.     if pos.y > 1 and not map[pos.y - 1][pos.x] and min > flood[pos.y - 1][pos.x] then --up
  104.         min = flood[pos.y - 1][pos.x]
  105.         dir = 1
  106.     end
  107.     if pos.x < 15 and not map[pos.y][pos.x + 1] and min > flood[pos.y][pos.x + 1] then --right
  108.         min = flood[pos.y][pos.x + 1]
  109.         dir = 2
  110.     end
  111.     if pos.y < 15 and not map[pos.y + 1][pos.x] and min > flood[pos.y + 1][pos.x] then --down
  112.         min = flood[pos.y + 1][pos.x]
  113.         dir = 3
  114.     end
  115.     if pos.x > 1 and not map[pos.y][pos.x - 1] and min > flood[pos.y][pos.x - 1] then --left
  116.         min = flood[pos.y][pos.x - 1]
  117.         dir = 4
  118.     end
  119.  
  120.     if pos.y > 1 and pos.x < 15 and not map[pos.y - 1][pos.x + 1] and not (map[pos.y - 1][pos.x]  and map[pos.y][pos.x + 1]) and min > flood[pos.y - 1][pos.x + 1] then --up right
  121.         min = flood[pos.y - 1][pos.x + 1]
  122.         dir = 5
  123.     end
  124.     if pos.y < 15 and pos.x < 15 and not map[pos.y + 1][pos.x + 1] and not (map[pos.y + 1][pos.x]  and map[pos.y][pos.x + 1]) and min > flood[pos.y + 1][pos.x + 1] then --down right
  125.         min = flood[pos.y + 1][pos.x + 1]
  126.         dir = 6
  127.     end
  128.     if pos.y < 15 and pos.x > 1 and not map[pos.y + 1][pos.x - 1] and not (map[pos.y + 1][pos.x]  and map[pos.y][pos.x - 1]) and min > flood[pos.y + 1][pos.x - 1] then --down left
  129.         min = flood[pos.y + 1][pos.x - 1]
  130.         dir = 7
  131.     end
  132.     if pos.y > 1 and pos.x > 1 and not map[pos.y - 1][pos.x - 1] and not (map[pos.y - 1][pos.x]  and map[pos.y][pos.x - 1]) and min > flood[pos.y - 1][pos.x - 1] then --up left
  133.         min = flood[pos.y - 1][pos.x - 1]
  134.         dir = 8
  135.     end
  136.  
  137.     if pos.x == 1 or pos.x == 15 or pos.y == 1 or pos.y == 15 then
  138.         return true
  139.     end
  140.     if dir == 1 then
  141.         pos.y = pos.y - 1
  142.     elseif dir == 2 then
  143.         pos.x = pos.x + 1
  144.     elseif dir == 3 then
  145.         pos.y = pos.y + 1
  146.     elseif dir == 4 then
  147.         pos.x = pos.x - 1
  148.     elseif dir == 5 then
  149.         pos.x = pos.x + 1
  150.         pos.y = pos.y - 1
  151.     elseif dir == 6 then
  152.         pos.x = pos.x + 1
  153.         pos.y = pos.y + 1
  154.     elseif dir == 7 then
  155.         pos.x = pos.x - 1
  156.         pos.y = pos.y + 1
  157.     elseif dir == 8 then
  158.         pos.x = pos.x - 1
  159.         pos.y = pos.y - 1
  160.     end
  161. end
  162.  
  163. local function updateScreen()
  164.     for y = 1, 15 do
  165.         for x = 1, 15 do
  166.             if map[y][x] then
  167.                 if map[y][x] == "#" then
  168.                   term.setBackgroundColor(colors.red)
  169.                 else
  170.                   term.setBackgroundColor(colors.cyan)
  171.                 end
  172.             elseif x == pos.x and y == pos.y and not lost then
  173.                 term.setBackgroundColor(colors.orange)
  174.             elseif x % 2 == y % 2 then
  175.                 term.setBackgroundColor(colors.blue)
  176.             else
  177.                 term.setBackgroundColor(colors.lightBlue)
  178.             end
  179.             term.setCursorPos(midW - 7 + x, midH - 7 + y)
  180.             write(" ")
  181.         end
  182.     end
  183. end
  184.  
  185. clearScreen()
  186. genMap()
  187. updateScreen()
  188. while true do
  189.     repeat
  190.         events = {coroutine.yield("mouse_click")}
  191.     until (events[3] >= midW - 6 and events[3] <= midW + 8 and events[4] >= midH - 6 and events[4] <= midH + 8) and not map[events[4] - midH + 7][events[3] - midW + 7] and not (events[4] - midH + 7 == pos.y and events[3] - midW + 7 == pos.x)
  192.     map[events[4] - midH + 7][events[3] - midW + 7] = true
  193.     updateScreen()
  194.     sleep(.2)
  195.     won = findPath()
  196.     if won then break end
  197.     lost = moveSquare()
  198.     updateScreen()
  199.     if lost then break end
  200. end
  201.  
  202. local endTime = os.startTimer(math.random(1, 10)/10)
  203. term.setBackgroundColor(colors.black)
  204. term.setCursorPos(midW - 3, 1)
  205. if won then
  206.     term.setTextColor(colors.green)
  207.     write("YOU WON")
  208.     floodFill(pos.y, pos.x)
  209.     local trapTab = {}
  210.     for y = 1, 15 do
  211.         for x = 1, 15 do
  212.             if flood[y][x] < 225 then
  213.                 trapTab[#trapTab + 1] = {y, x}
  214.             end
  215.         end
  216.     end
  217.     term.setBackgroundColor(colors.red)
  218.     for i = 1, #trapTab do
  219.       for n = 1, 4 do
  220.         if map[trapTab[i][1] + dirsTab[n][2]][trapTab[i][2] + dirsTab[n][1]] then
  221.           map[trapTab[i][1] + dirsTab[n][2]][trapTab[i][2] + dirsTab[n][1]] = "#"
  222.         end
  223.       end
  224.     end
  225.     while true do
  226.         local choice = trapTab[math.random(1, #trapTab)]
  227.         pos.y, pos.x = choice[1], choice[2]
  228.         updateScreen()
  229.         repeat
  230.             events = {os.pullEvent()}
  231.         until (events[1] == "timer" and events[2] == endTime) or events[1] == "key"
  232.         if events[1] == "timer" then
  233.             endTime = os.startTimer(math.random(1, 10)/10)
  234.         elseif events[1] == "key" then break end
  235.     end
  236. elseif lost then
  237.     term.setTextColor(colors.red)
  238.     write("YOU LOST")
  239.     while true do
  240.         for y = 1, 15 do
  241.             for x = 1, 15 do
  242.                 if map[y][x] and math.random(1, 10) == 1 then
  243.                     map[y][x] = false
  244.                 end
  245.             end
  246.         end
  247.         updateScreen()
  248.         repeat
  249.             events = {os.pullEvent()}
  250.         until (events[1] == "timer" and events[2] == endTime) or events[1] == "key"
  251.         if events[1] == "timer" then
  252.             endTime = os.startTimer(math.random(1, 10)/10)
  253.         elseif events[1] == "key" then break end
  254.     end
  255. end
  256.  
  257. sleep(.1)
  258. clearScreen()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement