Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- math.randomseed(tick())
- local scale = 4
- local size = 50
- local offset = Vector3.new(0, 0, 0)
- local aliveChance = 0.45
- local birthLimit = 12
- local deathLimit = 13
- local stepAmount = 4
- local grid = {}
- -- Generates a 2d grid based on certain dimensions
- for i = 1, size do
- grid[i] = grid[i] or {}
- for j = 1, size do
- grid[i][j] = grid[i][j] or {}
- for k = 1, size do
- if math.random() <= aliveChance then
- grid[i][j][k] = "O"
- else
- grid[i][j][k] = "X"
- end
- end
- end
- end
- print(grid)
- -- Function to print the grid for troubleshooting
- function printGrid(grid)
- for i, v in pairs(grid) do
- for j, k in pairs(v) do
- local printString = table.concat(k, "")
- print(printString)
- end
- end
- end
- -- Function to count neighbors in a 2d array
- function countNeighbors(grid, xPos, yPos, zPos)
- local neighbors = 0
- for x = -1, 1 do
- for y = -1, 1 do
- for z = -1, 1 do
- if xPos + x < 1 or xPos + x > size or yPos + y < 1 or yPos + y > size or zPos + z < 1 or zPos + z > size then
- neighbors += 1
- else
- local neighbor = grid[xPos + x][yPos + y][zPos + z]
- if neighbor == "O" then
- neighbors += 1
- end
- end
- end
- end
- end
- return neighbors
- end
- print(countNeighbors(grid, 1, 1, 1))
- -- Function to perform a step of cellular automata
- function doSimulationStep(grid)
- local newGrid = {}
- for i = 1, size do
- newGrid[i] = newGrid[i] or {}
- for j = 1, size do
- newGrid[i][j] = newGrid[i][j] or {}
- end
- end
- for x, v in pairs(grid) do
- for y, w in pairs(v) do
- for z, u in pairs(w) do
- local neighbors = countNeighbors(grid, x, y, z)
- if u == "O" then
- if neighbors < deathLimit then
- newGrid[x][y][z] = "X"
- else
- newGrid[x][y][z] = "O"
- end
- else
- if neighbors > birthLimit then
- newGrid[x][y][z] = "O"
- else
- newGrid[x][y][z] = "X"
- end
- end
- end
- end
- wait()
- end
- return newGrid
- end
- -- Function to place grid into workspace
- function placeGrid(grid)
- for x, v in pairs(grid) do
- for y, w in pairs(v) do
- for z, u in pairs(w) do
- if u == "O" and countNeighbors(grid, x, y, z) < 26 then
- local part = Instance.new("Part")
- part.Size = Vector3.new(1, 1, 1) * scale
- part.Position = (Vector3.new(x, y, z) + offset) * scale
- part.Color = Color3.fromRGB(y * 2 + 64, y * 2 + 64, y * 2 + 64)
- part.Name = y
- part.Anchored = true
- part.Parent = workspace.CaveParts
- end
- end
- end
- wait()
- end
- end
- for i = 1, stepAmount do
- grid = doSimulationStep(grid)
- print(grid)
- end
- placeGrid(grid)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement