Sign In to Your Account

Manual registration is temporarily disabled. Please use Discord, Google or GitHub to create an account.

CONTINUE WITH
Minesweeper Solver - bLockerman's Minesweeper Script | Free Roblox Script
bLockerman's Minesweeper bLockerman's Minesweeper

Minesweeper Solver

bLockerman's Minesweeper 5 views 1 day ago
Minesweeper Solver - Roblox Script
Mobile Mobile Friendly

Description

Credits: DasaniDew

Red means its a mine, Green means its safe. However this isnt always correct but it tries its best 🤙I havnt tried this on mobile, all my scripts are tested an used on Crashith (Zenith)

bLockerman's Minesweeper
Explore more scripts
View all bLockerman's Minesweeper scripts

733 Lines 22,090 Bytes
local v0 = game:GetService('TweenService')
local v1 = game:GetService('Players')
local v2 = game:GetService('SoundService')
local v3 = v1.LocalPlayer
local v4 = v3:WaitForChild('PlayerGui')
local v5 = Instance.new('ScreenGui')
v5.Name = 'FeedbackGUI'
v5.ResetOnSpawn = false
v5.ZIndexBehavior = Enum.ZIndexBehavior.Sibling
v5.Parent = v4
local v11 = Instance.new('Frame')
v11.Name = 'Backdrop'
v11.Size = UDim2.new(1, 0, 1, 0)
v11.Position = UDim2.new(0, 0, 0, 0)
v11.BackgroundColor3 = Color3.fromRGB(0, 0, 0)
v11.BackgroundTransparency = 0.5
v11.BorderSizePixel = 0
v11.Parent = v5
local v19 = Instance.new('Frame')
v19.Name = 'MainFrame'
v19.Size = UDim2.new(0, 400, 0, 250)
v19.Position = UDim2.new(0.5, -200, 0.5, -125)
v19.BackgroundColor3 = Color3.fromRGB(30, 30, 45)
v19.BorderSizePixel = 0
v19.Parent = v5
local v26 = Instance.new('UICorner')
v26.CornerRadius = UDim.new(0, 20)
v26.Parent = v19
local v29 = Instance.new('UIGradient')
v29.Color = ColorSequence.new({
    ColorSequenceKeypoint.new(0, Color3.fromRGB(40, 40, 60)),
    ColorSequenceKeypoint.new(1, Color3.fromRGB(25, 25, 40)),
})
v29.Rotation = 45
v29.Parent = v19
local v33 = Instance.new('UIStroke')
v33.Color = Color3.fromRGB(138, 43, 226)
v33.Thickness = 3
v33.Transparency = 0.3
v33.Parent = v19
local v38 = Instance.new('UIStroke')
v38.Color = Color3.fromRGB(200, 100, 255)
v38.Thickness = 6
v38.Transparency = 0.7
v38.Parent = v19
local v43 = Instance.new('TextLabel')
v43.Size = UDim2.new(1, 0, 0, 50)
v43.Position = UDim2.new(0, 0, 0, 10)
v43.BackgroundTransparency = 1
v43.Text = '🌟'
v43.TextSize = 48
v43.Font = Enum.Font.GothamBold
v43.TextColor3 = Color3.fromRGB(255, 255, 255)
v43.Parent = v19
local v53 = Instance.new('TextLabel')
v53.Size = UDim2.new(1, -40, 0, 80)
v53.Position = UDim2.new(0, 20, 0, 60)
v53.BackgroundTransparency = 1
v53.Text =
    'If you enjoy the script, please like my posts. It helps me make more stuff!'
v53.TextSize = 18
v53.Font = Enum.Font.Gotham
v53.TextColor3 = Color3.fromRGB(255, 255, 255)
v53.TextWrapped = true
v53.TextYAlignment = Enum.TextYAlignment.Top
v53.Parent = v19
local v66 = Instance.new('TextButton')
v66.Size = UDim2.new(0.85, 0, 0, 45)
v66.Position = UDim2.new(0.075, 0, 0, 150)
v66.BackgroundColor3 = Color3.fromRGB(34, 197, 94)
v66.Text = 'Sure, I will'
v66.TextSize = 16
v66.Font = Enum.Font.GothamBold
v66.TextColor3 = Color3.fromRGB(255, 255, 255)
v66.TextStrokeTransparency = 0.5
v66.TextStrokeColor3 = Color3.fromRGB(0, 0, 0)
v66.BorderSizePixel = 0
v66.Parent = v19
local v78 = Instance.new('UICorner')
v78.CornerRadius = UDim.new(0, 12)
v78.Parent = v66
local v81 = Instance.new('UIGradient')
v81.Color = ColorSequence.new({
    ColorSequenceKeypoint.new(0, Color3.fromRGB(34, 197, 94)),
    ColorSequenceKeypoint.new(1, Color3.fromRGB(16, 185, 129)),
})
v81.Parent = v66
local v84 = Instance.new('UIStroke')
v84.Color = Color3.fromRGB(255, 255, 255)
v84.Thickness = 0
v84.Transparency = 0
v84.Parent = v66
local v89 = Instance.new('TextButton')
v89.Size = UDim2.new(0.85, 0, 0, 45)
v89.Position = UDim2.new(0.075, 0, 0, 200)
v89.BackgroundColor3 = Color3.fromRGB(239, 68, 68)
v89.Text = "Na this ain't boss baby enough"
v89.TextSize = 16
v89.Font = Enum.Font.GothamBold
v89.TextColor3 = Color3.fromRGB(255, 255, 255)
v89.TextStrokeTransparency = 0.5
v89.TextStrokeColor3 = Color3.fromRGB(0, 0, 0)
v89.BorderSizePixel = 0
v89.Parent = v19
local v101 = Instance.new('UICorner')
v101.CornerRadius = UDim.new(0, 12)
v101.Parent = v89
local v104 = Instance.new('UIGradient')
v104.Color = ColorSequence.new({
    ColorSequenceKeypoint.new(0, Color3.fromRGB(239, 68, 68)),
    ColorSequenceKeypoint.new(1, Color3.fromRGB(225, 29, 72)),
})
v104.Parent = v89
local v107 = Instance.new('UIStroke')
v107.Color = Color3.fromRGB(255, 255, 255)
v107.Thickness = 0
v107.Transparency = 0
v107.Parent = v89
v11.BackgroundTransparency = 1
v19.BackgroundTransparency = 1
v43.TextTransparency = 1
v53.TextTransparency = 1
v66.BackgroundTransparency = 1
v66.TextTransparency = 1
v89.BackgroundTransparency = 1
v89.TextTransparency = 1
v33.Transparency = 1
v38.Transparency = 1
local v119 = v0:Create(
    v11,
    TweenInfo.new(0.5, Enum.EasingStyle.Quad, Enum.EasingDirection.Out),
    { BackgroundTransparency = 0.5 }
)
local v120 = v0:Create(
    v19,
    TweenInfo.new(0.5, Enum.EasingStyle.Back, Enum.EasingDirection.Out),
    { BackgroundTransparency = 0 }
)
local v121 = v0:Create(
    v43,
    TweenInfo.new(0.5, Enum.EasingStyle.Quad, Enum.EasingDirection.Out),
    { TextTransparency = 0 }
)
local v122 = v0:Create(
    v53,
    TweenInfo.new(0.5, Enum.EasingStyle.Quad, Enum.EasingDirection.Out),
    { TextTransparency = 0 }
)
local v123 = v0:Create(
    v66,
    TweenInfo.new(0.5, Enum.EasingStyle.Quad, Enum.EasingDirection.Out),
    { BackgroundTransparency = 0 }
)
local v124 = v0:Create(
    v66,
    TweenInfo.new(0.5, Enum.EasingStyle.Quad, Enum.EasingDirection.Out),
    { TextTransparency = 0 }
)
local v125 = v0:Create(
    v89,
    TweenInfo.new(0.5, Enum.EasingStyle.Quad, Enum.EasingDirection.Out),
    { BackgroundTransparency = 0 }
)
local v126 = v0:Create(
    v89,
    TweenInfo.new(0.5, Enum.EasingStyle.Quad, Enum.EasingDirection.Out),
    { TextTransparency = 0 }
)
local v127 = v0:Create(
    v33,
    TweenInfo.new(0.5, Enum.EasingStyle.Quad, Enum.EasingDirection.Out),
    { Transparency = 0.3 }
)
local v128 = v0:Create(
    v38,
    TweenInfo.new(0.5, Enum.EasingStyle.Quad, Enum.EasingDirection.Out),
    { Transparency = 0.7 }
)
v119:Play()
v120:Play()
v121:Play()
v122:Play()
v123:Play()
v124:Play()
v125:Play()
v126:Play()
v127:Play()
v128:Play()
spawn(function()
    while v19.Parent do
        local v153 = v0:Create(
            v38,
            TweenInfo.new(
                1.5,
                Enum.EasingStyle.Sine,
                Enum.EasingDirection.InOut
            ),
            { Transparency = 0.4 }
        )
        v153:Play()
        v153.Completed:Wait()
        local v154 = v0:Create(
            v38,
            TweenInfo.new(
                1.5,
                Enum.EasingStyle.Sine,
                Enum.EasingDirection.InOut
            ),
            { Transparency = 0.7 }
        )
        v154:Play()
        v154.Completed:Wait()
    end
end)
spawn(function()
    while v43.Parent do
        local v155 = v0:Create(
            v43,
            TweenInfo.new(3, Enum.EasingStyle.Linear),
            { Rotation = 360 }
        )
        v155:Play()
        v155.Completed:Wait()
        v43.Rotation = 0
    end
end)
local function v129(v130)
    local v131 = Instance.new('TextLabel')
    v131.Size = UDim2.new(0, 200, 0, 200)
    v131.Position = UDim2.new(0.5, -100, 0.5, -100)
    v131.BackgroundTransparency = 1
    v131.Text = v130
    v131.TextSize = 144
    v131.Font = Enum.Font.GothamBold
    v131.TextColor3 = Color3.fromRGB(255, 255, 255)
    v131.TextTransparency = 1
    v131.Parent = v5
    local v142 = v0:Create(
        v131,
        TweenInfo.new(1, Enum.EasingStyle.Back, Enum.EasingDirection.Out),
        { TextTransparency = 0, TextSize = 216, Rotation = 360 }
    )
    local v143 = v0:Create(
        v131,
        TweenInfo.new(1, Enum.EasingStyle.Back, Enum.EasingDirection.In),
        { TextTransparency = 1, TextSize = 0, Rotation = 720 }
    )
    local v144 = v0:Create(
        v11,
        TweenInfo.new(1, Enum.EasingStyle.Quad, Enum.EasingDirection.Out),
        { BackgroundTransparency = 1 }
    )
    v142:Play()
    v144:Play()
    v142.Completed:Connect(function()
        v143:Play()
        v143.Completed:Connect(function()
            v131:Destroy()
            v11:Destroy()
        end)
    end)
end
v66.MouseButton1Click:Connect(function()
    local v145 = Instance.new('Sound')
    v145.SoundId = 'rbxassetid://121104033043165'
    v145.Volume = 0.5
    v145.Parent = v2
    v145:Play()
    v19:Destroy()
    v129('❤️')
    game:GetService('Debris'):AddItem(v145, 3)
end)
v89.MouseButton1Click:Connect(function()
    local v149 = Instance.new('Sound')
    v149.SoundId = 'rbxassetid://8904888220'
    v149.Volume = 0.5
    v149.Parent = v2
    v149:Play()
    v19:Destroy()
    v129('🥀')
    game:GetService('Debris'):AddItem(v149, 3)
end)
v66.MouseEnter:Connect(function()
    v0:Create(
        v66,
        TweenInfo.new(0.2, Enum.EasingStyle.Back, Enum.EasingDirection.Out),
        { Size = UDim2.new(0.87, 0, 0, 47) }
    ):Play()
    v0:Create(v84, TweenInfo.new(0.2), { Thickness = 2 }):Play()
    v0:Create(
        v66,
        TweenInfo.new(0.2),
        { BackgroundColor3 = Color3.fromRGB(45, 220, 110) }
    ):Play()
end)
v66.MouseLeave:Connect(function()
    v0:Create(
        v66,
        TweenInfo.new(0.2, Enum.EasingStyle.Quad, Enum.EasingDirection.Out),
        { Size = UDim2.new(0.85, 0, 0, 45) }
    ):Play()
    v0:Create(v84, TweenInfo.new(0.2), { Thickness = 0 }):Play()
    v0:Create(
        v66,
        TweenInfo.new(0.2),
        { BackgroundColor3 = Color3.fromRGB(34, 197, 94) }
    ):Play()
end)
v89.MouseEnter:Connect(function()
    v0:Create(
        v89,
        TweenInfo.new(0.2, Enum.EasingStyle.Back, Enum.EasingDirection.Out),
        { Size = UDim2.new(0.87, 0, 0, 47) }
    ):Play()
    v0:Create(v107, TweenInfo.new(0.2), { Thickness = 2 }):Play()
    v0:Create(
        v89,
        TweenInfo.new(0.2),
        { BackgroundColor3 = Color3.fromRGB(255, 85, 85) }
    ):Play()
end)
v89.MouseLeave:Connect(function()
    v0:Create(
        v89,
        TweenInfo.new(0.2, Enum.EasingStyle.Quad, Enum.EasingDirection.Out),
        { Size = UDim2.new(0.85, 0, 0, 45) }
    ):Play()
    v0:Create(v107, TweenInfo.new(0.2), { Thickness = 0 }):Play()
    v0:Create(
        v89,
        TweenInfo.new(0.2),
        { BackgroundColor3 = Color3.fromRGB(239, 68, 68) }
    ):Play()
end)
local data = {cells={all={},numbered={},toFlag={},toClear={},guess={}},cache={xs_centers_cached=nil,zs_centers_cached=nil},grid={w=0,h=0},ui={PROB_FLAG_THRESHOLD=0.7,PROB_SAFE_THRESHOLD=0.3},timing={lastPlanTick=0,planIntervalMs=100},highlights={}};
local abs, floor, huge = math.abs, math.floor, math.huge;
local sort = table.sort;
local function isNumber(str)
	return tonumber(str) ~= nil;
end
local function key(ix, iz)
	return tostring(ix) .. ":" .. tostring(iz);
end
local function clusterSorted(sorted_list, epsilon)
	local clusters = {};
	if (#sorted_list == 0) then
		return clusters;
	end
	local current_center = sorted_list[1];
	local current_count = 1;
	for i = 2, #sorted_list do
		local v = sorted_list[i];
		if (abs(v - current_center) <= epsilon) then
			current_count = current_count + 1;
			current_center = current_center + ((v - current_center) / current_count);
		else
			table.insert(clusters, current_center);
			current_center = v;
			current_count = 1;
		end
	end
	table.insert(clusters, current_center);
	return clusters;
end
local function median(tbl)
	if (#tbl == 0) then
		return nil;
	end
	sort(tbl);
	local mid = floor((#tbl + 1) / 2);
	return tbl[mid];
end
local function typicalSpacing(sorted_centers)
	if (#sorted_centers < 2) then
		return 4;
	end
	local diffs = {};
	for i = 2, #sorted_centers do
		diffs[#diffs + 1] = abs(sorted_centers[i] - sorted_centers[i - 1]);
	end
	return median(diffs) or 4;
end
local function nearestIndex(v, centers)
	local bestI = 1;
	local bestD = huge;
	for i = 1, #centers do
		local d = abs(v - centers[i]);
		if (d < bestD) then
			bestD = d;
			bestI = i;
		end
	end
	return bestI - 1;
end
local function isCoveredCell(cell)
	if not cell then
		return false;
	end
	if ((cell.state == "number") or (cell.state == "flagged")) then
		return false;
	end
	return cell.covered ~= false;
end
local function isPartFlagged(part)
	if (not part or not part.GetChildren) then
		return false;
	end
	local children = part:GetChildren();
	for _, child in pairs(children) do
		local name = child and child.Name;
		if (name and (string.sub(name, 1, 4) == "Flag")) then
			return true;
		end
	end
	return false;
end
local function buildGrid()
	data.cells.all = {};
	data.cells.numbered = {};
	data.cells.grid = {};
	local root = game.Workspace:FindFirstChild("Flag");
	if not root then
		warn("Cannot find workspace.Flag");
		return;
	end
	local partsFolder = root:FindFirstChild("Parts");
	if not partsFolder then
		warn("Cannot find workspace.Flag.Parts");
		return;
	end
	local parts = partsFolder:GetChildren();
	print("Found " .. #parts .. " parts");
	local raw = {};
	local sumY, countY = 0, 0;
	for _, part in pairs(parts) do
		local pos = part and part.Position;
		if pos then
			table.insert(raw, {part=part,pos=pos});
			sumY = sumY + pos.Y;
			countY = countY + 1;
		end
	end
	local centersX, centersZ = {}, {};
	for _, item in ipairs(raw) do
		centersX[#centersX + 1] = item.pos.X;
		centersZ[#centersZ + 1] = item.pos.Z;
	end
	sort(centersX);
	sort(centersZ);
	local typicalWX = typicalSpacing(centersX);
	local typicalWZ = typicalSpacing(centersZ);
	local epsX = typicalWX * 0.6;
	local epsZ = typicalWZ * 0.6;
	data.cache.xs_centers_cached = clusterSorted(centersX, epsX);
	data.cache.zs_centers_cached = clusterSorted(centersZ, epsZ);
	data.grid.w = #data.cache.xs_centers_cached;
	data.grid.h = #data.cache.zs_centers_cached;
	print("Grid size: " .. data.grid.w .. "x" .. data.grid.h);
	local planeY = ((countY > 0) and (sumY / countY)) or 0;
	for iz = 0, data.grid.h - 1 do
		for ix = 0, data.grid.w - 1 do
			local k = key(ix, iz);
			local row = data.cells.grid[ix];
			if not row then
				row = {};
				data.cells.grid[ix] = row;
			end
			local cell = {ix=ix,iz=iz,part=nil,pos=Vector3.new(data.cache.xs_centers_cached[ix + 1] or 0, planeY, data.cache.zs_centers_cached[iz + 1] or 0),state="unknown",number=nil,k=k,covered=true,neigh=nil};
			data.cells.all[k] = cell;
			row[iz] = cell;
		end
	end
	for _, item in ipairs(raw) do
		local part = item.part;
		local pos = item.pos;
		local ix = nearestIndex(pos.X, data.cache.xs_centers_cached);
		local iz = nearestIndex(pos.Z, data.cache.zs_centers_cached);
		if ((ix >= 0) and (ix < data.grid.w) and (iz >= 0) and (iz < data.grid.h)) then
			local k = key(ix, iz);
			local cell = data.cells.all[k];
			if not cell.part then
				cell.part = part;
				cell.pos = pos;
			else
				local cur_d = abs(((cell.part and cell.part.Position.X) or cell.pos.X) - data.cache.xs_centers_cached[ix + 1]) + abs(((cell.part and cell.part.Position.Z) or cell.pos.Z) - data.cache.zs_centers_cached[iz + 1]);
				local new_d = abs(pos.X - data.cache.xs_centers_cached[ix + 1]) + abs(pos.Z - data.cache.zs_centers_cached[iz + 1]);
				if (new_d < cur_d) then
					cell.part = part;
					cell.pos = pos;
				end
			end
			if part.Color then
				local color = part.Color;
				local r = color.R or color.r or color[1];
				local g = color.G or color.g or color[2];
				local b = color.B or color.b or color[3];
				if (r and (r <= 1)) then
					r = math.floor((r * 255) + 0.5);
				end
				if (g and (g <= 1)) then
					g = math.floor((g * 255) + 0.5);
				end
				if (b and (b <= 1)) then
					b = math.floor((b * 255) + 0.5);
				end
				cell.color = {R=r,G=g,B=b};
			end
			local ngui = part:FindFirstChild("NumberGui");
			if ngui then
				local textLabel = ngui:FindFirstChild("TextLabel");
				if (textLabel and textLabel.Text and isNumber(textLabel.Text)) then
					cell.number = tonumber(textLabel.Text);
					cell.covered = false;
				end
			end
			if (cell.color and cell.color.R and cell.color.G and cell.color.B) then
				if ((cell.color.R == 255) and (cell.color.G == 255) and (cell.color.B == 125)) then
					cell.covered = false;
				end
			end
			if isPartFlagged(part) then
				cell.state = "flagged";
			end
			if (cell.number and not cell.covered) then
				cell.state = "number";
				table.insert(data.cells.numbered, cell);
			end
		end
	end
	print("Found " .. #data.cells.numbered .. " numbered cells");
	for iz = 0, data.grid.h - 1 do
		for ix = 0, data.grid.w - 1 do
			local c = data.cells.grid[ix][iz];
			local neigh = {};
			for dz = -1, 1 do
				for dx = -1, 1 do
					if not ((dx == 0) and (dz == 0)) then
						local jx, jz = ix + dx, iz + dz;
						if ((jx >= 0) and (jx < data.grid.w) and (jz >= 0) and (jz < data.grid.h)) then
							local row = data.cells.grid[jx];
							local n = row and row[jz];
							if n then
								neigh[#neigh + 1] = n;
							end
						end
					end
				end
			end
			c.neigh = neigh;
		end
	end
end
local function neighbors(ix, iz)
	local row = data.cells.grid[ix];
	local c = row and row[iz];
	return (c and c.neigh) or {};
end
local function planMove()
	if (not data.cache.xs_centers_cached or not data.cache.zs_centers_cached or (data.grid.w == 0) or (data.grid.h == 0)) then
		return;
	end
	if (#data.cells.numbered == 0) then
		data.cells.toFlag = {};
		data.cells.toClear = {};
		data.cells.guess = {};
		return;
	end
	data.cells.toFlag = {};
	data.cells.toClear = {};
	data.cells.guess = {};
	local knownFlag = {};
	for _, cell in pairs(data.cells.all) do
		if (cell.state == "flagged") then
			knownFlag[cell] = true;
		end
	end
	local knownClear = {};
	local scratch = {};
	local function computeUnknowns(c)
		local nbs = neighbors(c.ix, c.iz);
		for i = 1, #scratch do
			scratch[i] = nil;
		end
		local flaggedCount = 0;
		for i = 1, #nbs do
			local nb = nbs[i];
			if (knownFlag[nb] or (nb.state == "flagged")) then
				flaggedCount = flaggedCount + 1;
			elseif (not knownClear[nb] and isCoveredCell(nb)) then
				scratch[#scratch + 1] = nb;
			end
		end
		return scratch, flaggedCount;
	end
	local changed = true;
	local guard = 0;
	while changed and (guard < 64) do
		changed = false;
		guard = guard + 1;
		for _, cell in ipairs(data.cells.numbered) do
			local num = cell.number or 0;
			local unknowns, flaggedCount = computeUnknowns(cell);
			local remaining = num - flaggedCount;
			if ((remaining > 0) and (remaining == #unknowns)) then
				for i = 1, #unknowns do
					local u = unknowns[i];
					if not knownFlag[u] then
						knownFlag[u] = true;
						data.cells.toFlag[u] = true;
						changed = true;
					end
				end
			elseif ((remaining == 0) and (#unknowns > 0)) then
				for i = 1, #unknowns do
					local u = unknowns[i];
					if not knownClear[u] then
						knownClear[u] = true;
						data.cells.toClear[u] = true;
						changed = true;
					end
				end
			end
		end
	end
	local accum = {};
	for _, cell in ipairs(data.cells.numbered) do
		local num = cell.number or 0;
		local unknowns, flaggedCount = computeUnknowns(cell);
		local remaining = num - flaggedCount;
		if ((remaining > 0) and (#unknowns > 0)) then
			local p_each = remaining / #unknowns;
			for i = 1, #unknowns do
				local u = unknowns[i];
				if (not knownFlag[u] and not knownClear[u]) then
					local e = accum[u];
					if not e then
						e = {sum=0,w=0};
						accum[u] = e;
					end
					e.sum = e.sum + p_each;
					e.w = e.w + 1;
				end
			end
		end
	end
	local pflag = data.ui.PROB_FLAG_THRESHOLD;
	for cell, e in pairs(accum) do
		local p = ((e.w > 0) and (e.sum / e.w)) or 0;
		if knownFlag[cell] then
			data.cells.toFlag[cell] = true;
		elseif (p >= pflag) then
			data.cells.toFlag[cell] = true;
			knownFlag[cell] = true;
		else
			data.cells.guess[cell] = p;
		end
	end
	for cell, _ in pairs(data.cells.toFlag) do
		data.cells.toClear[cell] = nil;
		data.cells.guess[cell] = nil;
	end
	for cell, _ in pairs(data.cells.toClear) do
		data.cells.toFlag[cell] = nil;
		data.cells.guess[cell] = nil;
	end
	for cell, _ in pairs(data.cells.guess) do
		if knownFlag[cell] then
			data.cells.guess[cell] = nil;
		end
	end
end
local function clearHighlights()
	for _, highlight in pairs(data.highlights) do
		if (highlight and highlight.Parent) then
			highlight:Destroy();
		end
	end
	data.highlights = {};
end
local function createHighlight(part, color)
	local highlight = Instance.new("SelectionBox");
	highlight.Adornee = part;
	highlight.Color3 = color;
	highlight.LineThickness = 0.1;
	highlight.Transparency = 0.3;
	highlight.Parent = part;
	return highlight;
end
local function highlightCells()
	clearHighlights();
	local safeCount = 0;
	local mineCount = 0;
	for cell, _ in pairs(data.cells.toClear or {}) do
		if cell.part then
			local highlight = createHighlight(cell.part, Color3.fromRGB(0, 255, 0));
			table.insert(data.highlights, highlight);
			safeCount = safeCount + 1;
		end
	end
	for cell, _ in pairs(data.cells.toFlag or {}) do
		if cell.part then
			local highlight = createHighlight(cell.part, Color3.fromRGB(255, 0, 0));
			table.insert(data.highlights, highlight);
			mineCount = mineCount + 1;
		end
	end
	if ((safeCount > 0) or (mineCount > 0)) then
		print("Highlighted: " .. safeCount .. " safe (green), " .. mineCount .. " mines (red)");
	end
end
local lastBuild = 0;
local function onUpdate()
	local now = tick();
	if ((now - lastBuild) > 2) then
		buildGrid();
		lastBuild = now;
	end
	if ((data.grid.w == 0) or not data.cache.xs_centers_cached or not data.cache.zs_centers_cached) then
		return;
	end
	local nowMs = now * 1000;
	if ((data.timing.lastPlanTick == 0) or ((nowMs - data.timing.lastPlanTick) >= data.timing.planIntervalMs)) then
		planMove();
		highlightCells();
		data.timing.lastPlanTick = nowMs;
	end
end
game:GetService("RunService").Heartbeat:Connect(onUpdate);
print("======================");
print("Minesweeper Solver Active!");
print("Green boxes = Safe to step on");
print("Red boxes = Mine (don't step on)");
print("======================");

Comments

Comments section coming soon...

Similar Scripts

Share Script

Share this script with others by copying the link or using your device's share options.

https://rbxscripts.net/scripts/minesweeper-solver/
or

Report Script

Help us maintain a safe community. Your report will be reviewed by our moderation team and appropriate action will be taken if needed.

Select a reason...
Malicious Code
Inappropriate Content
Copyright Infringement
Spam
Misleading Information
Other