Luaレッスン4.4サンプル・ファイルの解読

原典:

http://compasstech.com.au/TNS_Authoring/Scripting/script_tut4.html

(1)Notes画面

f:id:ti-nspire:20140930084714j:plain

● newの値を表示する。

● newが更新されるたびに(すなわち正答であった場合に)a、bに新しい乱数を代入する(aは-5~5、bは1~5または-5~-1)。

● プログラムquiz(type)を実行する。

 

(2)プログラムquiz(type)

Define quiz(type)=
Prgm
©画面に表示する行数を4行とする。

:lines:=4

©スライダーtypeの値(1~4)に応じてline1にAdd、Subtractなどを代入し、line2には試験問題を文字列として代入する。

:If type=1 Then
:line1:="Add"
:line2:=string(a)&" + "&string(b)
:ElseIf type=2 Then
:line1:="Subtract"
:line2:=string(a)&" - "&string(b)
:ElseIf type=3 Then
:line1:="Multiply"
:line2:=string(a)&" × "&string(b)
:Else
:line1:="Divide"
:line2:=string(a)&" ÷ "&string(b)
:EndIf
©line2の内容(試験問題)を式に変換してquestionに代入

:question:=expr(line2)
©line3の内容(解答)を式に変換してresultに代入

:result:=expr(line3)
©正解であった場合はcheckに1を代入し、4行目にメッセージを代入

:If question=result Then
:check:=1
:line4:="Correct! Press enter for a new question."
:Else
©不正解であった場合はcheckに0を代入し、4行目にメッセージを代入

:check:=0
:line4:="Type to enter your answer"
:EndIf
:EndPrgm

 

(3)画面設計

f:id:ti-nspire:20140930085821j:plain

f:id:ti-nspire:20140930102201j:plain

(4)スクリプト

answer = "" -- answer(入力された文字を入れておく変数)に空の文字列を代入

function on.charIn(char) --キーボードから数字が入力されたら
     answer = answer..char -- answerの内容とキーボードからの入力文字とを連結
     var.store("line3",answer) -- Nspire変数line3にanswerの内容を代入
     platform.window:invalidate() -- 画面をリフレッシュ
end

function on.backspaceKey() -- バックスペースキーが押されたら
     answer = string.usub(answer,0,string.len(answer)-1) -- answerの末尾1文字を削除して再度answerに代入
     var.store("line3",answer) -- Nspire変数line3にanswerの内容を代入
     platform.window:invalidate() -- 画面をリフレッシュ
end

function on.enterKey() -- enterキーが押されたら
     local ch = (var.recall("check") or 0) -- Nspire変数checkの内容をchに代入
     local newer = (var.recall("new") or 1) -- Nspire変数newの内容をnewerに代入

if ch == 1 then -- 入力された答が正解であった場合は
     var.store("line3","") -- Nspire変数line3の内容を空白にする
     var.store("new",newer+1) -- Nspire変数newを1増分する
     answer = "" -- answerの内容を空白にする
     var.store("check",0) -- Nspire変数checkに0を代入
else -- 入力された答が不正解であった場合は
     answer = "" -- answerの内容を空白にする
     var.store("line3","Try again") -- Nspire変数line3に文字列"Try again"を代入する
end
     platform.window:invalidate() -- 画面をリフレッシュ
end

--- Nspire変数line1~4を画面に表示する
function on.paint(gc)
     local h=platform.window:height() -- ウィンドウの高さをhとする
     local w=platform.window:width() -- ウィンドウの幅をwとする
     local linecount = (var.recall("lines") or 1) -- linecountにNspire変数

     lines(画面に表示する行数)の値を代入
     local table = {} -- tableに空のリストを代入

for k = 1, linecount do
     if k == 1 then -- 1行目について
     gc:setFont("sansserif", "b", 10) -- フォントを設定
     gc:setColorRGB(20, 20, 138) -- 色を設定
     elseif k == 2 then -- 2行目について
     gc:setFont("sansserif", "b", 10) -- フォントを設定
     gc:setColorRGB(158, 5, 8) -- 色を設定
     else -- 3行目、4行目について
     gc:setFont("sansserif", "b", 10) -- フォントを設定
     gc:setColorRGB(158, 5, 8) -- 色を設定
end
     table[k] = (var.recall("line"..k) or "") -- table[1]にline1を、table[2]をline2を......代入する
     strwidth = gc:getStringWidth(table[k]) -- 画面に表示される各文字列幅を取得
     gc:drawString(table[k], w/2 - strwidth/2 ,h*(k)/(linecount+1),"middle") -- 画面に表示する各文字列の位置を設定
end

-- 3行目(答を入力する欄)を囲むボックスを設定
     gc:setColorRGB(20, 20, 138) -- 色を設定
     gc:setPen("medium", "smooth") -- 先のスタイルを設定
     gc:drawRect(0.1*w, h * (linecount-1)/(linecount+1)-0.1*h, 0.8*w, 0.2*h) -- ボックスを描く
end