oldnewbie

Guess_the_Word_priv

Feb 21st, 2016
150
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. local term = require("term")
  2. local event = require("event")
  3. local computer = require("computer")
  4. local component = require("component")
  5. local unicode = require("unicode")
  6. local fs = require("filesystem")
  7. local gpu = component.gpu
  8. local serialization = require("serialization")
  9. local xSize, ySize = gpu.getResolution()
  10. local width = 63
  11. local height = 25
  12. local xPosCells
  13. local tempXPosCells
  14. local xPosTitle
  15. local tempXPosTitle
  16. local yPosTitle = 8
  17. local yPosCells = 10
  18. local cellsXPos = {}
  19. local title
  20. local words = {}
  21. local word1 = {}
  22. local word2 = {'_','_','_','_','_','_','_','_','_'}
  23. local score = 0
  24. local point = 0
  25. local heard = 5
  26. local sameLetter = false
  27. local noWords = false
  28. local nicknames
  29. local records
  30. local name
  31. local time = 180
  32. local tempTime = time
  33. local count
  34. local heardPlus
  35. local tempRandom
  36. local record = 0
  37. local play = true
  38. local detect = true
  39. local colors = {
  40.     background = 0x7A8B8B,
  41.     button = 0x00688B,
  42.     textButton = 0xE0FFFF,
  43.     input = 0xBBFFFF,
  44.     cell = 0x2F4F4F,
  45.     text = 0x000000,
  46.     heard = 0xFF0000,
  47.     correctLetter = 0x7CFC00,
  48.     incorrectLetter = 0xB22222,
  49.     defBg = 0x000000,
  50.     defText = 0xFFFFFF
  51. }
  52. --Наша клавиатура где (x,y,символ, надпись на клавиатуре)
  53. local keyboard = {
  54.     {8, 16,"й"," Й "},
  55.     {12, 16, "ц", " Ц "},
  56.     {16, 16, "у", " У "},
  57.     {20, 16 , "к", " К "},
  58.     {24, 16, "е", " Е "},
  59.     {28, 16, "н", " Н "},
  60.     {32, 16, "г", " Г "},
  61.     {36, 16, "ш", " Ш "},
  62.     {40, 16, "щ", " Щ "},
  63.     {44, 16, "з", " З "},
  64.     {48, 16, "х", " Х "},
  65.     {52, 16, "ъ", " Ъ "},
  66.     {10, 18, "ф", " Ф "},
  67.     {14, 18, "ы", " Ы "},
  68.     {18, 18, "в", " В "},
  69.     {22, 18, "а", " А "},
  70.     {26, 18, "п", " П "},
  71.     {30, 18, "р", " Р "},
  72.     {34, 18, "о", " О "},
  73.     {38, 18, "л", " Л "},
  74.     {42, 18, "д", " Д "},
  75.     {46, 18, "ж", " Ж "},
  76.     {50, 18, "э", " Э "},
  77.     {14, 20, "я", " Я "},
  78.     {18, 20, "ч", " Ч "},
  79.     {22, 20, "с", " С "},
  80.     {26, 20, "м", " М "},
  81.     {30, 20, "и", " И "},
  82.     {34, 20, "т", " Т "},
  83.     {38, 20, "ь", " Ь "},
  84.     {42, 20, "б", " Б "},
  85.     {46, 20, "ю", " Ю "}
  86. }
  87.  
  88. local selectKey
  89.  
  90. event.shouldInterrupt = function() return false end --Alt+ Ctrl + C не пашет, так же на ваше усмотрение
  91. gpu.setResolution(width, height)
  92.  
  93. local pathToWords = "words.txt"
  94. local function loadWords() --Загружаем слова
  95.     local bool = true
  96.     gpu.setBackground(colors.background)
  97.     if fs.exists(pathToWords) then
  98.         local array = {}
  99.         local file = io.open(pathToWords, "r")
  100.         local str = file:read("*a")
  101.         array = serialization.unserialize(str)
  102.         file:close()
  103.         words = array
  104.     else
  105.         if component.isAvailable("internet") then
  106.         os.execute("wget -f http://pastebin.com/raw/rc7qrrHA words.txt -q")
  107.         term.clear()
  108.         gpu.set(18, 12, "Загружен файл со словами!")
  109.         os.sleep(5)
  110.         term.clear()
  111.         loadWords()
  112.         else
  113.             term.clear()
  114.             gpu.set(4,12, "Вставьте Интернет карту или скачайте words.txt вручную.")
  115.             gpu.set(10,13,"По ссылке http://pastebin.com/rc7qrrHA")
  116.             gpu.setBackground(colors.button)
  117.             gpu.setForeground(colors.textButton)
  118.             gpu.set(4,24,"[<<Назад]")
  119.             gpu.setBackground(colors.background)
  120.             gpu.setForeground(colors.text)
  121.             while bool do
  122.                 local e = {event.pull("touch")}
  123.                 if e[4] == 24 then
  124.                     if e[3]>3 and e[3]<14 then
  125.                         play = false
  126.                         noWords = true
  127.                         bool = false   
  128.                     end
  129.                 end
  130.             end
  131.         end
  132.     end
  133. end
  134. --Берем рандомное слово
  135. local function getRandomWord()
  136.     local randomN = math.modf(math.random(1,#words))
  137.     if tempRandom ~= randomN then --Проверка чтоб небыло 2 подряд
  138.     title = words[randomN].title
  139.     word1 = words[randomN].word
  140.     else
  141.         getRandomWord()
  142.     end
  143.     tempRandom = randomN
  144. end
  145.  
  146. local pathToRecords = "recordsGtW.txt" --путь к файлу с рекордами
  147. local function saveRecord() --Сохраняем рекорды
  148.     local file = io.open(pathToRecords, "w")
  149.     local array = {["nicknames"] = nicknames, ["records"] = records}
  150.     file:write(serialization.serialize(array))
  151.     file:close()
  152. end
  153. local function saveScore() --сохраняем наши заработанные очки
  154.     for i = 1, #nicknames do
  155.         if name == nicknames[i] then
  156.             if score >= record then
  157.                 records[i] = score
  158.             end
  159.         end
  160.     end
  161.     saveRecord()
  162. end
  163.  
  164. local function private() --Приватим
  165.     computer.addUser(name)
  166.     computer.addUser("newbie")
  167. end
  168.  
  169. local function unprivate()--Снимаем приват
  170.     computer.removeUser(name)
  171.     computer.removeUser("newbie")
  172. end
  173.  
  174. local function loadRecord()  --Загружаем рекорды
  175.     if fs.exists(pathToRecords) then
  176.         local array = {}
  177.         local file = io.open(pathToRecords, "r")
  178.         local str = file:read("*a")
  179.         array = serialization.unserialize(str)
  180.         file:close()
  181.         nicknames = array.nicknames
  182.         records = array.records
  183.     else --или создаем новые дефолтные пустые таблицы
  184.         fs.makeDirectory(fs.path(pathToRecords))
  185.             nicknames = {}
  186.             records = {}
  187.             saveRecord()
  188.     end
  189. end
  190. local function checkName(name)  --Проверка на наличие имени в базе
  191.     for i =1, #nicknames do
  192.         if name == nicknames[i] then
  193.             record = records[i]
  194.             return false
  195.         end
  196.     end
  197.     return true
  198. end
  199. local function addPlayer()  --Создаем учетку пользователю если его нет в базе
  200.     if checkName(name) then
  201.         table.insert(nicknames, name)
  202.         table.insert(records, record)
  203.         saveRecord()
  204.     end
  205. end
  206. local function getXPosTitle() --Получаем х позицию вопроса
  207.     tempXPosTitle = unicode.len(title)
  208.     tempXPosTitle = width - tempXPosTitle
  209.     xPosTitle = math.modf(tempXPosTitle/2)
  210.     tempXPosTitle = xPosTitle
  211. end
  212.  
  213. local function getXPosCells() --Получаем х позицию ячеек
  214.     tempXPosCells = #word1
  215.     tempXPosCells = tempXPosCells*5 - 1
  216.     tempXPosCells = width - tempXPosCells
  217.     xPosCells = tempXPosCells/2
  218.     tempXPosCells = xPosCells
  219. end
  220.  
  221. getXPosCells()
  222.  
  223. local function paintMenu() --Отрисовываем меню
  224.     gpu.setResolution(width, height)
  225.     gpu.setBackground(colors.background)
  226.     term.clear()
  227.     gpu.setForeground(colors.text)
  228.    
  229.     gpu.set(27, 3, "Угадай-Ка")
  230.     gpu.setForeground(colors.textButton)
  231.     gpu.setBackground(colors.button)
  232.     gpu.set(25, 15, "[Начать игру]")
  233.     gpu.set(25, 17, "[Топ Лидеров]")
  234.     gpu.set(27, 19,"[Правила]")
  235.     gpu.set(28, 21, "[Выход]")
  236.     gpu.setForeground(colors.text)
  237. end
  238.  
  239. local function paintScene() --Отрисовываем игровой экран
  240.     getXPosCells()
  241.     getXPosTitle()
  242.     gpu.setBackground(colors.background)
  243.     term.clear()
  244.     gpu.set(xPosTitle, yPosTitle, title)
  245.     for i=1, #word1 do
  246.         table.insert(cellsXPos, tempXPosCells)
  247.         gpu.setBackground(colors.cell)
  248.         gpu.setForeground(colors.text)
  249.         gpu.set(tempXPosCells, yPosCells, "   ")
  250.         tempXPosCells = tempXPosCells + 5
  251.         gpu.setBackground(colors.background)
  252.     end
  253.  
  254.     for i=1, #keyboard do
  255.         gpu.setBackground(colors.button)
  256.         gpu.set(keyboard[i][1], keyboard[i][2], keyboard[i][4])
  257.         gpu.setBackground(colors.background)
  258.     end
  259.     local tempN = unicode.len(name)
  260.     tempN = width - (tempN + 17)
  261.     gpu.set(tempN,2,name.." :Текущий игрок")
  262.     gpu.set(2,2,"Ваш рекорд: "..record)
  263.     gpu.set(49,3, " :Ваши жизни")
  264.     gpu.setForeground(colors.heard)
  265.     gpu.set(44,3, "❤x"..heard)
  266.     gpu.setForeground(colors.text)
  267.     gpu.set(2,3,"Текущий счет: "..score)
  268.  
  269. end
  270.  
  271. local function paintRules() --Отрисовываем правила
  272.     local bool = true
  273.     gpu.setBackground(colors.background)
  274.     term.clear()
  275.     gpu.setForeground(colors.text)
  276.     gpu.set(25,7,"Правила игры!")
  277.     gpu.set(4,11,"        Доброго времени суток, уважаемый игрок!")
  278.     gpu.set(4,12,"   Правила <<Угадай-Ки>> очень просты, перед вами будет")
  279.     gpu.set(4,13,"n-количество   ячеек    за   которыми   буквы.   Сверху")
  280.     gpu.set(4,14,"подсказка. Чтоб  выбрать букву  нажмите  ее на экранной")
  281.     gpu.set(4,15,"клавиатуре.  Если  угадаете она  появится  в поле и  на")
  282.     gpu.set(4,16,"ЭК станет зеленной, не угадаете - красной. Есть 4  режима.")
  283.     gpu.set(4,17,"Если не угадали букву - минус жизнь. Каждое угаданное слово")
  284.     gpu.set(4,18,"дает свое количество очков в зависимости от режима игры.")
  285.     gpu.set(4,19,"Каждая  угаданая  подряд буква умножает очки на  кол-во")
  286.     gpu.set(4,20,"угаданых букв подряд. Удачи в игре!!")
  287.     gpu.setBackground(colors.button)
  288.     gpu.setForeground(colors.textButton)
  289.     gpu.set(4,24,"[<<Назад]")
  290.     gpu.setBackground(colors.background)
  291.     gpu.setForeground(colors.text)
  292.     while bool do
  293.         local e = {event.pull("touch")}
  294.         if e[4] == 24 then
  295.             if e[3]>3 and e[3]<14 then
  296.                 bool = false   
  297.                 guessTW()
  298.             end
  299.         end
  300.     end
  301. end
  302.  
  303. local function clearLine(a) --Просто отчиистка линии для сокращения кода
  304.     term.setCursor(1,a)
  305.     term.clearLine()
  306.     term.setCursor(1,1)
  307. end
  308.  
  309. local function timerCallback() -- наш колбек
  310.     if tempTime > 1 then
  311.         tempTime = tempTime - 1
  312.         gpu.setBackground(colors.background)
  313.         gpu.set(5,24,"В случае неактивности вы вернетесь в меню через: "..tostring(tempTime).."  ")
  314.     else
  315.         play = false
  316.         detect = false
  317.         heardScore = heard * count * point
  318.         score = score + heardScore
  319.         saveScore()
  320.         score = 0
  321.         clearLine(24)
  322.         unprivate()
  323.         guessTW()
  324.     end
  325.  
  326. end
  327.  
  328. local function guessTheWord() --Наш алгоритм для сранения букв и работа с нимм
  329.     local goodLetter = false
  330.     local haveSpace = false
  331.     local key = selectKey
  332.     local letter = key[3]
  333.     local tempScore
  334.     detect = true
  335.  
  336.     for i = 1, #word1 do
  337.         if word1[i] == letter then
  338.             if word1[i] ~= word2[i] then
  339.                 point = point + 1
  340.                 tempScore = point*count
  341.                 score = score + tempScore
  342.                 gpu.set(16,3, tostring(score))
  343.                 if record>=score then
  344.                     gpu.set(14,2, tostring(record))
  345.                 else
  346.                     record = score
  347.                     gpu.set(14,2, tostring(record))
  348.                 end
  349.                 goodLetter = true
  350.                 gpu.set(25,12,"Верная буква!")
  351.             elseif word1[i] == word2[i] then
  352.                 sameLetter = true
  353.             end
  354.             word2[i] = letter
  355.             gpu.setBackground(colors.cell)
  356.             gpu.setForeground(colors.textButton)
  357.             gpu.set(cellsXPos[i],10, key[4])
  358.             gpu.setForeground(colors.text)
  359.             gpu.setBackground(colors.correctLetter)
  360.             gpu.set(key[1],key[2],key[4])
  361.             gpu.setBackground(colors.background)
  362.             gpu.setForeground(colors.text)
  363.             clearLine(12)
  364.             gpu.set(25,12,"Верная буква!")
  365.         end
  366.         if word2[i] == "_" then
  367.             haveSpace = true
  368.         end
  369.     end
  370.  
  371.     if goodLetter then
  372.         if not haveSpace then
  373.             heard = heard + heardPlus
  374.             gpu.setForeground(colors.heard)
  375.             gpu.set(47,3,"   ")
  376.             gpu.set(47,3, tostring(heard))
  377.             gpu.setForeground(colors.text)
  378.             clearLine(12)
  379.             if heardPlus == 0 then
  380.                 gpu.set(18, 12,"Слово отгадано, продолжим?")
  381.             elseif heardPlus == 2 then
  382.                 gpu.set(7, 12,"Слово отгадано, вы получили две жизни, продолжим?")
  383.             else
  384.                 gpu.set(6, 12,"Слово отгадано, вы получили одну жизнь, продолжим?")
  385.             end
  386.             gpu.setForeground(colors.textButton)
  387.             gpu.setBackground(colors.button)
  388.             gpu.set(35,14,"[Далее >>]")
  389.             gpu.set(18,14,"[Выход]")
  390.             gpu.setForeground(colors.text)
  391.             while detect do
  392.                 local t1 = event.timer(1, timerCallback, time)
  393.                 local e = {event.pull(time+1,"touch")}
  394.                 event.cancel(t1)
  395.                 gpu.setBackground(colors.background)
  396.                 clearLine(24)
  397.                 tempTime = time
  398.                 if e[4] == 14 then
  399.                     if e[3]>17 and e[3]<26 then
  400.                         play = false
  401.                         detect = false
  402.                         heardScore = heard * count * point
  403.                         score = score + heardScore
  404.                         saveScore()
  405.                         score = 0
  406.                         unprivate()
  407.                         guessTW()
  408.                        
  409.                     elseif e[3]>34 and e[3]<44 then
  410.                         detect = false
  411.                         saveScore()
  412.                         game()
  413.                        
  414.                     end
  415.                 end
  416.                
  417.             end
  418.         end
  419.     elseif sameLetter then
  420.         clearLine(12)
  421.         gpu.set(21,12,"Эта буква уже введена")
  422.         sameLetter = false
  423.     else
  424.         point = 0
  425.         clearLine(12)
  426.         gpu.set(24,12,"Неверная буква!")
  427.         gpu.setBackground(colors.incorrectLetter)
  428.         gpu.set(key[1],key[2],key[4])
  429.         gpu.setBackground(colors.background)
  430.         heard = heard - 1
  431.         if heard ~= 0 then
  432.             gpu.setForeground(colors.heard)
  433.             gpu.set(47,3,"   ")
  434.             gpu.set(47,3, tostring(heard))
  435.             gpu.setForeground(colors.text)
  436.         else
  437.             term.clear()
  438.             unprivate()
  439.             gpu.set(15,11,"Игра окончена!!! Ваш счет: "..tostring(score))
  440.             score = 0
  441.             os.sleep(8)
  442.             play = false
  443.             detect = false
  444.             unprivate()
  445.             guessTW()
  446.         end
  447.     end
  448. end
  449.  
  450.  
  451. local function sortTop() --Сортируем Топ игроков
  452.     for i=1, #records do
  453.       for j=1, #records-1 do
  454.         if records[j] < records[j+1] then
  455.           local r = records[j+1]
  456.           local n = nicknames[j+1]
  457.           records[j+1] = records[j]
  458.           nicknames[j+1] = nicknames[j]
  459.           records[j] = r
  460.           nicknames[j] = n
  461.         end
  462.       end
  463.     end
  464.     saveRecord()
  465. end
  466. function printRecords()  --Выводим рекорды на экран
  467.     local bool = true
  468.     sortTop()
  469.     gpu.setBackground(colors.background)
  470.     term.clear()
  471.     local xPosName = 15
  472.     local xPosRecord = 40
  473.     local yPos = 2
  474.     loadRecord()
  475.         gpu.setForeground(colors.text)
  476.         gpu.set(25,2,"Toп Лидеров")
  477.         gpu.setForeground(colors.textButton)
  478.     if #nicknames <= 15 then
  479.     for i = 1, #nicknames do
  480.         yPos= yPos+1
  481.         gpu.set(xPosName, yPos, nicknames[i] )
  482.         gpu.set(xPosRecord, yPos, tostring(records[i]))
  483.     end
  484.     else
  485.         for i = 1, 15 do
  486.         yPos= yPos+1
  487.         gpu.set(xPosName, yPos, nicknames[i] )
  488.         gpu.set(xPosRecord, yPos, tostring(records[i]))
  489.         end
  490.     end
  491.     gpu.setBackground(colors.button)
  492.     gpu.set(4,24,"[<<Назад]")
  493.     gpu.setBackground(colors.background)
  494.     while bool do
  495.         local e = {event.pull("touch")}
  496.         if e[4] == 24 then
  497.             if e[3]>3 and e[3]<14 then
  498.                 bool = false   
  499.                 guessTW()
  500.             end
  501.         end
  502.     end
  503. end
  504.  
  505.  
  506. function game() --Наша игра
  507.     cellsXPos = {}
  508.     word2 = {'_','_','_','_','_','_','_','_','_'}
  509.     term.clear()
  510.     getRandomWord()
  511.     paintScene()
  512.     while play do
  513.         local t = event.timer(1, timerCallback, time)
  514.         local e = {event.pull(time+1,"touch")}
  515.         event.cancel(t)
  516.         gpu.setBackground(colors.background)
  517.         clearLine(24)
  518.         tempTime = time
  519.         for i=1, #keyboard do
  520.             if e[4] == keyboard[i][2] then
  521.                 if e[3] > keyboard[i][1]-1 and e[3] < keyboard[i][1]+3 then
  522.                     selectKey = keyboard[i]
  523.                     guessTheWord()
  524.                 end
  525.             end
  526.         end
  527.        
  528.     end
  529. end
  530.  
  531. local function selectComplexity() --Выбор уровня сложности
  532.     local bool = true
  533.     gpu.setBackground(colors.background)
  534.     term.clear()
  535.     gpu.setBackground(colors.button)
  536.     gpu.setForeground(colors.textButton)
  537.     gpu.set(27,10,"[Хардкор]")
  538.     gpu.set(27,13,"[Сложная]")
  539.     gpu.set(27,16,"[Средняя]")
  540.     gpu.set(28,19,"[Легко]")
  541.     gpu.set(4,24,"[<<Назад]")
  542.     gpu.setBackground(colors.background)
  543.     gpu.setForeground(colors.text)
  544.     gpu.set(22,8,"Выберите сложность:")
  545.     gpu.set(9,11,"Всего 10 жизней на игру и за букву 100 очков!")
  546.     gpu.set(5,14,"2 жизни в начале и за букву 50 очков, за слово жизнь!")
  547.     gpu.set(6,17,"5 жизней в начале и за букву 10 очков, за слово жизнь!")
  548.     gpu.set(6,20,"10 жизней в начале и за букву 2 очка, за слово 2 жизни!")
  549.  
  550.     while bool do
  551.         local e = {event.pull("touch")}
  552.         if e[4] == 10 then
  553.             if e[3]>26 and e[3]<36 then
  554.                 bool = false
  555.                 heard = 10
  556.                 heardPlus = 0
  557.                 count = 100
  558.                 private()
  559.                 game()
  560.             end
  561.         elseif e[4] == 13 then
  562.             if e[3]>26 and e[3]<36 then
  563.                 bool = false
  564.                 heard = 2
  565.                 heardPlus = 1
  566.                 count = 50
  567.                 private()
  568.                 game()
  569.             end
  570.         elseif e[4] == 16 then
  571.             if e[3]>26 and e[3]<36 then
  572.                 bool = false
  573.                 heard = 5
  574.                 heardPlus = 1
  575.                 count = 10
  576.                 private()
  577.                 game()
  578.             end
  579.         elseif e[4] == 19 then
  580.             if e[3]>27 and e[3]<35 then
  581.                 bool = false
  582.                 heard = 10
  583.                 heardPlus = 2
  584.                 count = 2
  585.                 private()
  586.                 game()
  587.             end
  588.         elseif e[4] == 24 then
  589.             if e[3]>3 and e[3]<14 then
  590.                 bool = false
  591.                 guessTW()
  592.             end
  593.         end
  594.     end
  595. end
  596.  
  597.  
  598. function guessTW() -- Запуск нашей игры
  599.     record = 0
  600.     loadRecord()
  601.     loadWords()
  602.     paintMenu()
  603.     while true do
  604.         local e = {event.pull("touch")}
  605.         if e[4] == 15 then
  606.             if e[3]>24 and e[3]<33 then
  607.                 if not noWords then
  608.                     name = e[6]
  609.                     addPlayer(name)
  610.                     for i = 1, #nicknames do
  611.                         if name == nicknames[i] then
  612.                             record = records[i]
  613.                         end
  614.                     end
  615.                     play = true
  616.                     tempTime = time
  617.                     point = 0
  618.                     selectComplexity()
  619.                 end
  620.             end
  621.         elseif e[4] == 17 then
  622.             if e[3]>24 and e[3]<37 then
  623.                 sortTop()
  624.                 printRecords()
  625.             end
  626.         elseif e[4] == 19 then
  627.             if e[3]>26 and e[3]<36 then
  628.                 paintRules()
  629.             end
  630.         elseif e[4] == 21 then
  631.             if e[3]>27 and e[3]<35 then
  632.                 if e[6] == "newbie" then --В эту строку заносим ник того кто может закрыть игру, если ненужно,
  633.                     --коментим ее
  634.                     gpu.setForeground(colors.defText)
  635.                     gpu.setBackground(colors.defBg)
  636.                     gpu.setResolution(xSize,ySize)
  637.                     term.clear()
  638.                     quit = true
  639.                     break
  640.                 end
  641.             end
  642.         end
  643.         if quit then break end
  644.     end
  645. end
  646.  
  647. guessTW()
RAW Paste Data

Adblocker detected! Please consider disabling it...

We've detected AdBlock Plus or some other adblocking software preventing Pastebin.com from fully loading.

We don't have any obnoxious sound, or popup ads, we actively block these annoying types of ads!

Please add Pastebin.com to your ad blocker whitelist or disable your adblocking software.

×