228 lines
5.5 KiB
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") |