-- Made for the use with NotSoBot.
-- New version: https://pastebin.com/LmsFRA7y
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())
Comments