2015年10月17日 星期六

if...then...else...end進階課程

  路亞的語言其實不難,只要看得懂並多多練習實作,很快就能上手了。這次我要講解的是一些特殊的敘述形式,基本的東西我就不再逐一詳解了,歡迎各位瀏覽喔~
本文分成三個部分進行探討:
壹.else的省略
貳.if 資訊 then
參.if and then



else的省略

首先,我們知道if...then...else...end由四樣東西組成,但有一樣東西有時候會被省略,沒錯!就是else(否則就),就好比下面這個擷取自預設main.lua的內容:
  if me.isSpirit then
  dofile("spirit.lua")
  return
  end

翻譯過來是這樣的:
   如果 我是靈體 那麼就
   執行檔案(檔案為spirit.lua)
   return
   結束敘述


你會發現在上面的程式中,並沒有提到else,這是因為用不到。為什麼用不到?很簡單的,假設上述的例子(main.lua)有else的話,大概會長這樣:
  if me.isSpirit then
  dofile("spirit.lua")
  return
  else
  
  end
你會發現else與end中間空空的,這就是不需要的意思,因為我們的條件是(如果我是靈體),而非靈體的時候就會執行else(否則),但在非靈體的時候我們沒有要求程式執行任何指令,此時的else就是多餘的,因此我們可以省略else不寫。當然這完全不會影響到你的程式,但只限於「否則不做任何事的情形」。要注意  if、then、end  這三個不能省略喔!


總結:
   若在else的情形下沒有事情要做,那麼else就可以被省略

if 資訊 then

先舉兩個範例,第一個範例
  if me.caisson.bullets == 0 then
  me.talk("沒子彈了!")
  else
  me.talk("還有子彈可以用")
  end

再來是第二個範例
  enemy = me.findClosestEnemy()
  if enemy then
  me.talk("發現敵人!")
  else
  me.talk("敵人不在附近")
  end


你會發現這兩個敘述的if有點不太一樣
一個是「if me.caisson.bullets == 0 then」
另一個是「if enemy then」
第一個範例直接翻譯過來就是「如果  身上剩餘子彈數  等於  0」
很順口,完全沒有問題
但第二個範例翻譯後會變成「如果 enemy 那麼就」
這時候各位可能會想問,什麼是「如果 enemy 那麼就」
由於我們在if enemy then前面已先指定「me.findClosestEnemy」給變數「enemy」
所以我們知道這個句子就是「如果 最接近玩家的敵人 那麼就」
「如果 最接近玩家的敵人 那麼就」直接唸過去似乎沒什麼意涵
不過這邊告訴各位,這其實是一種特殊的if的敘述方式
這個「如果 enemy 那麼就」「if  資訊  then」的敘述方式
它所代表的含意是,「如果 enemy有意義 那麼就」
也就是說如果你只給他資訊,而不用關係運算子去做比較時
它會自動解釋為「如果 資訊不等於nil 那麼就」的情形
不等於的寫法是「~=」,參見<關係運算子>
所以上面的例子其實也能寫成if enemy ~= nil then 的形式
總結:
   「if enemy then」是「if enemy ~= nil then」的縮寫

實作練習:

enemy = me.findClosestEnemy()
friend = me.findClosestFriend()
if enemy then
game.logState("enemy","發現")
else
game.logState("enemy","未發現")
end
if friend then
game.logState("friend","有")
else
game.logState("friend","沒有")
end
--有敵人時看板會出現enemy => 發現
--沒有敵人時看板會出現enemy => 未發現
--有隊友時看板會出現friend => 有
--沒有隊友時看板會出現friend => 沒有
--試著改寫成if enemy ~= nil then並觀察這個程式是否會被影響


if and then

if可以搭配上and(而且)來使用,用以同時檢查多個項目,也可以有多個and,例如
  num1 = 1
  num2 = 2
  num3 = 3
  if num3 > num1 and num2 > num1 and num2 < num3 then
  game.logState("and","成功")
  else
  game.logState("and","失敗")
  end
在路亞修行中執行上面這個程式的話,你的路亞思路看板上就會出現
[00:00:56] and => 成功
這就代表if and then的敘述是沒問題的

如果你將上面的程式中的關係運算子改變一下的話,像這樣:
  num1 = 1
  num2 = 2
  num3 = 3
  if num3 > num1 and num2 > num1 and num2 == num3 then
  game.logState("and","成功")
  else
  game.logState("and","失敗")
  end
那麼這個敘述就會不通過, 因為後面的num2 == num3不成立
看板上將會顯示
[00:00:38] and => 失敗




這次的if...then...else...end進階課程就這樣告一段落囉~
到目前為止都還是學單一的if敘述
但在之後的高階課程中,我們將會探討if裡面還有if的敘述
只要能看得看得懂高階課程中的各種例子
那就代表你對if...then...else...end的敘述已經有一定程度的認知
玩起路亞修行時也就會更容易上手囉!
相關參考文章連結:
<關係運算子>
高階課程<if...then...else...end高階課程>


沒有留言:

張貼留言