Create Crossword.lua

This commit is contained in:
Igor Timofeev 2015-08-04 22:38:45 +03:00
parent e82d59b34d
commit 1d9e151dbb

291
Applications/Crossword.lua Normal file
View File

@ -0,0 +1,291 @@
local component = require("component")
local term = require("term")
local unicode = require("unicode")
local event = require("event")
local fs = require("filesystem")
local ecs = require("ECSAPI")
local gpu = component.gpu
------------------------------------------------------------------------------------------------------------------------
local arg = {...}
local crossword = {}
local keyWords = {}
local keyWordsColors = {}
local temporaryWordTrace = {}
local globalWordTrace = {}
------------------------------------------------------------------------------------------------------------------------
local function readFile(path)
--ЧИТАЕМ И ЗАПОЛНЯЕМ МАССИВ
local lines = {}
local f = io.open(path, "r")
while true do
local line = f:read("*l")
if line then
table.insert(lines, unicode.upper(line))
else
break
end
end
f:close()
return lines
end
local function getCrosswordFromFile(pathToCrossword)
--ЧИТАЕМ ФАЙЛ КРОССВОРДА
local readedCrossword = readFile(pathToCrossword)
--ЕСЛИ ПЕРВАЯ ФРАЗА В ФАЙЛЕ НЕ РАВНА НУЖНОЙ, ТО КИНУТЬ ОШИБКУ, А ТО МАЛО ЛИ
if readedCrossword[1] ~= "--КРОССВОРД" then ecs.error("Ошибка чтения файла кроссворда: скорее всего, он хуево составлен. Давай заново.") end
--ПАРСИМ КРОССВОРД НА БУКОВКИ
local keyWordsStarted = false
for i = 2, #readedCrossword do
--ЕСЛИ НАЙДЕНА ФРАЗА НУЖНАЯ, ТО ВКЛЮЧИТЬ РЕЖИМ ЧТЕНИЯ КЛЮЧЕВЫХ СЛОВ
if readedCrossword[i] == "--КЛЮЧЕВЫЕ СЛОВА" then
keyWordsStarted = true
end
--ВЫБОР МЕЖДУ РЕЖИМАМИ КРОССВОРДА И КЛЮЧЕВЫХ СЛОВ
if not keyWordsStarted then
local position = #crossword + 1
crossword[position] = {}
for j = 1, unicode.len( readedCrossword[i] ) do
crossword[position][j] = { unicode.sub(readedCrossword[i], j, j) }
end
else
local yPos = i + 1
if readedCrossword[yPos] then
local position = #keyWords + 1
keyWords[position] = {}
for j = 1, unicode.len( readedCrossword[yPos] ) do
table.insert( keyWords[position], unicode.sub(readedCrossword[yPos], j, j) )
end
else
break
end
end
end
end
local function drawCrossword(x, y, background, foreground, xSpaceBetween, ySpaceBetween)
--ЗАДАНИЕ СТАРТОВЫХ АРГУМЕНТОВ, А ТО МАЛО ЛИ ЧЁ
x = x or 1
y = y or 1
background = background or 0xffffff
foreground = foreground or 0x000000
local barsColor = 0xaaaaaa
local barsTextColor = 0xffffff
xSpaceBetween = 3
ySpaceBetween = 1
--КОРРЕКЦИЯ КООРДИНАТ
local xPos = x
local yPos = y
--РИСУЕМ РЯДЫ
ecs.square(xPos, yPos, xSpaceBetween + #crossword[1] + xSpaceBetween * #crossword[1] - 1, 1, barsColor)
ecs.square(xPos, yPos, 2, ySpaceBetween + #crossword + ySpaceBetween * #crossword, barsColor)
xPos = x + xSpaceBetween + 1
yPos = yPos + ySpaceBetween + 1
--РИСУЕМ САМ КРОССВОРД
for i = 1, #crossword do
for j = 1, #crossword[i] do
local cvet1 = background
local cvet2 = foreground
if crossword[i][j][2] then
cvet1 = crossword[i][j][2]
cvet2 = 0xffffff - cvet1
end
gpu.setBackground(cvet1)
gpu.setForeground(cvet2)
gpu.set(xPos, yPos, crossword[i][j][1])
--РИСУЕМ ТЕКСТ НА ПОЛОСОЧКАХ С НОМЕРАМИ
gpu.setForeground(barsTextColor)
gpu.setBackground(barsColor)
gpu.set(xPos, y, tostring(j))
gpu.set(x, yPos, tostring(i))
xPos = xPos + xSpaceBetween + 1
--event.pull("key_down")
end
xPos = x + xSpaceBetween + 1
yPos = yPos + ySpaceBetween + 1
end
--СЛОВЕЧКИ РИСУЕМ
gpu.setBackground(background)
gpu.setForeground(foreground)
--ЛИНИЮ РИСУЕМ
xPos = x + xSpaceBetween
gpu.set(1, yPos, string.rep("-", 100))
yPos = yPos + ySpaceBetween + 1
for i = 1, #keyWords do
local color1, color2 = background, foreground
if keyWordsColors[i] then color1 = keyWordsColors[i]; color2 = 0xffffff - color1 end
local slovo = ""
for j = 1, #keyWords[i] do
slovo = slovo .. keyWords[i][j]
end
gpu.setBackground(color1)
gpu.setForeground(color2)
gpu.set(xPos, yPos, slovo)
--ecs.error("Слово = "..slovo)
yPos = yPos + 1
end
end
local function findWord(x, y, wordCyka, uspeh )
if #wordCyka <= 1 then return uspeh end
local word = {}
for i = 1, #wordCyka do
word[i] = wordCyka[i]
end
uspeh = false
table.remove(word, 1)
--ecs.error("#wordCyka="..#wordCyka..", #word="..#word)
--ecs.error("Рассматриваю х="..x..", y="..y..", word[1]="..word[1]..", xOtkuda="..xOtkuda..", yOtkuda="..yOtkuda)
local function cyka(xMod, yMod)
--ecs.error(word[1] .." ".. crossword[y + yMod][x + xMod][1])
if word[1] == crossword[y + yMod][x + xMod][1] and not uspeh then
--ecs.error("Смотрю на ("..x..","..y..","..crossword[y][x][1].."), ищу вокруг букву \""..word[1].."\", #свет="..#temporaryWordTrace)
uspeh = true
table.insert(temporaryWordTrace, {xMod, yMod})
uspeh = findWord( x + xMod, y + yMod, word, uspeh )
end
end
if crossword[y - 1] then cyka(0, -1) end
if crossword[y][x + 1] then cyka(1, 0) end
if crossword[y + 1] then cyka(0, 1) end
if crossword[y][x - 1] then cyka(-1, 0) end
--УБИРАЕМ ЭЛЕМЕНТИК ИЗ ПОДСВЕТКИ
if not uspeh then temporaryWordTrace[#temporaryWordTrace] = nil end
--ecs.error("Успех в конце = "..tostring(uspeh))
return uspeh
end
local function trace(massivSuda)
local nomerSlova, x, y, track = massivSuda[1], massivSuda[2], massivSuda[3], massivSuda[4]
local color = math.random(0x000000, 0xffffff)
--ecs.error("x="..x..", y="..y)
keyWordsColors[nomerSlova] = color
crossword[y][x][2] = color
for i = 1, #track do
x = x + track[i][1]
y = y + track[i][2]
crossword[y][x][2] = color
end
end
local function reshitCrossword()
for ySimvol = 1, #crossword do
for xSimvol = 1, #crossword[ySimvol] do
local yKeyWord = 1
while yKeyWord <= #keyWords do
--ЕСЛИ ПЕРВАЯ БУКВА КЛЮЧЕВОГО СЛОВА РАВНА СИМВОЛУ РАССМАТРИВАЕМОМУ
if keyWords[yKeyWord][1] == crossword[ySimvol][xSimvol][1] then
--ДУБЛИРОВАНИЕ МАССИВА, ПОТОМУШТО ТАК НУЖНО!!! ВОТ
-- local cyka = {}
-- for i = 1, #keyWords do
-- cyka[i] = {}
-- for j = 1, #keyWords[i] do
-- cyka[i][j] = keyWords[i][j]
-- end
-- end
--table.remove(cyka[yKeyWord], 1)
--ecs.error("#cyka[yKeyWord] = "..#cyka[yKeyWord]..", #keyWords[yKeyWord] = "..#keyWords[yKeyWord])
--yKeyWord = 3
temporaryWordTrace = {}
--ecs.error("Начинаю поиск слова №"..yKeyWord.." на x = "..xSimvol..", y = "..ySimvol)
if findWord(xSimvol, ySimvol, keyWords[yKeyWord], true ) then
--ecs.error("УСПЕХ! НАШЛО СЛОВО НОМЕР " .. yKeyWord .. ", его размер="..#keyWords[yKeyWord]..", #свет="..#temporaryWordTrace)
table.insert(globalWordTrace, {yKeyWord, xSimvol, ySimvol, temporaryWordTrace})
trace(globalWordTrace[#globalWordTrace])
--drawCrossword(2, 2, 0xeeeeee, 0x333333, 3, 1)
yKeyWord = yKeyWord + 1
--event.pull("key_down")
end
end
yKeyWord = yKeyWord + 1
end
end
end
end
------------------------------------------------------------------------------------------------------------------------
ecs.clearScreen(0x262626)
local vvod = ecs.input("auto", "auto", 20, "Кроссворд", {"input", "Путь к файлу кроссворда", "CrosswordFile.txt"}, {"select", "Как решить", "Быстро", {"Быстро", "Красиво"}})
local pathToCrossword = vvod[1]
local mode = vvod[2]
ecs.clearScreen(0xeeeeee)
getCrosswordFromFile(pathToCrossword)
drawCrossword(2, 2, 0xeeeeee, 0x333333, 3, 1)
reshitCrossword()
event.pull("key_down")
drawCrossword(2, 2, 0xeeeeee, 0x333333, 3, 1)