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")