Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- --Реквайрики
- local g = require("component").gpu
- local term = require("term")
- local colors = require("colors")
- local event = require("event")
- --Настройка экрана
- local w, h = 46, 14
- g.setResolution(w,h)
- --Аргументы
- args = {...}
- --Очищаем экран
- g.setBackground(colors.silver, true)
- term.clear()
- --Переменные для кораблей
- local ships = {{3, 3, 8},
- {3, 5, 6},
- {11, 5, 6},
- {3, 7, 4},
- {9, 7, 4},
- {15, 7, 4},
- {3, 9, 2},
- {7, 9, 2},
- {11, 9, 2},
- {15, 9, 2}}
- local shipsE = {{0, 0, 8},
- {0, 0, 6},
- {0, 0, 6},
- {0, 0, 4},
- {0, 0, 4},
- {0, 0, 4},
- {0, 0, 2},
- {0, 0, 2},
- {0, 0, 2},
- {0, 0, 2}}
- --Переменные попаданий
- local shots = 0
- local shotsE = {{0, 0}}
- local shotsE2 = 0
- --Пишем заголовок
- g.setBackground(colors.gray, true)
- g.fill(1,1,w,1," ")
- term.setCursor(math.floor(w/2-6),1)
- g.setForeground(colors.white, true)
- term.write("Морской Бой")
- g.setBackground(colors.black, true)
- term.setCursor(w-3,1)
- term.write(" ")
- --Функция определения координаты для поля
- function makePixelX(x, b)
- return b+math.floor((x-b)/2)*2
- end
- --Рисуем кораблики
- function drawShips()
- for i=1,10 do
- g.setBackground(colors.brown, true)
- g.fill(ships[i][1], ships[i][2], ships[i][3], 1, " ")
- end
- end
- --Автоматически установить кораблики
- function setShipsAuto(var)
- local s = ships
- if var ~= 25 then
- s = shipsE
- end
- for i=1,10 do
- local x, y = 0, 0
- local yes = true
- while yes do
- x = math.random(var, var+19)
- y = math.random(3, 12)
- if x+s[i][3]-1 < var+20 then
- for j=1,10 do
- if i ~= j and (x < s[j][1]+s[j][3]+2 and x+s[i][3] > s[j][1]-2 and y > s[j][2]-2 and y < s[j][2]+2) then
- x = math.random(var, var+19)
- y = math.random(3, 12)
- break
- elseif i ~= j and (j == 10 or (i == 10 and j == 9)) then
- s[i][1] = makePixelX(x, var)
- s[i][2] = y
- yes = false
- end
- end
- end
- end
- end
- if var == 25 then
- ships = s
- else
- shipsE = s
- end
- end
- --Рисуем поле
- function drawField()
- g.setBackground(colors.cyan, true)
- g.fill(25,3,20,10," ")
- g.setBackground(colors.lightblue, true)
- if args[1] ~= "fast" then
- for i=1,10 do
- local delta = math.fmod(i,2)
- for j=1,5 do
- g.fill(23+4*j-2*delta, i+2, 2, 1, " ")
- end
- end
- end
- end
- --Рисуем поле врага
- function drawFieldE()
- g.setBackground(colors.cyan, true)
- g.fill(3,3,20,10," ")
- g.setBackground(colors.lightblue, true)
- if args[1] ~= "fast" then
- for i=1,10 do
- local delta = math.fmod(i,2)
- for j=1,5 do
- g.fill(1+4*j-2*delta, i+2, 2, 1, " ")
- end
- end
- end
- end
- --Кнопка готово после рандома
- function drawButton2()
- g.setBackground(colors.pink, true)
- term.setCursor(13, 11)
- term.write(" Готово ")
- end
- --Кнопка рандома своих кораблей
- function drawButton()
- g.setBackground(colors.lime, true)
- term.setCursor(3, 11)
- term.write(" Авто ")
- end
- --Очищаем пустое место
- function clearShipsField()
- g.setBackground(colors.silver, true)
- g.fill(3,3,22,10," ")
- end
- --Гуишечка
- drawField()
- drawShips()
- drawButton()
- g.setBackground(colors.silver, true)
- g.setForeground(colors.black, true)
- term.setCursor(3,13)
- term.write("Установите корабли")
- --Цикл для установки своих корабликов вручную
- local ship = 0
- local prevX = 0
- local shipCoords = {0,0}
- local setting = true
- local playing = true
- local button2 = false
- while setting do
- local event, _, x, y = event.pull()
- if event == "touch" then
- if x > 2 and x < 13 and y == 11 then
- setShipsAuto(25)
- drawField()
- clearShipsField()
- drawShips()
- drawButton()
- drawButton2()
- button2 = true
- elseif button2 and x > 12 and x < 24 and y == 11 then
- setting = false
- break
- elseif x > w-4 and x < w and y == 1 then
- setting = false
- playing = false
- break
- end
- elseif event == "drag" then
- if ship == 0 then
- for i=1,10 do
- if x > ships[i][1] and x < ships[i][1]+ships[i][3] and y == ships[i][2] then
- ship = i
- shipCoords[1] = ships[i][1]
- shipCoords[2] = ships[i][2]
- break
- end
- end
- else
- ships[ship][1] = ships[ship][1] + x - prevX
- ships[ship][2] = y
- if ships[ship][1] > 2 and ships[ship][1]+ships[ship][3]-1 < 45 and y > 2 and y < 13 then
- drawField()
- clearShipsField()
- drawShips()
- drawButton()
- end
- end
- prevX = x
- elseif event == "drop" then
- if ship > 0 then
- if ships[ship][1] < 25 or ships[ship][1]+ships[ship][3]-1 > 45 or y < 3 or y > 13then
- ships[ship][1] = shipCoords[1]
- ships[ship][2] = shipCoords[2]
- end
- for i=1,10 do
- if i ~= ship and (ships[ship][1] < ships[i][1]+ships[i][3]+1 and ships[ship][1]+ships[ship][3]-1 > ships[i][1]-2 and ships[ship][2] > ships[i][2]-2 and ships[ship][2] < ships[i][2]+2) then
- ships[ship][1] = shipCoords[1]
- ships[ship][2] = shipCoords[2]
- break
- end
- end
- ships[ship][1] = makePixelX(ships[ship][1], 25)
- end
- ship = 0
- drawField()
- clearShipsField()
- drawShips()
- drawButton()
- for i=1,10 do
- if ships[i][1] < 25 then
- break
- elseif i == 10 then
- setting = false
- break
- end
- end
- end
- end
- --Следующий цикл для игры
- setShipsAuto(3)
- drawFieldE()
- g.setBackground(colors.silver, true)
- g.setForeground(colors.black, true)
- term.setCursor(3,13)
- term.write("Противник ")
- term.setCursor(25,13)
- term.write("Вы")
- g.setBackground(colors.magenta, true)
- g.fill(23, 3, 2, 10, " ")
- while playing do
- local event, _, x, y = event.pull()
- if event == "touch" then
- if shots < 20 and shotsE2 < 20 and x > 2 and x < 23 and y > 2 and y < 13 then
- x = makePixelX(x, 3)
- for i=1,10 do
- if x > shipsE[i][1]-1 and x < shipsE[i][1]+shipsE[i][3] and y == shipsE[i][2] then
- shots = shots + 1
- g.setBackground(colors.red, true)
- break
- end
- g.setBackground(colors.blue, true)
- end
- g.fill(x, y, 2, 1, " ")
- local yes = true
- local xE, yE = 0, 0
- while yes do
- xE = makePixelX(math.random(25,44), 3)
- yE = math.random(3,12)
- for i=1,#shotsE do
- if xE == shotsE[i][1] and yE == shotsE[i][2] then
- break
- elseif i == #shotsE then
- yes = false
- break
- end
- end
- end
- table.insert(shotsE, {makePixelX(xE, 3), yE})
- if args[2] ~= "notime" then
- g.setBackground(colors.purple, true)
- g.fill(23, 3, 2, 10, " ")
- os.sleep(math.floor(math.random(2))-0.5)
- g.setBackground(colors.magenta, true)
- g.fill(23, 3, 2, 10, " ")
- end
- for i=1,10 do
- if xE > ships[i][1]-1 and xE < ships[i][1]+ships[i][3] and yE == ships[i][2] then
- shotsE2 = shotsE2 + 1
- g.setBackground(colors.red, true)
- break
- end
- g.setBackground(colors.blue, true)
- end
- g.fill(xE, yE, 2, 1, " ")
- if shots == 20 or shotsE2 == 20 then
- g.setBackground(colors.silver, true)
- g.fill(2, 3, 43, 12, " ")
- g.setBackground(colors.white, true)
- g.fill(15, 5, 16, 3, " ")
- if shots == 20 then
- term.setCursor(20, 6)
- term.write("Победа")
- elseif shotsE2 == 20 then
- term.setCursor(18, 6)
- term.write("Поражение")
- end
- end
- elseif x > w-4 and x < w and y == 1 then
- playing = false
- break
- end
- end
- end
- --При выходе
- g.setForeground(colors.white, true)
- g.setBackground(colors.black, true)
- term.clear()
- g.setResolution(g.maxResolution())
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement