トップ 差分 一覧 Farm ソース 検索 ヘルプ PDF RSS ログイン

チュートリアル 2: LoopとIf

If

Ifはとある状況を満たした際にのみ実行されるコードの塊です。例えば、こんな感じです。

if name == "bob"
if a < 4
if answer == "correct"

など。

以下ようにしてIfのコードを書いていきます。

SCREEN_BOTTOM = 0
BGBotText = Screen.LoadTextBG()
Screen.Initialize( SCREEN_BOTTOM, BGBotText )

language = DSLua.Language()
if language == 1 then
     BGBotText:PrintXY( 1, 1, "Hello!" )
end
if language == 2 then
     BGBotText:PrintXY( 1, 1, "Bonjour!" )
end

DSLua.WaitForAnyKey() 

このプログラムがすることは、DS本体設定の言語が英語なら"Hello!"と画面に表示し、DSの言語がフランス語なら "Bonjour!"と表示することです。
コードを見ることで、If文をどのようにして作るかが理解できるでしょう。

そして、これだけは覚えてください。
2つの変数や数字,文を比較するときは==を使用します。変数に数字を割り当てる場合は=を使用します(y=2 のように)。
この2つを取り違えないようにしてください!

ただ、==は2つの値が等しいかどうかを調べるだけなので、ある値が他の値より小さいかどうか、とか、2つの値が等しくないかどうか、を調べたいときはどのようにすれば良いのでしょうか。

以下にIfのような条件文で使用可能な演算子(記号)の一覧を記載します。

記号 説明
== if a == 1 then Aと1が等しい場合、then以下に続くコードを実行
~= if a ~= 1 then Aと1が等しくない場合、then以下に続くコードを実行
< if a < 1 then Aが1より小さい場合、then以下に続くコードを実行
> if a > 1 then Aが1より大きい場合、then以下に続くコードを実行
<= if a <= 1 then Aが1より小さいか,1と同じ場合、then以下に続くコードを実行
>= if a >= 1 then Aが1より大きいか,1と同じ場合、then以下に続くコードを実行

If文には else, elseif, and, orのオプションがあります。

else

if文がfalse値を返した際(つまり、if以下のコードが実行されなかったとき)にelse以下のコードを実行します。

if AAA then
	BBB
else 
	CCC
(AAAならBBBを実行。そうでないならCCCを実行)

elseif

elseのようにif文がfalseを返した際にのみ実行されるifです。

if AAA then
	BBB
elseif CCC
	DDD
elseif EEE
	FFF
else
	GGG
(AAAならBBBを実行。そうでなくCCCならDDDを実行。そうでもなくEEEならFFFを実行。全部違うならGGGを実行)

and

複数の条件を課すことができます。andでつながれた全ての条件を満たしたときだけ、以下のコードを実行します。

or

andと同じように使えますが、 or で繋いだ条件のうち一つでも条件を満たすものがあれば、if以下を実行します。

以下にIf文のサンプルコードを記載します。

SCREEN_BOTTOM = 0
BGBotText = Screen.LoadTextBG()
Screen.Initialize( SCREEN_BOTTOM, BGBotText )

hour = DSLua.Hour()
if hour > 0 and hour < 4 then
     BGBotText:PrintXY( 1, 1, "You're up pretty late!" )
elseif hour > 4 and hour < 12 then
     BGBotText:PrintXY( 1, 1, "Good Morning!" )
elseif hour > 11 and hour < 16 then
     BGBotText:PrintXY( 1, 1, "Good Afternoon!" )
else
     BGBotText:PrintXY( 1, 1, "Good Evening!" )
end

DSLua.WaitForAnyKey() 


時刻が0時以降4時未満の時:You're up pretty late!(夜更かししすぎだよ!)を表示
時刻が4時以降12時未満の時:Good Morning!(おはよう!)を表示
時刻が11時以降16時未満の時:Good Afternoon!(こんにちは!)を表示
それ以外(つまり、16時以降0時未満の時:Good Evening!(こんばんは!)を表示

※これらの条件は大抵の言語で共通なので、検索した方が分かりやすいかもしれません。以下が参考になると思います。
Excel VBA 入門講座 If 〜 ElseIf

ループ(Loops)

ループは一定の数だけ繰り返すコードの塊です。
DSLuaには2種類のループがあります。forループとwhileループです。
forループは、あなたか変数が指定した特定の回数だけ繰り返します。
whileループは条件付きのループです。(上のif文で学んだ)特定の条件が満たされている間だけ繰り返します。

whileループ

ifにとてもよく似ています。特定の条件が満たされていればコードを実行します。
ifとの違いは、whileは条件が満たされるまで(あるいは満たされなくなるまで)コードの塊を何度も繰り返し続ける点です。
以下に例があります。ここでの whileループは、ユーザーがスクリーンをタッチするまでプログラムの続行をしません。

SCREEN_BOTTOM = 0
BGBotText = Screen.LoadTextBG()
Screen.Initialize( SCREEN_BOTTOM, BGBotText )

BGBotText:PrintXY( 1, 1, "Touch the touch screen to quit!" )

x = 1
while x == 1 do
     if Stylus.Down() then
          x = 0
     end
end 

はじめにxの値を1としました。そしてwhileループはxの値が1かどうかをループする(繰り返す)たびにチェックします。
また、ループするたびにスタイラスがタッチされているかどうかも確認しています。
もしタッチされたら、xの値は0になり、そしてwhileループがxの値がもう1ではないと認識し、ループから抜けて次のプログラムへ続きます。

Forループ

ループが繰り返されるたびに1つ値が増加するカウンター変数を内蔵しています。
カウントし始めてほしい数字と、カウントがその数字に達したらループを止めてほしい数字を設定します。
また、オプションとして、カウントを増やしていくか減らしていくかを指定することもできます。
(10、9、8、7、6、5、4、3、2、1とカウントダウンしたい場合は、「countdown=10,1,-1」とすればカウントされるたびに1つずつ数字が減っていきます)
これを利用して、私は前のチュートリアルで色のコードを理解したのです。
以下に私が前のチュートリアルで使用したコードの例があります。

SCREEN_BOTTOM = 0
BGBotText = Screen.LoadTextBG()
Screen.Initialize( SCREEN_BOTTOM, BGBotText )

for x=0,7 do
     BGBotText:SetColor( x )
     BGBotText:PrintXY( 1, x+1, x )
end

DSLua.WaitForAnyKey() 

ご覧の通り、このサンプルには変数Xが多用されています。
ループのはじめには、xの値を0に設定しました。つまり、Xはカウンターとなり、0から7までカウントするように設定されました。
ループ内で、1行目は下画面のテキストを色コードXとしました。そしてXを画面上の座標「1,x+1」に表示します。