Advertisement
KrYn0MoRe

game of life

Dec 15th, 2020 (edited)
1,358
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 2.84 KB | None | 0 0
  1. do
  2.     Life = {}
  3.     local mt = { __index = Life}
  4.    
  5.     local sc = 0
  6.  
  7.     function swait()
  8.         sc = sc + 1
  9.         if sc >= 250 then
  10.             sc = 0
  11.             game:GetService("RunService").Heartbeat:Wait()
  12.         end
  13.     end
  14.  
  15.     function Life.new(m, n, res)
  16.         local matrix = {}
  17.        
  18.         local grid = Instance.new("Folder")
  19.         grid.Parent = script
  20.        
  21.         local s = res/m
  22.         local offset = Vector3.new(0,0,-10)
  23.  
  24.         for i = 1, m do
  25.             local row = {}
  26.             for j = 1, n do
  27.                 row[j] = 0
  28.                 local name = (i..','..j)
  29.                 local part = Instance.new("Part")
  30.                 part.Name = name
  31.                 part.CastShadow = false
  32.                 part.Anchored = true
  33.                 part.CanCollide = false
  34.                 part.Massless = true
  35.                 part.Size = Vector3.new(1,1,1)
  36.                 part.Position = offset+Vector3.new(i*s,j*s,0)
  37.                 local mesh = Instance.new("SpecialMesh")
  38.                 mesh.MeshType = Enum.MeshType.Brick
  39.                 mesh.Scale = Vector3.new(s,s,s)
  40.                 mesh.Parent = part
  41.                 part.Parent = grid
  42.             end
  43.             matrix[i] = row
  44.         end
  45.  
  46.         return setmetatable({
  47.             matrix = matrix,
  48.             m = m,
  49.             n = n,
  50.             grid = grid,
  51.         }, mt)
  52.     end
  53.  
  54.     function Life:set_pos(x,y)
  55.         self.matrix[x][y] = 1
  56.     end
  57.  
  58.     function Life:unset_pos(x,y)
  59.         self.matrix[x][y] = 0
  60.     end
  61.  
  62.     function Life:next_gen()
  63.         local X = deepcopy(self.matrix)
  64.         local matrix = self.matrix
  65.         for i = 1, self.m do
  66.             for j = 1, self.n do
  67.                 local s = 0
  68.                 for p = i-1,i+1 do
  69.                     for q = j-1,j+1 do
  70.                         if p > 0 and p <= self.m and q > 0 and q <= self.n then
  71.                             s = s + self.matrix[p][q]
  72.                         end
  73.                     end
  74.                 end
  75.                 s = s - self.matrix[i][j]
  76.                 if s == 3 or (s+self.matrix[i][j]) == 3 then
  77.                     X[i][j] = 1
  78.                 else
  79.                     X[i][j] = 0
  80.                 end
  81.                 swait()
  82.             end
  83.         end
  84.         self.matrix = deepcopy(X)
  85.     end
  86.  
  87.     function Life:render()
  88.         local matrix = self.matrix
  89.         local grid = self.grid
  90.         for i = 1, self.m do
  91.             for j = 1, self.n do
  92.                 local name = (i..','..j)
  93.                 if matrix[i][j] == 0 then
  94.                     grid[name].Color = Color3.new(1,1,1)
  95.                 else
  96.                     grid[name].Color = Color3.new(0,0,0)
  97.                 end
  98.                 swait()
  99.             end
  100.         end
  101.     end
  102. end
  103.  
  104. function deepcopy(object)
  105.     local lookup_table = {}
  106.     local function _copy(object)
  107.         if type(object) ~= "table" then
  108.             return object
  109.         elseif lookup_table[object] then
  110.             return lookup_table[object]
  111.         end
  112.         local new_table = {}
  113.         lookup_table[object] = new_table
  114.         for index, value in pairs(object) do
  115.             new_table[_copy(index)] = _copy(value)
  116.         end
  117.         return setmetatable(new_table, getmetatable(object))
  118.     end
  119.     return _copy(object)
  120. end
  121. local wh = 50
  122. local x,y = wh,wh
  123. local life = Life.new(x,y,20)
  124.  
  125. x,y = x/2,y/2
  126.  
  127. x = math.floor(x)
  128. y = math.floor(y)
  129.  
  130. local t = {
  131.     {0,0},
  132.     {1,0},
  133.     {2,0},
  134.     {4,0},
  135.     {0,1},
  136.     {3,2},
  137.     {4,2},
  138.     {1,3},
  139.     {2,3},
  140.     {4,3},
  141.     {0,4},
  142.     {2,4},
  143.     {4,4},
  144. }
  145.  
  146. for i,v in pairs(t) do
  147.     life:set_pos(x+v[1],y+v[2])
  148. end
  149.  
  150. local tps = 1/60
  151.  
  152. while wait(tps) do
  153.     life:render()
  154.     life:next_gen()
  155. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement