Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- -- Made for the use with NotSoBot.
- local Grid, Counters = {}, {
- ":one:", ":two:",
- ":three:", ":four:",
- ":five:", ":six:",
- ":seven:", ":eight:",
- }
- local Rows = math.max(1, tonumber("{arg:0}") or 10)
- local Columns = math.max(1, tonumber("{arg:1}") or 10)
- local MineChance = math.max(0, math.min(tonumber("{arg:2}") or 20, 100)) * 0.01
- function Grid:Create()
- if (Rows * Columns < 9) then
- return "Grid is too small. There needs to be at least 9 tiles."
- end
- for r = 1, Rows do
- local row = {}
- for c = 1, Columns do
- table.insert(row, ":white_large_square:")
- end
- table.insert(self, row)
- end
- self:ScatterMines()
- self:CountMines()
- return self:Format()
- end
- function Grid:ScatterMines()
- math.randomseed(os.time())
- local mines = 0
- for r, row in ipairs(self) do
- for c, square in ipairs(row) do
- if (math.random() <= MineChance) then
- row[c] = ":bomb:"
- mines = mines + 1
- end
- end
- end
- if (MineChance > 0 and mines == 0) then
- local r = self[math.random(Rows)]
- local c = math.random(Columns)
- r[c] = ":bomb:"
- end
- end
- function Grid:CountMines()
- for r, row in ipairs(self) do
- for c, s in ipairs(row) do
- if (s ~= ":bomb:") then
- local mines = 0
- for x = -1, 1 do
- for y = -1, 1 do
- local r = self[r + x]
- if (r and r[c + y] == ":bomb:") then
- mines = mines + 1
- end
- end
- end
- if (mines > 0) then
- row[c] = Counters[mines]
- end
- end
- end
- end
- end
- function Grid:Format()
- local grid = {}
- for i, r in ipairs(self) do
- r = table.concat(r, "\124\124\124\124")
- table.insert(grid, string.format("\124\124%s\124\124", r))
- end
- grid = table.concat(grid, "\n")
- return #grid > 2000 and "Grid is too large. 2,000 character limit met." or grid
- end
- print(Grid:Create())
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement