Pages

Wednesday, February 9, 2011

Rubywarrior for the beginner

Ruby warrior 是一款設計來教學 Ruby 程式語言,透過互動規劃 AI 來過關的娛樂遊戲。我們扮演一名戰士要爬到高塔的位置取得珍貴紅寶石。每一層樓我們要寫 Ruby script 來建構控制我們的戰士來對抗敵人,解救俘虜,取得階梯。我們每層樓開戰以前可以得到一些線索可循,但是不知道開戰後會發生什麼事情。我們必須要寫足夠的 AI 技巧來讓我們的戰士足夠應付每一關。

如果您有興趣,在先安裝 gem,再來下 gem install rubywarrior。如此一來在 Terminal 下 rubywarrior 即可展開冒險與學習 Ruby 語言之旅。一開始會讓我們選擇要 Beginner / Intermediate,我們就先從 Beginner 開始。

關卡介紹。

Beginner 關卡是一維,透過 x 軸移動前進後退,這邊為每一關卡開戰錢的樣貌,各個符號意思為,> = Stair, @ = Warrior, s = Sludge, S = Thick Sludge, C = Captive, a = Archer。
Level 1 - |@      >|
Level 2 - |@   s  >|
Level 3 - |@ s ss s>|
Level 4 - |@ Sa S>|
Level 5 - |@ CaaSC|
Level 6 - |C @ S aa|
Level 7 - |>a S @|
Level 8 - |@ Cww>|
Level 9 - |>Ca  @ S wC|

敵人介紹
Sludge : 12 HP, Attack 傷害 3, Attack 距離 1 space ,殺死可以得到 12 分。
Thick Sludge: 24 HP, Attack 傷害 3, Attack 距離 1 space,殺死可以得到 24 分。
Archer :  7 HP, Shoot 傷害 3, Shoot 距離 2 space,殺死可以得到 7 分。
Wizard : 3 HP, Shoot 傷害 11, Shoot 距離 2 space,殺死可以得到 3 分。

俘虜介紹
Captive :  1 HP ,解救可以得到 20 分。

戰士能力:

  •  warrior.health - Returns an integer representing your health. Max 20 HP.
  • warrior.rest! - Gain 10% of max health back, but do nothing more.
  • warrior.rescue! - Rescue a captive from his chains (earning 20 points) in given direction (forward by default).
  • warrior.attack! - Attacks a unit in given direction (forward by default). 5 damage per attack. Attack distance 1 space
  • warrior.look - Returns an array of up to three Spaces in the given direction (forward by default).
  • warrior.walk! - Move in the given direction (forward by default). 1 space per turn.
  • warrior.pivot! - Rotate :left, :right or :backward (default)
  • warrior.shoot! - Shoot your bow & arrow in given direction (forward by default). 5 damage per shoot. Shoot distance 3 space
  • warrior.feel - Returns a Space for the given direction (forward by default).

關卡遊戲規則:

  • 採取回合制,也因此在跑過程是自動化,我們寫了 Ruby script 寫完就得讓它跑,從 command line 看每回合結果。
  • 每一回合,Warrior 在 Ruby script 裡面的 play_turn function 僅能使用一個 (!) 驚歎號執行命令,如果超過一個遊戲會停止並且說犯規,必須改寫 script 重來。在 Ruby language 裡面是使用這個會造成結果有影響。
  • 每一回合 Warrior 先,所以要做任何事情都要比對方捷足先登。
  • 戰士的 HP 達到 0 以下即回合失敗。
  • 戰士抵達樓梯即該關卡結束。
  • 回合次數沒有上限,所以 Ruby script 沒寫好判斷,很容易進入動作重複操作,永無結束。如果關卡提早結束可以獲得額外分數。

Epic mode
當抵達塔的最高層,我們即進入 Epic mode,再跑 rubywarrior 一次會從第一關跑到最後一關,中間不會停擺。所以之前有些關卡如果是硬解,Ruby script 寫死,即有可以能在這通通跑之下,會卡在某些關卡。所以唯有注意自己 AI 規劃,程式判斷要清楚,這樣才能套用在每一個關卡,得以順利一口氣全過。

Ruby warrior beginner 玩後心得
每一關會如何進行怎麼樣,我們不會知道,唯有開戰才能透過 command line 回傳結果才會知道,也才能知道我們的 Ruby script 寫的如何,過不了關當然要重寫。但是如果 AI 沒寫好,依然可以破關,但是會造成可以俘虜少救、誤殺俘虜等情況發生,分數取得不會高。所以不斷的調整 Ruby script 來取得同樣可以破關,但是可以取得最佳分的結果,而這行為即是在練習我們 Refactory 能力,過關結果不變,但是可以取得更高分,讓下一關卡接手上一關的指令可以更好修正與開發。
 

另外可以參考 https://github.com/ryanb/ruby-warrior 瞭解更多,以上英文部份是截取自原 Github 遊戲說明頁面。未來我再介紹我的全破 beginner 取得高分的初學 Ruby 寫法。

No comments:

Post a Comment