nikanquiz/kanji_learner.lua

228 lines
5.5 KiB
Lua

require "kanji_data"
require "helper_functions"
function GetUnrepeatedKanji(lAvoid)
lKanji = KanjiData[math.random(#KanjiData)]
for i=1, #lAvoid do
if lKanji == lAvoid[i] then
lKanji = GetUnrepeatedKanji(lAvoid)
break
end
end
return lKanji
end
function GetUnrepeatedReadingON(lAvoid)
lKanji = KanjiData[math.random(#KanjiData)]
if #lKanji.On == 0 then GetUnrepeatedKanji(lAvoid) end
for j=1, #lKanji.On do
for i=1, #lAvoid do
if lKanji.On[j] == lAvoid[i] then
lKanji = GetUnrepeatedKanji(lAvoid)
break
end
end
end
return GetOneFrom(lKanji.On)
end
function GetUnrepeatedReadingKUN(lAvoid)
lKanji = KanjiData[math.random(#KanjiData)]
if #lKanji.Kun == 0 then GetUnrepeatedKanji(lAvoid) end
for j=1, #lKanji.Kun do
for i=1, #lAvoid do
if lKanji.Kun[j] == lAvoid[i] then
lKanji = GetUnrepeatedKanji(lAvoid)
break
end
end
end
return GetOneFrom(lKanji.Kun)
end
function GetOneFrom(Table)
if type(Table) == "table" then
return Table[math.random(#Table)]
elseif type(Table) == "string" then
return Table
else
return "oopsie"
end
end
function AskMeaning4Kanji()
CurrentKanji = KanjiData[math.random(#KanjiData)]
table.insert(AvoidList,CurrentKanji)
io.write(TextColor("Q: ",COLOR.HighBlue).."What does "..CurrentKanji.Symbol.." mean? \n")
io.write("\n")
for i=1, 4 do
if i == Solution then
io.write(TextColor(" ("..i..") ",COLOR.HighYellow)..GetOneFrom(CurrentKanji.Meaning))
io.write("\n")
else
lRandomKanji = GetUnrepeatedKanji(AvoidList)
table.insert(AvoidList,lRandomKanji)
io.write(TextColor(" ("..i..") ",COLOR.HighYellow)..GetOneFrom(lRandomKanji.Meaning))
io.write("\n")
end
end
end
function AskKanji4Meaning()
CurrentKanji = KanjiData[math.random(#KanjiData)]
table.insert(AvoidList,CurrentKanji)
io.write(TextColor("Q: ",COLOR.HighBlue).."Which is the kanji for \""..GetOneFrom(CurrentKanji.Meaning).."\"? \n")
io.write("\n")
for i=1, 4 do
if i == Solution then
io.write(TextColor(" ("..i..") ",COLOR.HighYellow)..CurrentKanji.Symbol)
io.write("\n")
else
lRandomKanji = GetUnrepeatedKanji(AvoidList)
table.insert(AvoidList,lRandomKanji)
io.write(TextColor(" ("..i..") ",COLOR.HighYellow)..lRandomKanji.Symbol)
io.write("\n")
end
end
end
function AskReadingON4Kanji()
CurrentKanji = KanjiData[math.random(#KanjiData)]
local Reading = GetOneFrom(CurrentKanji.On)
for i=1, #CurrentKanji.On do
table.insert(AvoidList,CurrentKanji.On[i])
end
io.write(TextColor("Q: ",COLOR.HighBlue).."Which is a On reading of \""..GetOneFrom(CurrentKanji.Symbol).."\"? \n")
io.write("\n")
for i=1, 4 do
if i == Solution then
io.write(TextColor(" ("..i..") ",COLOR.HighYellow)..Reading)
io.write("\n")
else
lRandomONReading = GetUnrepeatedReadingON(AvoidList)
table.insert(AvoidList,lRandomONReading)
io.write(TextColor(" ("..i..") ",COLOR.HighYellow)..lRandomONReading)
io.write("\n")
end
end
end
function AskReadingKUN4Kanji()
CurrentKanji = KanjiData[math.random(#KanjiData)]
local Reading = GetOneFrom(CurrentKanji.Kun)
for i=1, #CurrentKanji.Kun do
table.insert(AvoidList,CurrentKanji.Kun[i])
end
io.write(TextColor("Q: ",COLOR.HighBlue).."Which is a Kun reading of \""..GetOneFrom(CurrentKanji.Symbol).."\"? \n")
io.write("\n")
for i=1, 4 do
if i == Solution then
io.write(TextColor(" ("..i..") ",COLOR.HighYellow)..Reading)
io.write("\n")
else
lRandomKUNReading = GetUnrepeatedReadingKUN(AvoidList)
table.insert(AvoidList,lRandomKUNReading)
io.write(TextColor(" ("..i..") ",COLOR.HighYellow)..lRandomKUNReading)
io.write("\n")
end
end
end
QuestionType = Enum {
"KANJI4MEANING",
"MEANING4KANJI",
"READINGON4KANJI",
"READINGKUN4KANJI"
}
function Ask(Ttpe)
local Type = Ttpe or math.random(#QuestionType)
Solution = math.random(4)
AvoidList = {}
if Type == QuestionType.KANJI4MEANING then
AskKanji4Meaning()
elseif Type == QuestionType.MEANING4KANJI then
AskMeaning4Kanji()
elseif Type == QuestionType.READINGON4KANJI then
AskReadingON4Kanji()
elseif Type == QuestionType.READINGKUN4KANJI then
AskReadingKUN4Kanji()
end
io.write("\n")
io.write(TextColor("A: ",COLOR.HighPurple))
end
function Check(answer)
if answer == "" then
io.write("\027[1F".."\027[3C")
Check(io.read())
else
io.write("\n")
if answer == tostring(Solution) then
io.write(TextColor("Correct!",COLOR.HighGreen))
io.write(TextEffect(TextColor(" [Streak +1]",COLOR.HighCyan),EFFECT.BlinkFast))
Streak = Streak + 1
Correct = Correct + 1
else
io.write(TextColor("Wrong!",COLOR.HighRed).." Answer is ("..Solution..")")
if Streak >= 5 then io.write(TextEffect(TextColor(" ["..Streak.." Streak Lost]",COLOR.Cyan),EFFECT.BlinkFast)) end
Streak = 0
Wrong = Wrong + 1
end
UpdateProgress()
io.write("\n")
io.read()
end
Total = Total + 1
end
function ShowProgress()
io.write("\027[2K#"..tostring(Total+1).."\t")
io.write("Right: "..TextColor(tostring(Correct),COLOR.HighGreen).."\t")
io.write("Wrong: "..TextColor(tostring(Wrong),COLOR.HighRed).."\t")
if Streak >= 5 then
io.write(
TextEffect(TextColor("CURRENT STREAK: ", COLOR.HighCyan),EFFECT.BlinkFast)..
TextEffect(TextColor(Streak,COLOR.White),EFFECT.BlinkFast)
)
end
io.write("\n")
end
function UpdateProgress()
io.write("\027[s")
io.write("\027[1;1H")
ShowProgress()
io.write("\027[u")
end
Correct = 0
Total = 0
Streak = 0
Wrong = 0
math.randomseed(os.time())
while 1 do
os.execute("clear")
ShowProgress()
Ask()
response = io.read()
Check(response)
end
os.execute("clear")