Lucun_Ji

game_of_life.lua

Jul 4th, 2020 (edited)
1,303
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 3.76 KB | None | 0 0
  1. thread = require("thread")
  2. component = require("component")
  3. gpu = component.gpu
  4. term = require("term")
  5.  
  6. side = 40
  7. background = 0x000000
  8. foreground = 0x00ff00
  9. pixelwidth = 2
  10. pixelheight = 1
  11.  
  12. function deepCopy(t)
  13.     local _t = {}
  14.     for k, v in pairs(t) do
  15.         if type(v) == "table" then
  16.             v = deepCopy(v)
  17.         end
  18.         _t[k] = v
  19.     end
  20.     return _t
  21. end
  22.  
  23. function drawPixel(x, y, size)
  24.     gpu.fill(1 + (x-1) * pixelwidth, 1 + (y-1) * pixelheight, pixelwidth * size, pixelheight * size, " ")
  25. end
  26.  
  27. function drawGrid(grid)
  28.     for y = 1, side, 1 do
  29.         for x = 1, side, 1 do
  30.             if grid[y][x] == 1 then
  31.                 drawPixel(x, y, 1)
  32.             end
  33.         end
  34.     end
  35. end
  36.  
  37. neighborOffsets = {
  38.     {-1, -1},{0, -1},{1, -1},
  39.     {-1, 0},         {1, 0},
  40.     {-1, 1}, {0, 1}, {1, 1}}
  41. function neighbors(grid, x, y)
  42.     sum = 0
  43.     for i, v in ipairs(neighborOffsets) do
  44.         _x = x + v[1]
  45.         _y = y + v[2]
  46.         if (_x >= 1 and _y >= 1 and _x <= side and _y <= side) then
  47.             sum = sum + grid[_y][_x];
  48.         end
  49.     end
  50.     return sum
  51. end
  52.  
  53. function generation(grid)
  54.     local _grid = deepCopy(grid)
  55.     for y = 1, side, 1 do
  56.         for x = 1, side, 1 do
  57.             n = neighbors(_grid, x, y)
  58.             if (n == 2 and _grid[y][x] == 1) then
  59.                 grid[y][x] = 1
  60.             elseif n == 3 then
  61.                 grid[y][x] = 1
  62.             else
  63.                 grid[y][x] = 0
  64.             end
  65.         end
  66.     end
  67. end
  68.  
  69. function init(param)
  70.     assert(param == "rand" or param == "glider" or param == "pulsar")
  71.     term.clear()
  72.     local grid = {}
  73.     math.randomseed(os.time())
  74.     for y = 1, side, 1 do
  75.         grid[y] = {}
  76.         for x = 1, side, 1 do
  77.             if param == "rand" then
  78.                 grid[y][x] = math.random(0, 1)
  79.             else
  80.                 grid[y][x] = 0
  81.             end
  82.         end
  83.     end
  84.  
  85.     if param == "glider" then
  86.         grid[2][1] = 1
  87.         grid[1][3] = 1
  88.         grid[2][3] = 1
  89.         grid[3][2] = 1
  90.         grid[3][3] = 1
  91.     elseif param == "pulsar" then
  92.         grid[2][4] = 1
  93.         grid[2][5] = 1
  94.         grid[2][6] = 1
  95.         grid[2][10] = 1
  96.         grid[2][11] = 1
  97.         grid[2][12] = 1
  98.  
  99.         grid[4][2] = 1
  100.         grid[4][7] = 1
  101.         grid[4][9] = 1
  102.         grid[4][14] = 1
  103.         grid[5][2] = 1
  104.         grid[5][7] = 1
  105.         grid[5][9] = 1
  106.         grid[5][14] = 1
  107.         grid[6][2] = 1
  108.         grid[6][7] = 1
  109.         grid[6][9] = 1
  110.         grid[6][14] = 1
  111.  
  112.         grid[7][4] = 1
  113.         grid[7][5] = 1
  114.         grid[7][6] = 1
  115.         grid[7][10] = 1
  116.         grid[7][11] = 1
  117.         grid[7][12] = 1
  118.  
  119.         grid[9][4] = 1
  120.         grid[9][5] = 1
  121.         grid[9][6] = 1
  122.         grid[9][10] = 1
  123.         grid[9][11] = 1
  124.         grid[9][12] = 1
  125.  
  126.         grid[10][2] = 1
  127.         grid[10][7] = 1
  128.         grid[10][9] = 1
  129.         grid[10][14] = 1
  130.         grid[11][2] = 1
  131.         grid[11][7] = 1
  132.         grid[11][9] = 1
  133.         grid[11][14] = 1
  134.         grid[12][2] = 1
  135.         grid[12][7] = 1
  136.         grid[12][9] = 1
  137.         grid[12][14] = 1
  138.  
  139.         grid[14][4] = 1
  140.         grid[14][5] = 1
  141.         grid[14][6] = 1
  142.         grid[14][10] = 1
  143.         grid[14][11] = 1
  144.         grid[14][12] = 1
  145.     end
  146.  
  147.     return grid
  148. end
  149.  
  150. function run(grid)
  151.     while true do
  152.         gpu.setBackground(background)
  153.         term.clear()
  154.         gpu.setBackground(foreground)
  155.         drawGrid(grid)
  156.         term.setCursor(1, 50)
  157.         os.sleep(1)
  158.         generation(grid)
  159.     end
  160. end
  161.  
  162. print("Choose rand/glider/pulsar:")
  163. local grid = init(string.gsub(term.read(), "\n", ""))
  164. local t = thread.create(run, grid)
  165. input = term.read()
  166. t:kill()
  167. gpu.setBackground(background)
  168. term.clear()
Add Comment
Please, Sign In to add comment