09: 算数クイズ 2

この章の概略
  • 前章の「足し算クイズ」を「足し算・引き算クイズ」に作り替えます。
  • ビルトイン・ファンクションの説明の後、カスタム・ファンクションの作成と使用法。
  • メッセージの伝わり方と、プライベートと言う事。オーナーとターゲットについて。
  • カスタム・コマンドを作って、同じスクリプトで違うグループの解答を調べます。
  • リピートで繰り返して、3問出題の問題を1回のボタン・クリックで作ります。

この章では、カスタム・ファンクションと、カスタム・コマンド、それとリピートの基本を学ぶのが主な目的です。LiveCodeのプログラミングは、日常英語のような簡単な言い回しで、コンピュータと会話できるコードを、順序立てて自分で組み立てられるかの訓練です。公式のように言い回しは厳密に覚える必要はなく、必要なら調べ直せば良いと思うくらいの軽い気持ちで進めてください。どんな方法でもうまく動けばそれが正解です。カスタム・ファンクションも、カスタム・コマンドも、もともとLiveCodeにビルトインされている言葉と形の上ではそう違いはなくて、それが自作できるようになっています。コードを書くのが少し慣れてきたら、小さな単位でも、まとめてファンクションやコマンドにして行くような習慣が必要かもしれません。そうして行けば、カスタム・ファンクションや、カスタム・コマンドの便利さも分かって、プロジェクト全体の流れを見ながらコードを書いて行く習慣も出てきます。


足し算・引き算クイズ

前章のスタック「足し算クイズ」に、引き算も加えて「足し算・引き算クイズ」にします。まず始めにプラス記号のあるテキスト・フィールドの名前(Name)を「plusMinus」にしてください(下図)。算数問題を作る時にランダム(random)を使って、このテキスト・フィールドの記号を「+」または「-」に変えます。



前章で使った「足し算クイズ」のボタン「問題を作る」のスクリプトを見てみます。スクリプト中「--」の付いた日本語は説明(コメント)です。

-- ボタンがマウスでクリックされたら
on mouseUp

   -- 1から100までのランダムの数を、それぞれのフィールドに入れる
   put the random of 100 into field "number1"
   put the random of 100 into field "number2"
   
   -- 解答のフィールドは空白にする
   put empty into field "tAnswer1"
   
-- mouseUpハンドラーから抜ける
end mouseUp

このスクリプトのどこかの行に、ランダム(2)で得た数字で「プラス」か「マイナス」かを割り振って、フィールド「plusMinus」に入れれば良い訳です。その部分を赤で最後に書き加えます。

on mouseUp
   put the random of 100 into field "number1"
   put the random of 100 into field "number2"
   put empty into field "tAnswer1"
   get the random of 2
   if it is 1 then 
      put "+" into field "plusMinus"
   else 
      put "-" into field "plusMinus"
   end if
end mouseUp

赤文字だけの説明です。「1」か「2」の数字をランダムに発生させて、ゲット(get)で「it」の中に取り込みます。もし「it」が「1」ならばフィールド「plusMinus」にプラス記号、そうではなく(else)「2」ならばフィールド「plusMinus」にマイナス記号を入れます。1行づつ読んで行けば、そう難しい英語ではありません。これで「問題を作る」スクリプトはできました。ボタン「問題を作る(question1)」のスクリプト・エディター中に書き込みます。

今度は、前章で作った「足し算クイズ」のボタン「答えは?(tAnswer1)」のスクリプトを見てみます。スクリプト中「--」の付いた日本語の行は説明(コメント)です。

-- ボタンがマウスでクリックされたら
on mouseUp

   -- フィールドの答えを「tAnswer1」と言うコンテナーに入れる
   put field "tAnswer1" into tAnswer1 
   
   -- もし「tAnswer1」が数字でなかったら、if内を実行してmouseUpから抜ける
   if isNumber(tAnswer1) is false then 
      beep
      answer "Your answer is not a number."
      select the text of field "tAnswer1"
      exit mouseUp
   end if
   
   -- 問題のフィールドをコンテナー「tNumber1」「tNumber2」に入れる
   put field "number1" into tNumber1
   put field "number2" into tNumber2 
   
   -- 計算式が真ならば、正解のダイアログを出す
   -- 計算式が偽ならば、ビープ音を鳴らし間違いのダイアログを出す
   if tNumber1 + tNumber2 = tAnswer1 then
      answer "Very Good! You are a Genius."
   else
      beep
      answer "Sorry, Wrong Answer."
   end if
   
-- mouseUpハンドラーから抜ける
end mouseUp

「足し算クイズ」ですから、足し算の場合だけを考えています。青文字にしているスクリプトは、プラス記号にだけ対処してあるので、「足し算・引き算クイズ」では、if文を使ってプラス記号の場合とマイナス記号の振り分けを作り、さらにそれぞれの正解、不正解のスクリプトを作ります。

if文でプラス記号の場合と、マイナス記号の場合に対処した部分だけを書きます。「--」の後の日本語は説明(コメント)ですが、スクリプトに書き込む時は削除してださい。スクリプト・エディターの中に日本語は書き込めません。
LiveCode 7 注:
LiveCde 7はスクリプト・エディターの中に日本語のコメントが書き込めます。


if field "plusMinus" is "+" then  
   -- プラス記号の場合(足し算クイズと同じ)
   if tNumber1 + tNumber2 = tAnswer1 then
      answer "Very Good! You are a Genius."
   else
      beep
      answer "Sorry, Wrong Answer."
   end if
else   -- プラス記号でなかったら
   -- ここにはマイナス記号の場合のスクリプトが来ます。
   if tNumber1 - tNumber2 = tAnswer1 then
      answer "Very Good! You are a Genius."
   else
      beep
      answer "Sorry, Wrong Answer."
   end if
end if

プラス記号の場合の青文字はそっくりそのまま前回のスクリプトです。マイナス記号の赤文字は、青文字のプラスがマイナス記号に変わっただけです。この上にあるスクリプトを、ボタン「答えは?(tAnswer1)」のマウスアップ・ハンドラーを含めて全部書きます。

on mouseUp
   put field "tAnswer1" into tAnswer1
   if isNumber(tAnswer1) is false then 
      beep
      answer "Your answer is not a number."
      select the text of field "tAnswer1"
      exit mouseUp
   end if
   put field "number1" into tNumber1
   put field "number2" into tNumber2
   -- ここから下が変更部分 
   if field "plusMinus" is "+" then  -- プラス記号の場合
      if tNumber1 + tNumber2 = tAnswer1 then
         answer "Very Good! You are a Genius."
      else
         beep
         answer "Sorry, Wrong Answer."
      end if
   else  -- プラス記号でなかったら(マイナス記号の場合)
      if tNumber1 - tNumber2 = tAnswer1 then
         answer "Very Good! You are a Genius."
      else
         beep
         answer "Sorry, Wrong Answer."
      end if
   end if
end mouseUp

赤文字部分には「if」で始まる文が3つあります。始めの「if」は大きく包括して「end if」が赤文字の最後の行に来ています。この「if文」は「else」で2つに分けられ、その中にもうひとつの仮定の「if文」がそれぞれ入って、やはり「else」で分けられ「end if」で終わります。どの「if」が、どの「end if」で終わっているかを確認しながらコードを書いて行くのは、とても重要です。


カスタム・ファンクションを作る

スクリプトを書き換えて「足し算・引き算クイズ」になりました。次のステップで、これを使って簡単な「カスタム・ファンクション(custom function)」と「カスタム・コマンド(custom command)」を作ります。現在のままでも機能としては働きますが、違う形に整理して、もう少しプログラミングらしさが使えるようにします。

カスタム・ファンクションは、計算したある値や、スクリプトである事を導き出した結果を返す、単体のパーツとも言える機能で、その機能から導いた結果は、カスタム・ファンクションを定義した時に付けた名前を使って、コンピューターに指令する文面(ステートメント statement)に組み込まれます。LiveCodeにはビルトイン(buit-in)・ファンクションと言うのがもともと用意してあって、これまでにも「random」や「isNumber」などのファンクションを使ってきました。ビルトイン・ファンクションは、2通りの表記ができます。

the date   -- 日付を取得する
the random of 100   -- 1から100までの数字を無作為にひとつ選び出す
the isNumber of field "tAnswer1"   -- フィールド「tAnswer1」が数字か判断する

date()
random(100)
isNumber(field "tAnswer1")

上3行のプレインな英語的言い回しでは、「the ファンクション名 of ある値」のような形を取ります。日付を取得する「the date」は「of ある値」のようなパラメータ(parameter)はありません。まったく同じ意味のもうひとつ別な形では、下3行の『ファンクション名 カッコ(ある値・状態・パラメータ)カッコ閉じる』のようにも書く事ができます。「date()」のようにパラメータ(parameter)を取らないファンクションのカッコ内は、空白になります。

カスタム・ファンクションは、ファンクション・ハンドラーと言われる形を取って、その意味の内容から返す事柄・値を決めます。これをファンクションを定義(definition)すると言っています。ファンクション・ハンドラーは、始めの行が「function」で始まり、「ファンクション名」が続き、その行の最後に必要なら「パラメータ parameter」が来ます。その後行を変えてある何かを導き出す一連の指示の行が来て、その結果が「return」で返され、最後は必ず「end ファンクション名(始まりと同じ名前)」で終わります。この下にカスタム・ファンクションの型を書きました。パラメータ(parameter)は、上に説明したビルトイン・ファンクションのプレインな英語的言い回しの「of ある値」に相当する、ファンクションを実行する際に指定で変わる値です。パラメータがないカスタム・ファンクションも、幾つも使うカスタム・ファンクションもあります。

function ファンクション名 パラメータ1, パラメータ2
 ある事を導き出す指示とそのプロセスのステートメントの行
 return プロセスの結果
end ファンクション名

具体的な文面を見た方が分かりやすいでしょう。では「足し算・引き算クイズ」のボタン「問題を作る(question1)」に、この章で作った新しいスクリプト部分を「plusOrMinus」と言う名前のカスタム・ファンクションにします。このファンクションにはパラメータはありません。赤文字の行がカスタム・ファンクションの定義です。

function plusOrMinus 
   get the random of 2
   if it is 1 then 
      return "+"
   else 
      return "-" 
   end if
end plusOrMinus

get the random of 2
if it is 1 then 
      put "+" into field "plusMinus"
   else 
      put "-" into field "plusMinus"
end if

緑文字で書いてあるのは、上で作った「足し算・引き算クイズ」で使ったスクリプトです。違いはカスタム・ファンクションでは、始めの行でこれはファンクションであると言う「function」+ 「plusOrMinus (ファンクション名)」が入っている事と、「retrun」でプラス記号かマイナス記号を返しています。そうでない方は、フィールドの中に直接記号を入れています。

カスタム・ファンクションをステートメントに組み込むには、「plusOrMinus()」(ファンクション名 + カッコ)にします。ビルトイン・ファンクションの「of ある値」を使った、英語表現はできません。ステートメントの中でカスタム・ファンクションを使うのを、LiveCodeではファンクションを呼び出す(Call)と呼んでいます。下の例ではカスタム・ファンクションを一カ所だけで使っていますが、カスタム・ファンクションの利点は、短い言葉で同じ処理の情報を何カ所にも使うことができたり、定義の修正だけで、呼び出されたファンクション全てを一度に修正ができる利点があります。

以下が、ボタン「問題を作る(question1)」に入れる、カスタム・ファンクションを使った全部のスクリプトです。「--」の付いている日本語は説明(コメント)ですから、スクリプトで使う時は削除してください。スクリプト・エディターに日本語は書き込めません。

on mouseUp
   put the random of 100 into field "number1"
   put the random of 100 into field "number2"
   put empty into field "tAnswer1"
   
   -- ファンクション名() で呼び出し「1」または「2」が返される
   put plusOrMinus() into field "plusMinus" 
end mouseUp

function plusOrMinus 
   get random(2)
   if it is 1 then 
      return "+"   -- 呼び出された時プラス記号を返す
   else 
      return "-"   -- 呼び出された時マイナス記号を返す
   end if
end plusOrMinus

図1:エディター(左にオブジェクト内のハンドラーの一覧、右は書かれたスクリプト)



図2:呼び出しているファンクション名からコンテキスト・メニューを出す



上図はどちらもボタン「問題を作る(question1)」のスクリプト・エディターです。図1は、左のハンドラーの一覧からハンドラー名をセレクトすると、右にあるそのハンドラー名が選ばれます。図2は呼び出しているファンクションからコンテクスト・メニューが出ますから、そのファンクションの定義(definition)がどこにあるかを見つける時に使います。ここでは一つだけのファンクションですが、数が増えて来ると非常に便利です。

この例では定義(definition)しているファンクションと、呼び出されて使われているファンクション(ファンクション名+カッコ)とが、同じオブジェクトの中にあります。幾つものオブジェクトから、ひとつのファンクションを呼び出すようにするには、マウスアップ等のアクションが、メッセージとしてLiveCodeのエンジンに伝わって行くルートの上位に、ファンクションの定義(definition)が置かれていなければいけません。LiveCodeは、もしオブジェクト内にファンクション・ハンドラーが見あたらなかったら、メッセージが伝わるルート(メッセージ・パス)の上位に、ファンクションの定義を探しに行きます。もしカード上の幾つかのボタンから「plusOrMinus()ファンクション」が呼び出されるとすると、この「plusOrMinus」ファンクションの定義は、ボタンが置いてあるカードのスクリプト・エディターの中か、さらに上位のスタックのスクリプト・エディターの中に書かれていなければいけません。このメッセージをエンジンまで伝える階層のルートを、メッセージ・パス(message path)と呼んでいます。


プライベート「private」

グローバル(global)とローカル(local)について話した事と少し似ていて、呼び出されるファンクションが、同じオブジェクト内(ローカル)で定義されているのを、LiveCodeではプライベート(private)と言って、「function」の前にキーワードの「private」を付ける事ができます。これは必ず付けなければいけない言葉ではありません。プライベート(private)を付ける事によって、LiveCodeエンジンが上位階層にカスタム・ファンクションを探しに行く必要がなくなって、それだけ処理スピードを早めます。

private function plusOrMinus 
   get random(2)
   if it is 1 then 
      return "+"   
   else 
      return "-"   
   end if
end plusOrMinus

プライベート(private)は同じオブジェクト内だけで使えるキーワードですから、メッセージの伝わる別な階層で使うとエラーになります。 プライベート(private)はカスタム・ファンクション(custom function)だけでなく、これから学ぶカスタム・コマンド(custom command)でも使われます。


カスタム・コマンドを作る

これもファンクションのように、LiveCode自体に用意されている「create」「set」「put」等のようなビルトイン・コマンドがあります。カスタム・コマンド(custom command)は、日本語で言う「命令語」をカスタムで作ります。ビルトイン・コマンドのような、日常英語のように使える柔軟性はあまりませんが、長い記述のコマンドを、短い言葉に短縮して何度も使う事ができます。LiveCodeに類似した、日常英語のような他のコンピュータ言語(HyperTalk、SuperTalk等)では

on コマンド名 パラメータ1, パラメータ2
 -- カスタムで作る命令語のステートメントがここに来る
end コマンド名

のように、「on + コマンド名」で始まり、必要によって「パラメータ」、行を変えて「命令語のステートメント」、最後は「end + コマンド名」で終わります。LiveCodeでもこの伝統的な形のカスタム・コマンドは使えますが、前述のプライベート(private)を使う事もあって、下のようにコマンドを作ります。

同じオブジェクト内にプライベートでカスタム・コマンドを定義する場合
private command コマンド名 パラメータ1, パラメータ2
 -- カスタムで作る命令語のステートメントがここに来る
end コマンド名

メッセージ・パス(message path)の上位に置く場合
command コマンド名 パラメータ1, パラメータ2
 -- カスタムで作る命令語のステートメントがここに来る
end コマンド名

カスタム・コマンドを使う場合は、
コマンド名, パラメータ1, パラメータ2
のように完結する独立した行で記述して、ビルトイン・コマンドのように、「to」や「into」などのキーワードと一緒に、ステートメントの中の言葉として使う事はできません。

それでは「足し算・引き算クイズ」でカスタム・コマンドと、プライベートでないカスタム・ファンクションを作ってみます。カード上にボタン「答えは?」を3つ作って、それぞれのボタンから、カスタム・コマンドを使います。このカスタム・ファンクションとカスタム・コマンドの定義は、必ずカードより上位のメッセージ・パスになければいけません。最後にひとつだけの「問題を作る」ボタンで、3問出題できる「足し算・引き算問題」のスクリプトを作ります。

始めに今カード上にあるボタン2つと、フィールド5つをまとめてセレクトしたら、「Objectメニュー > Group Selcted」を選んで「group 1(グループ1)」を作ります。「グループ1」ができたら、Mac OSはオプション・キー(Windowsはオルト・キー)を押しながら、「グループ1」をドラッグしてコピーの「グループ2」と「グループ3」を作ってください。「グループ1」のボタン「問題を作る(question1)」だけ残して、「グループ2」と「グループ3」のボタン「問題を作る(question1)」は削除します。削除はアプリケーション・ブラウザーからでも、アイコン・メニューの「Edit Group」からでも、どちらからでもできます。グループのナンバーは、階層の下のレイヤーから1,2,3と振られて行きます。最後に作ったグループは、ナンバー「3」です。レイアウト上ナンバーを入れ替えたいときは、グループのインスペクターの「Size & Position」でナンバー(Number)を変えられます。

図:グループのコピー



図:グループ1、グループ2、グループ3



カスタム・コマンドを使う「答えは?」の方から作って行く事にしましょう。どのグループでも良いですからボタン「答えは? tAnswer1」のスクリプト・エディターを開きます。ボタンはグループ内にあるので、エディット・ツールでグループをセレクトしてアイコン・メニューの「Edit Group」をクリックして、ボタンをセレクトするか、ブラウズ・ツールでMacOSなら「オプション+コマンド・キー」、Windowsでは「コントロール+オルト・キー」でターゲットの オブジェクトをクリックすれば、スクリプト・エディターが開きます。

エディターを開いたら、マウスアップのスクリプトを「on mouseUp」「end mouseUp」だけ残して全てカットして、カードのスクリプト・エディターにペーストします。カードのスクリプト・エディターはカード上のどこでもマウスで、MacOSなら「コマンド+オプション+シフト・キー」、Windowsなら「シフト+コントロール+オルト・キー」でクリックすると、コンテキスト・メニューが出ますから、「Edit Card Script」を選びます。または「Objectメニュー > Card Script」を選びます。



ボタン「答えは? tAnswer1」からカットしたスクリプト(上図)をカードのスクリプト・エディターにペーストしたら、始めに「command tAnswer pGroupNum」の行を書き入れ、最後には「end tAnswer」の行を書き足します。このカスタム・コマンドの名前は「tAnswer」です。このカードの上にはグループのレイヤーが3つあって、同じ名前のテキスト・フィールドもそれぞれのグループにあります。スクリプトから何かの指示を、同じ名前のオブジェクトに出した場合、最下位のレイヤーにあるオブジェクトと判断されます。それを避けるにはどのグループに、そのオブジェクト(この場合はフィールド)が属しているかがキーとなります。この例ではグループ・ナンバーをパラメータ(parameter)として使い分ける事にしましょう。

カードにある「答えは?」の3つのボタンから送るコマンドは、それぞれグループ・ナンバーを差し替えて、カード内にあるカスタム・コマンド「tAnswer」の定義を読み取ると言う事になります。一般的にLiveCodeディベロッパーは、パラメータの定義でどの言葉がパラメータなのか分かるように、頭に「p」の文字を付けて使うことが多いので、それに倣ってここでも「pGroupNum」と言うパラメータにしました。「グループ1のボタン」から送られるときは「1」、「グループ2のボタン」から送られるときは「2」と、差し替えてコンピュータに読まれる事となります。

変更部分に1行だけグループ・ナンバーではない行があります。ボタンの中でマウスアップ・ハンドラーに書かれていた「exit mouseUp」は、ハンドラーのマウスアップから抜ける指示でしたが、カスタム・コマンドのハンドラーは「command tAnswer」になっているので「exit mouseUp」を使うとエラーになってしまいます。この行は「exit to top」にし変更ます。「exit to top」は、現在のハンドラー(command tAnswer)も、他の経過中のハンドラー(mouseUp)も、すべての実行を中断させます。カードにペーストしたスクリプトに、新しく書き加えられた部分を赤文字にしています。

command tAnswer pGroupNum
   put field "tAnswer1" of group pGroupNum into tAnswer1
   if isNumber(tAnswer1) is false then 
      beep
      answer "Your answer is not a number."
      select the text of field "tAnswer1" of group pGroupNum
      exit to top    -- この行だけグループ・ナンバーではない変更
   end if
   put field "number1" of group pGroupNum into tNumber1 
   put field "number2" of group pGroupNum into tNumber2
   if field "plusMinus" of group pGroupNum is "+" then
      if tNumber1 + tNumber2 = tAnswer1 then
         answer "Very Good! You are a Genius."
      else
         beep
         answer "Sorry, Wrong Answer."
      end if
   else
      if tNumber1 - tNumber2 = tAnswer1 then
         answer "Very Good! You are a Genius."
      else
         beep
         answer "Sorry, Wrong Answer."
      end if
   end if
end tAnswer

実はもうひとつ解答するフィールドでリターンがされた時、「答えは?」のボタンに「mouseUp」を送るカスタム・コマンドが必要です。こちらは「fldReturn」と言う名前のカスタム・コマンドで、パラメータはありません。パラメータの変わりに別な新しい言葉「target」と「owner」を使う事にします。
	
command fldReturn
   send mouseUp to button "tAnswer1" of the owner of the target 
end fldReturn

「target」は、クリック等のアクションが行われたオブジェクト名を指します。別な表現では、「メッセージの実行のスタートが受け取られたオブジェクト名を返す」と言う内容になります。もうひとつの「owner」のこのスクリプトでの意味は、オブジェクトが属しているグループ名です。LiveCodeの言葉としての意味では、ひとつ、ひとつのオブジェクトには、それぞれオーナーが決まっていて、コントロール、グループ、カード、スタックと言う階層の「object hierarchy オブジェクト・ハイアラキー」で使われる、ひとつ上位の階層を「owner オーナー」と言っています。オブジェクト・ハイアラキーとは、上位のオブジェクトのカラーやフォント等のプロパティに、下位のオブジェクトが従う決まりがあります。これについては、そういう事柄があるというだけにここでは留めます。

図:2つのコマンドの定義が書かれた、カードのスクリプト・エディター。



on mouseUp
   tAnswer 1
end mouseUp

 グループ1のボタン「答えは?」に入れるスクリプト

on returnInField fldReturn end returnInField

 グループ1のフィールド「tAnswer1」に入れるスクリプト

on mouseUp tAnswer 2 end mouseUp

 グループ2のボタン「答えは?」に入れるスクリプト

on returnInField fldReturn end returnInField

 グループ2のフィールド「tAnswer1」に入れるスクリプト

on mouseUp tAnswer 3 end mouseUp

 グループ3のボタン「答えは?」に入れるスクリプト

on returnInField fldReturn end returnInField

 グループ3のフィールド「tAnswer1」に入れるスクリプト

以上をグループ内のそれぞれのボタン「答えは?」と解答欄のフィールドに入れます。


リピート「repeat」でループを作る

最後に、出題を一度に3問作り出すボタン「問題を作る」に取りかかりましょう。これは「足し算・引き算クイズ」で使った出題と、ほぼ同じスクリプトを3回続けて使って、毎回違うグループのテキスト・フィールドに、数字とプラス・マイナス記号を入れて行きます。これには「repeat リピート」と言う、同じステートメントを繰り返してループを作り出す、コントロール・ストラクチャーを用います。簡単なリピートの説明から始めます。「add」は数字の入っているバリアブル(下の例では「tNumber」。仮に値を入れておくコンテナー)に数字を足して、値を変えるコマンドです。

put 10 into tNumber  -- tNumberと言うコンテナーに10を入れる
repeat 3 times   -- 同じステートメントを3回繰り返す(ループ)
  add 2 to tNumber   -- tNumberに2を加える
end repeat   -- 繰り返し終わり
put tNumber    -- tNumberをメッセージ・ボックスに

 10 + 2 x 3 と同じ結果になります。

リピートを構成する基本的な形は「repeat 」+「ループの回数指示(ループフォルム LoopForm)」、行を変えて「どういう作業を行うかのリスト」に従って、指定された回数だけ作業を行い、最後に「end repat」でループから抜けます。上のループの回数指示(ループフォルム LoopForm)は「3 times」でしたが、これ以外にも「forever (永久に)」とか「until 何々になった場合(コンディション)」などのループフォルムがあります。

ボタン「問題を作る」では「with カウンターに使う文字 = 始めの数字 to 終わりの数字」と言うループフォルムを使います。こういう場合の「ループ・カウンター」によく使われる文字の「i」にしています。これは「integer 整数」の頭文字をループ・カウンターとして使う慣用的な用法で、「X」でも「j」でもスクリプト中で支障のない文字であれば何でもかまいません。

repeat with i=1 to 3   -- i の数字がループで1から3まで変わります
  -- ループの都度グループ・ナンバーの数字 i が変わって行きます。
  put the random of 100 into field "number1" of group i
  put the random of 100 into field "number2" of group i
  put empty into field "tAnswer1" of group i
  put plusOrMinus() into  field "plusMinus" of group i
end repeat

青文字は出題がひとつだけのボタン「問題を作る」にあったスクリプトと同じです。3問出題のボタン「問題を作る」のスクリプト・エディターは下のようになります。ファンクション「plusOrMinus」は、ボタン「question1 問題を作る」の中だけで呼び出されるので、定義に「private」を付けています。

図:ボタン「question1 問題を作る」のスクリプト・エディター




Tips

  • 「if」を使った仮定文に、入れ子状態でまた別な「if文」を組み込んで行く場合、それぞれの「if」がどの「else」で仮定が分けられ、どの「end if」で終わるか、いつも確認しながら書き進めます。

  • スクリプト・エディターの左のコラムに出るハンドラー名の一覧から、目的のハンドラーをクリックすると、右のステートメントからその定義を探し出す事ができます。

  • スクリプト・エディターの右のステートメントで呼び出されているファンクション名、使われているコマンド名から、コンテクスト・メニューを引き出すと、その定義を見つける事ができます。

  • 同じオブジェクト内にあるファンクションに呼び出される、定義しているファンクション・ハンドラーの始めに「privateキーワード」を付けると、処理のスピードが早くなります。

  • ファンクションの定義は、呼び出すファンクションと同じオブジェクト内か、メッセージ・パス(message path)の上位に置かなくてはいけません。

  • 一般的にLiveCodeディベロッパーは、パラメータ定義でどの言葉がパラメータなのか分かるように、頭に「p」の文字を付けて使う事が多いです。

  • オブジェクト・ハイアラキー(object hierarchy)によって、上位のオブジェクトのカラーやフォント等のプロパティに、下位のオブジェクトが従う決まりがあります。

  • カードのスクリプト・エディターは「Objectメニュー」から「Card Script」を選ぶか、カード上どこでも右クリックして、コンテキスト・メニューから「Edit Card Script」を選びます。


この章で新しく出て来た言葉

date

ファンクッション(function) 日付けを返す

the date
date()

function

コントロール・ストラクチャー(control structure)
カスタム・ファンクション ハンドラーを定義する

function plusOrMinus

return

コントロール・ストラクチャー(control structure)
ハンドラーからある値を返す

return someValue

private

キーワード(keyword) 
ファンクションかコマンドの頭に付いてオブジェクト内に定義があるかを示す

private function myFunction
private command myCommand

owner

プロパティ(property) オブジェクトのひとつ上の階層を指し示す

the owner of buttom 1

target

ファンクション(function) メッセージがスタートした時点のオブジェクトの名前を返す

the target

command

コントロール・ストラクチャー(control structure)
コマンドを定義するメッセージ・ハンドラー 同義語:on

command myCommand pNumber

add

コマンド(command) あるコンテナー(variable)に入っている数字に、別な数字を加える

add 3 to tNumber

repeat

コントロール・ストラクチャー(control structure) あるステートメントを繰り返す

repeat 3 times
repeat with i=1 to 5




08: 算数クイズ1

10: テキスト・フィールド




ⓒ 小島健治 / Kenji Kojima

 

 
この章で使われる英単語