mirror of
https://github.com/IgorTimofeev/MineOS.git
synced 2025-12-24 21:12:50 +01:00
216 lines
5.5 KiB
Lua
216 lines
5.5 KiB
Lua
-- Автор: qwertyMAN
|
|
-- Версия: 0.1 beta
|
|
|
|
local term = require("term")
|
|
local event = require("event")
|
|
local component = require("component")
|
|
local gpu = component.gpu
|
|
local max_mine = 40 -- число мин на поле
|
|
local display = {gpu.getResolution()}
|
|
local border = {0,0} -- отступ, который не используется
|
|
local marker = {} -- отмечает ПКМ мины
|
|
local size = {16,16} -- размер игрового поля
|
|
math.randomseed(os.time())
|
|
|
|
local colors={0x0000ff,0x00ff00,0xff0000,0xffff00,0x8800ff,0x88ff00,0x00ffff,0xff00ff}
|
|
|
|
local function conv_cord(sx,sy)
|
|
return sx*2-1+border[1], sy+border[2]
|
|
end
|
|
|
|
-- создаем поле
|
|
local area={}
|
|
for x=1, size[1] do
|
|
area[x]={}
|
|
for y=1, size[2] do
|
|
area[x][y]={mine=false, n=0}
|
|
end
|
|
end
|
|
|
|
-- генерируем мины
|
|
for i=1, max_mine do
|
|
while true do
|
|
rand_x, rand_y = math.random(1, size[1]), math.random(1, size[2])
|
|
if not area[rand_x][rand_y].mine then
|
|
area[rand_x][rand_y].mine = true
|
|
break
|
|
end
|
|
end
|
|
end
|
|
|
|
-- генерирем числа на пустых клетках
|
|
for x=1, size[1] do
|
|
for y=1, size[2] do
|
|
if not area[x][y].mine then
|
|
for i=-1,1 do
|
|
for j=-1,1 do
|
|
if x+i>0 and y+j>0 and x+i<size[1]+1 and y+j<size[2]+1 and area[x+i][y+j].mine then
|
|
area[x][y].n = area[x][y].n+1
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
gpu.setBackground(0x000000)
|
|
gpu.setForeground(0xffffff)
|
|
|
|
-- отображение пустого поля
|
|
term.clear()
|
|
gpu.setBackground(0xAAAAAA)
|
|
for i=1, size[1] do
|
|
for j=1, size[2] do
|
|
local rezerv = {conv_cord(i,j)}
|
|
gpu.set(rezerv[1], rezerv[2], " ")
|
|
end
|
|
end
|
|
gpu.setBackground(0x000000)
|
|
|
|
local function click(x,y)
|
|
local x = math.modf((x+1)/2)
|
|
return x,y
|
|
end
|
|
|
|
local function open(x,y)
|
|
local not_sorting_tb = {}
|
|
local sorting_tb = {}
|
|
not_sorting_tb[1] = {x,y}
|
|
gpu.setBackground(0xffffff)
|
|
local rezerv = {conv_cord(x,y)}
|
|
gpu.set(rezerv[1], rezerv[2], " ")
|
|
while true do
|
|
-- выход из цикла
|
|
if #not_sorting_tb == 0 then
|
|
gpu.setBackground(0x000000)
|
|
gpu.setForeground(0xffffff)
|
|
return
|
|
else
|
|
local nx,ny = not_sorting_tb[1][1], not_sorting_tb[1][2]
|
|
-- смотрим какого вида ячейка
|
|
if area[nx][ny] then
|
|
if area[nx][ny].n>0 then -- если не пустая
|
|
gpu.setForeground(colors[area[nx][ny].n])
|
|
local rezerv = {conv_cord(nx,ny)}
|
|
gpu.set(rezerv[1], rezerv[2], " "..area[nx][ny].n)
|
|
else
|
|
-- если пустая
|
|
for i=-1,1 do
|
|
for j=-1,1 do
|
|
local mx,my = nx+i, ny+j
|
|
-- если ячейка существует
|
|
if mx>=1 and my>=1 and mx<=size[1] and my<=size[2] then
|
|
local swich = true
|
|
-- проверяем есть ли она в бд
|
|
for n=1, #sorting_tb do
|
|
if mx==sorting_tb[n][1] and my==sorting_tb[n][2] then
|
|
swich = false
|
|
end
|
|
end
|
|
for n=1, #not_sorting_tb do
|
|
if mx==not_sorting_tb[n][1] and my==not_sorting_tb[n][2] then
|
|
swich = false
|
|
end
|
|
end
|
|
if swich then
|
|
local rezerv = {conv_cord(mx,my)}
|
|
gpu.set(rezerv[1], rezerv[2], " ")
|
|
not_sorting_tb[#not_sorting_tb+1]={mx,my}
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
area[nx][ny]=false
|
|
end
|
|
sorting_tb[#sorting_tb+1] = not_sorting_tb[1]
|
|
table.remove(not_sorting_tb,1)
|
|
end
|
|
end
|
|
end
|
|
|
|
-- тело программы
|
|
while true do
|
|
local _,_,x,y,key,nick = event.pull("touch")
|
|
local x,y = click(x,y)
|
|
if key == 0 then
|
|
local swich = true
|
|
for i=1, #marker do
|
|
if x == marker[i][1] and y == marker[i][2] then
|
|
swich = false
|
|
end
|
|
end
|
|
if area[x][y] and area[x][y].mine and swich then
|
|
-- покажим мины
|
|
gpu.setBackground(0xff0000)
|
|
gpu.setForeground(0x000000)
|
|
for i=1, size[1] do
|
|
for j=1, size[2] do
|
|
if area[i][j] and area[i][j].mine then
|
|
local rezerv = {conv_cord(i,j)}
|
|
gpu.set(rezerv[1], rezerv[2], " m")
|
|
end
|
|
end
|
|
end
|
|
gpu.setBackground(0x000000)
|
|
gpu.setForeground(0xffffff)
|
|
os.sleep(2)
|
|
term.clear()
|
|
print("game over")
|
|
os.sleep(2)
|
|
term.clear()
|
|
return
|
|
elseif swich then
|
|
open(x,y)
|
|
-- проверяем выигрыш
|
|
local timer = 0
|
|
for i=1, size[1] do
|
|
for j=1, size[2] do
|
|
if area[i][j] then
|
|
timer = timer+1
|
|
end
|
|
end
|
|
end
|
|
if timer==max_mine then
|
|
-- покажим мины
|
|
gpu.setBackground(0xff0000)
|
|
gpu.setForeground(0x000000)
|
|
for i=1, size[1] do
|
|
for j=1, size[2] do
|
|
if area[i][j] and area[i][j].mine then
|
|
local rezerv = {conv_cord(i,j)}
|
|
gpu.set(rezerv[1], rezerv[2], " m")
|
|
end
|
|
end
|
|
end
|
|
gpu.setBackground(0x000000)
|
|
gpu.setForeground(0xffffff)
|
|
-- поздравления
|
|
os.sleep(2)
|
|
term.clear()
|
|
print("You win!")
|
|
os.sleep(2)
|
|
term.clear()
|
|
return
|
|
end
|
|
end
|
|
elseif key == 1 then
|
|
local swich = true
|
|
for i=#marker, 1, -1 do
|
|
if x == marker[i][1] and y == marker[i][2] then
|
|
table.remove(marker,i)
|
|
gpu.setBackground(0xAAAAAA)
|
|
local rezerv = {conv_cord(x,y)}
|
|
gpu.set(rezerv[1], rezerv[2], " ")
|
|
swich = false
|
|
end
|
|
end
|
|
if swich and area[x][y] then
|
|
marker[#marker+1]={x,y}
|
|
gpu.setBackground(0xffaa00)
|
|
local rezerv = {conv_cord(x,y)}
|
|
gpu.set(rezerv[1], rezerv[2], " ")
|
|
end
|
|
gpu.setBackground(0x000000)
|
|
end
|
|
end |