MineOS/Applications/GuessWord/GuessWord.lua
2016-02-25 05:50:17 +03:00

588 lines
16 KiB
Lua
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

local term = require("term")
local event = require("event")
local computer = require("computer")
local component = require("component")
local unicode = require("unicode")
local fs = require("filesystem")
local gpu = component.gpu
local serialization = require("serialization")
local xSize, ySize = gpu.getResolution()
local width = 63
local height = 25
local xPosCells
local tempXPosCells
local xPosTitle
local tempXPosTitle
local yPosTitle = 8
local yPosCells = 10
local cellsXPos = {}
local title
local words = {}
local word1 = {}
local word2 = {'_','_','_','_','_','_','_','_','_'}
local score = 0
local point = 0
local heard = 5
local sameLetter = false
local noWords = false
local nicknames
local records
local name
local count
local heardPlus
local tempRandom
local record = 0
local play = true
local colors = {
background = 0x7A8B8B,
button = 0x00688B,
textButton = 0xE0FFFF,
input = 0xBBFFFF,
cell = 0x2F4F4F,
text = 0x000000,
heard = 0xFF0000,
correctLetter = 0x7CFC00,
incorrectLetter = 0xB22222,
defBg = 0x000000,
defText = 0xFFFFFF
}
--Наша клавиатура где (x,y,символ, надпись на клавиатуре)
local keyboard = {
{8, 16,"й"," Й "},
{12, 16, "ц", " Ц "},
{16, 16, "у", " У "},
{20, 16 , "к", " К "},
{24, 16, "е", " Е "},
{28, 16, "н", " Н "},
{32, 16, "г", " Г "},
{36, 16, "ш", " Ш "},
{40, 16, "щ", " Щ "},
{44, 16, "з", " З "},
{48, 16, "х", " Х "},
{52, 16, "ъ", " Ъ "},
{10, 18, "ф", " Ф "},
{14, 18, "ы", " Ы "},
{18, 18, "в", " В "},
{22, 18, "а", " А "},
{26, 18, "п", " П "},
{30, 18, "р", " Р "},
{34, 18, "о", " О "},
{38, 18, "л", " Л "},
{42, 18, "д", " Д "},
{46, 18, "ж", " Ж "},
{50, 18, "э", " Э "},
{14, 20, "я", " Я "},
{18, 20, "ч", " Ч "},
{22, 20, "с", " С "},
{26, 20, "м", " М "},
{30, 20, "и", " И "},
{34, 20, "т", " Т "},
{38, 20, "ь", " Ь "},
{42, 20, "б", " Б "},
{46, 20, "ю", " Ю "}
}
local selectKey
gpu.setResolution(width, height)
local pathToWords = "words.txt"
local function loadWords() --Загружаем слова
local bool = true
gpu.setBackground(colors.background)
if fs.exists(pathToWords) then
local array = {}
local file = io.open(pathToWords, "r")
local str = file:read("*a")
array = serialization.unserialize(str)
file:close()
words = array
else
if component.isAvailable("internet") then
os.execute("pastebin get rc7qrrHA words.txt")
term.clear()
gpu.set(18, 12, "Загружен файл со словами!")
os.sleep(5)
term.clear()
loadWords()
else
term.clear()
gpu.set(4,12, "Вставьте Интернет карту или скачайте words.txt вручную.")
gpu.set(10,13,"По ссылке http://pastebin.com/rc7qrrHA")
gpu.setBackground(colors.button)
gpu.setForeground(colors.textButton)
gpu.set(4,24,"[<<Назад]")
gpu.setBackground(colors.background)
gpu.setForeground(colors.text)
while bool do
local e = {event.pull("touch")}
if e[4] == 24 then
if e[3]>3 and e[3]<14 then
play = false
noWords = true
bool = false
end
end
end
end
end
end
--Берем рандомное слово
local function getRandomWord()
local randomN = math.modf(math.random(1,#words))
if tempRandom ~= randomN then --Проверка чтоб небыло 2 подряд
title = words[randomN].title
word1 = words[randomN].word
else
getRandomWord()
end
tempRandom = randomN
end
local pathToRecords = "recordsGtW.txt" --путь к файлу с рекордами
local function saveRecord() --Сохраняем рекорды
local file = io.open(pathToRecords, "w")
local array = {["nicknames"] = nicknames, ["records"] = records}
file:write(serialization.serialize(array))
file:close()
end
local function saveScore() --сохраняем наши заработанные очки
for i = 1, #nicknames do
if name == nicknames[i] then
if score >= record then
records[i] = score
end
end
end
saveRecord()
end
local function loadRecord() --Загружаем рекорды
if fs.exists(pathToRecords) then
local array = {}
local file = io.open(pathToRecords, "r")
local str = file:read("*a")
array = serialization.unserialize(str)
file:close()
nicknames = array.nicknames
records = array.records
else --или создаем новые дефолтные пустые таблицы
fs.makeDirectory(fs.path(pathToRecords))
nicknames = {}
records = {}
saveRecord()
end
end
local function checkName(name) --Проверка на наличие имени в базе
for i =1, #nicknames do
if name == nicknames[i] then
record = records[i]
return false
end
end
return true
end
local function addPlayer() --Создаем учетку пользователю если его нет в базе
if checkName(name) then
table.insert(nicknames, name)
table.insert(records, record)
saveRecord()
end
end
local function getXPosTitle() --Получаем х позицию вопроса
tempXPosTitle = unicode.len(title)
tempXPosTitle = width - tempXPosTitle
xPosTitle = math.modf(tempXPosTitle/2)
tempXPosTitle = xPosTitle
end
local function getXPosCells() --Получаем х позицию ячеек
tempXPosCells = #word1
tempXPosCells = tempXPosCells*5 - 1
tempXPosCells = width - tempXPosCells
xPosCells = tempXPosCells/2
tempXPosCells = xPosCells
end
getXPosCells()
local function paintMenu() --Отрисовываем меню
gpu.setResolution(width, height)
gpu.setBackground(colors.background)
term.clear()
gpu.setForeground(colors.text)
gpu.set(27, 3, "Угадай-Ка")
gpu.setForeground(colors.textButton)
gpu.setBackground(colors.button)
gpu.set(25, 15, "[Начать игру]")
gpu.set(25, 17, "[Топ Лидеров]")
gpu.set(27, 19,"[Правила]")
gpu.set(28, 21, "[Выход]")
gpu.setForeground(colors.text)
end
local function paintScene() --Отрисовываем игровой экран
getXPosCells()
getXPosTitle()
gpu.setBackground(colors.background)
term.clear()
gpu.set(xPosTitle, yPosTitle, title)
for i=1, #word1 do
table.insert(cellsXPos, tempXPosCells)
gpu.setBackground(colors.cell)
gpu.setForeground(colors.text)
gpu.set(tempXPosCells, yPosCells, " ")
tempXPosCells = tempXPosCells + 5
gpu.setBackground(colors.background)
end
for i=1, #keyboard do
gpu.setBackground(colors.button)
gpu.set(keyboard[i][1], keyboard[i][2], keyboard[i][4])
gpu.setBackground(colors.background)
end
local tempN = unicode.len(name)
tempN = width - (tempN + 17)
gpu.set(tempN,2,name.." :Текущий игрок")
gpu.set(2,2,"Ваш рекорд: "..record)
gpu.set(49,3, " :Ваши жизни")
gpu.setForeground(colors.heard)
gpu.set(44,3, "❤x"..heard)
gpu.setForeground(colors.text)
gpu.set(2,3,"Текущий счет: "..score)
end
local function paintRules() --Отрисовываем правила
local bool = true
gpu.setBackground(colors.background)
term.clear()
gpu.setForeground(colors.text)
gpu.set(25,7,"Правила игры!")
gpu.set(4,11," Доброго времени суток, уважаемый игрок!")
gpu.set(4,12," Правила <<Угадай-Ки>> очень просты, перед вами будет")
gpu.set(4,13,"n-количество ячеек за которыми буквы. Сверху")
gpu.set(4,14,"подсказка. Чтоб выбрать букву нажмите ее на экранной")
gpu.set(4,15,"клавиатуре. Если угадаете она появится в поле и на")
gpu.set(4,16,"ЭК станет зеленной, неугадаете красной. Есть 4 режима.")
gpu.set(4,17,"Если не угадали букву минус жизнь. Каждое угаданное слово")
gpu.set(4,18,"дает свое количество очков в зависимости от режима игры.")
gpu.set(4,19,"Каждая угаданая подряд буква умножает очки на кол-во")
gpu.set(4,20,"угаданых букв подряд. Удачи в игре!!")
gpu.setBackground(colors.button)
gpu.setForeground(colors.textButton)
gpu.set(4,24,"[<<Назад]")
gpu.setBackground(colors.background)
gpu.setForeground(colors.text)
while bool do
local e = {event.pull("touch")}
if e[4] == 24 then
if e[3]>3 and e[3]<14 then
bool = false
guessTW()
end
end
end
end
local function clearLine(a) --Просто отчиистка линии для сокращения кода
term.setCursor(1,a)
term.clearLine()
end
local function guessTheWord() --Наш алгоритм для сранения букв и работа с нимм
local goodLetter = false
local haveSpace = false
local key = selectKey
local letter = key[3]
local tempScore
local bool = true
for i = 1, #word1 do
if word1[i] == letter then
if word1[i] ~= word2[i] then
point = point + 1
tempScore = point*count
score = score + tempScore
gpu.set(16,3, tostring(score))
if record>=score then
gpu.set(14,2, tostring(record))
else
record = score
gpu.set(14,2, tostring(record))
end
goodLetter = true
gpu.set(25,12,"Верная буква!")
elseif word1[i] == word2[i] then
sameLetter = true
end
word2[i] = letter
gpu.setBackground(colors.cell)
gpu.setForeground(colors.textButton)
gpu.set(cellsXPos[i],10, key[4])
gpu.setForeground(colors.text)
gpu.setBackground(colors.correctLetter)
gpu.set(key[1],key[2],key[4])
gpu.setBackground(colors.background)
gpu.setForeground(colors.text)
clearLine(12)
gpu.set(25,12,"Верная буква!")
end
if word2[i] == "_" then
haveSpace = true
end
end
if goodLetter then
if not haveSpace then
heard = heard + heardPlus
gpu.setForeground(colors.heard)
gpu.set(47,3," ")
gpu.set(47,3, tostring(heard))
gpu.setForeground(colors.text)
clearLine(12)
if heardPlus == 0 then
gpu.set(18, 12,"Слово отгадано, продолжим?")
elseif heardPlus == 2 then
gpu.set(7, 12,"Слово отгадано, вы получили две жизни, продолжим?")
else
gpu.set(6, 12,"Слово отгадано, вы получили одну жизнь, продолжим?")
end
gpu.setForeground(colors.textButton)
gpu.setBackground(colors.button)
gpu.set(35,14,"[Далее >>]")
gpu.set(18,14,"[Выход]")
gpu.setForeground(colors.text)
while bool do
local e = {event.pull("touch")}
if e[4] == 14 then
if e[3]>17 and e[3]<26 then
play = false
bool = false
heardScore = heard * count * point
score = score + heardScore
saveScore()
score = 0
guessTW()
elseif e[3]>34 and e[3]<44 then
bool = false
saveScore()
game()
end
end
end
end
elseif sameLetter then
clearLine(12)
gpu.set(21,12,"Эта буква уже введена")
sameLetter = false
else
point = 0
clearLine(12)
gpu.set(24,12,"Неверная буква!")
gpu.setBackground(colors.incorrectLetter)
gpu.set(key[1],key[2],key[4])
gpu.setBackground(colors.background)
heard = heard - 1
if heard ~= 0 then
gpu.setForeground(colors.heard)
gpu.set(47,3," ")
gpu.set(47,3, tostring(heard))
gpu.setForeground(colors.text)
else
term.clear()
gpu.set(15,11,"Игра окончена!!! Ваш счет: "..tostring(score))
score = 0
os.sleep(8)
play = false
guessTW()
end
end
end
local function sortTop() --Сортируем Топ игроков
for i=1, #records do
for j=1, #records-1 do
if records[j] < records[j+1] then
local r = records[j+1]
local n = nicknames[j+1]
records[j+1] = records[j]
nicknames[j+1] = nicknames[j]
records[j] = r
nicknames[j] = n
end
end
end
saveRecord()
end
function printRecords() --Выводим рекорды на экран
local bool = true
sortTop()
gpu.setBackground(colors.background)
term.clear()
local xPosName = 15
local xPosRecord = 40
local yPos = 2
loadRecord()
gpu.setForeground(colors.text)
gpu.set(25,2,"Toп Лидеров")
gpu.setForeground(colors.textButton)
if #nicknames <= 15 then
for i = 1, #nicknames do
yPos= yPos+1
gpu.set(xPosName, yPos, nicknames[i] )
gpu.set(xPosRecord, yPos, tostring(records[i]))
end
else
for i = 1, 15 do
yPos= yPos+1
gpu.set(xPosName, yPos, nicknames[i] )
gpu.set(xPosRecord, yPos, tostring(records[i]))
end
end
gpu.setBackground(colors.button)
gpu.set(4,24,"[<<Назад]")
gpu.setBackground(colors.background)
while bool do
local e = {event.pull("touch")}
if e[4] == 24 then
if e[3]>3 and e[3]<14 then
bool = false
guessTW()
end
end
end
end
function game() --Наша игра
cellsXPos = {}
word2 = {'_','_','_','_','_','_','_','_','_'}
term.clear()
getRandomWord()
paintScene()
while play do
local e = {event.pull("touch")}
for i=1, #keyboard do
if e[4] == keyboard[i][2] then
if e[3] > keyboard[i][1]-1 and e[3] < keyboard[i][1]+3 then
selectKey = keyboard[i]
guessTheWord()
end
end
end
end
end
local function selectComplexity() --Выбор уровня сложности
local bool = true
gpu.setBackground(colors.background)
term.clear()
gpu.setBackground(colors.button)
gpu.setForeground(colors.textButton)
gpu.set(27,10,"[Хардкор]")
gpu.set(27,13,"[Сложная]")
gpu.set(27,16,"[Средняя]")
gpu.set(28,19,"[Легко]")
gpu.set(4,24,"[<<Назад]")
gpu.setBackground(colors.background)
gpu.setForeground(colors.text)
gpu.set(22,8,"Выберите сложность:")
gpu.set(9,11,"Всего 10 жизней на игру и за букву 100 очков!")
gpu.set(5,14,"2 жизни в начале и за букву 50 очков, за слово жизнь!")
gpu.set(6,17,"5 жизней в начале и за букву 10 очков, за слово жизнь!")
gpu.set(6,20,"10 жизней в начале и за букву 2 очка, за слово 2 жизни!")
while bool do
local e = {event.pull("touch")}
if e[4] == 10 then
if e[3]>26 and e[3]<36 then
bool = false
heard = 10
heardPlus = 0
count = 100
game()
end
elseif e[4] == 13 then
if e[3]>26 and e[3]<36 then
bool = false
heard = 2
heardPlus = 1
count = 50
game()
end
elseif e[4] == 16 then
if e[3]>26 and e[3]<36 then
bool = false
heard = 5
heardPlus = 1
count = 10
game()
end
elseif e[4] == 19 then
if e[3]>27 and e[3]<35 then
bool = false
heard = 10
heardPlus = 2
count = 2
game()
end
elseif e[4] == 24 then
if e[3]>3 and e[3]<14 then
bool = false
guessTW()
end
end
end
end
function guessTW() -- Запуск нашей игры
record = 0
loadRecord()
loadWords()
paintMenu()
while true do
local e = {event.pull("touch")}
if e[4] == 15 then
if e[3]>24 and e[3]<33 then
if not noWords then
name = e[6]
addPlayer(name)
for i = 1, #nicknames do
if name == nicknames[i] then
record = records[i]
end
end
play = true
point = 0
selectComplexity()
end
end
elseif e[4] == 17 then
if e[3]>24 and e[3]<37 then
sortTop()
printRecords()
end
elseif e[4] == 19 then
if e[3]>26 and e[3]<36 then
paintRules()
end
elseif e[4] == 21 then
if e[3]>27 and e[3]<35 then
gpu.setForeground(colors.defText)
gpu.setBackground(colors.defBg)
gpu.setResolution(xSize,ySize)
term.clear()
quit = true
break
end
end
if quit then break end
end
end
guessTW()