2016年5月18日 星期三

同人陣 - 變數代碼(課程一)

  用變數替任務變數命名是個強力的功能,本文將介紹變數代碼的格式、用法,並舉例說明之。

  先看一下官方的說明:
{}中可填入另一個變數,用來為此變數命名,例如:

假設在另一個事件或檢查中,某個人物的代碼(假設為ch0001)已儲存至 myChar 這個變數
此時在目前這個欄位填入 {myChar}.num
則此變數代碼實際上執行時就會變成 ch0001.num

  看完官方說明後,你應該有了初步的了解,若仍然不懂,本文章會更詳細的解說。學變數代碼是為了解決同人陣上的問題,因此我們要先看看問題,然後再用變數代碼去試著解決他,這樣才能更加了解等一下要教的每樣東西。

問題
  戰場上有八名玩家在比狙擊槍的傷害,比賽為回合制,上場的玩家需用狙擊槍對電腦角色開一槍,該電腦角色的最大、最小血量皆為200,當所有玩家攻擊完後便進入下一回合,共三回合,分數記錄在告示牌上。
以下是一些額外的限制:
1.戰場上僅有一把狙擊槍及一個再生彈夾
2.分數要記錄每回合的個別傷害及總傷害
3.玩家在同一回合內僅允許記錄一次分數
4.若沒有擊中電腦角色則該玩家必須重新進行當下的回合,直至擊中為止

  
  你應該很快就意識到了吧,這個問題是與玩家有關的,包括玩家的暱稱、回合分數、回合進度、總分,而每位玩家都要有地方儲存這些資料,因此我們的第一件事,就是設定任務變數,幫助我們儲存這些資料,如圖(一)所示。
▲圖一 (點擊圖片以放大檢視)


  其中你會看到許多變數擁有這個結構「player.{label}」,這個就是變數代碼,player是 "玩家" 的意思,label則是 "標籤" 的意思,這邊先暫停一下,我們先探討一個問題。

變數「player.{label}」與變數「player.label」有何不同?
  還記得官方的解釋嗎?
某個人物的代碼(假設為ch0001)已儲存至 myChar 這個變數
那麼{myChar}.num實際上會變成 ch0001.num

  同樣的道理,player.{label},此處的{label}是一個變數,若變數label為1或2或3時,則player.{label}可以變化為三種不同的任務變數player.1或player.2或player.3

  然而player.label,此處的label則不能代表變數,因為label沒有被{}符號所括住,所以變數player.label不是變數代碼,而是一個普通的任務變數。此時就算變數label為1時,player.label也不會變成player.1

結論:
player.label是一個普通的任務變數,只能儲存一個資料。
player.{label}是一個變數代碼,能夠儲存多筆資料,受變數label影響。
討論結束

  回到剛才的問題,這些擁有「player.{label}」的變數都是變數代碼,能夠儲存許多資料,讓我們透過樹狀圖來加深印象吧!

由於有八位玩家,因此player.{label}必須要能分為八個,所以{label}應為0~7共八種
▲圖二 變數代碼適合以樹狀結構來理解
player.{label}代表玩家標籤,其中:
player.0代表零號玩家,player.1代表壹號玩家,依此類推......

因此我們可知:
整數變數player.{label}.final.score代表「每位玩家的總分」(final是最終,score是分數)
字串變數player.{label}.name代表「每位玩家的遊戲暱稱」(name是名字)
整數變數player.{label}.1.score代表「每位玩家第一回合的分數」
整數變數player.{label}.2.score代表「每位玩家第二回合的分數」
整數變數player.{label}.3.score代表「每位玩家第三回合的分數」
整數變數player.{label}.selfround代表「每位玩家的回合進度」(self是自己的,round是回合)

  以上是變數代碼的格式解說,看到這邊你應該已經對變數代碼的格式有所了解,不過能不能解決問題才是重點!下一堂課將會繼續探討本文所提出的問題。再會!
變數代碼第一階段課程在此告一段落

沒有留言:

張貼留言