AIBots 簡介

1.           介紹

AIBots A.I. Wars Perl 版本,提供Tk圖形界面及文字界面。

 

啟動參數

aibots [-c -s -m -o -r] [Map] [Bot1 Bot2 …]

通常不需加任何參數。

-c: 純文字模式, -s: 靜音, -m: 背景音樂, -o: 僅顯示訊息, -r 僅顯示結果.

2.           使用界面與操作

設定列

地圖選單

左下角的下拉式選單,列出所有可用的地圖供使用者選取。

用方括號括起來的地圖([Solania])表示一個「關卡」。

一開始玩的人可以從OpenArena地圖出發。

更換背景 ()

連續按這個鈕可以按換背景圖。

背景圖對遊戲實際進行並無影響。

參賽Bot選單

在地圖選單右邊和下方的九個Bots選單,列出所有可用的Bot檔。

按一下空白的選單就可以新增參賽者。將現有的參賽者改選成最上面的空白選項就可以刪除。

監看()

在比賽進行中可以按每個Bot左邊的監看鈕,將監看目標切換至該Bot。被監看的Bot資料會顯示在左上方的狀態列中。

關於此程式()

顯示作者及程式版本資訊。

操作列

啟動(*) / 暫停(*)

選好地圖及參賽者後,啟動鈕會亮起來。按一下,比賽就會開始。每個Bot會依照程式自己決定行動,使用者不須控制。

在比賽中隨時可以按下暫停;再按一次就繼續。

停止()

比賽通常進行到盤面上祗剩同一隊的Bot時結束。如果在此之前勝負已經分曉、使用者判定Bots彼此再也遇不到,或基於任何別的原因,都可以按停止鈕中止遊戲。

速度()

在緩慢、中等、快速執行間切換。在接近戰時可以調整成「慢動作」播放,而無聊的段落快速捲過去。

音效()

如果安裝了Win32::Sound模組,AIBots還可以播放音效。不想聽時可以按音效鈕消音。再按一次回復。

標題列

監看及狀態

在遊戲進行時,左上角的黑色按鈕會顯示目前正在監看的Bot;使用者可以按該按鈕切換目標。

被監看的Bot旁邊會有圖形圍住,它的目前狀能也會顯示在上方的狀態列上,例如在開場時:

[Mage-2] Score: 0 Ammo: 30 Life: 10 Fuel: 2499 [Turn Right]

分別表示Bot的種類(Mage)、編號(2)、目前得分(0)、剩餘彈藥(30)、生命值(10)、油料(2499)、此回合的行動(向右轉)

另外,視窗標題會顯示(Tick: 1),表示這是第一回合。

3.           計分及遊戲規則

基本概念

AIBots中,使用者比的不是反應,而是彼此寫程式的能力。

一場遊戲的勝負,是靠Bots累積的分數決定。獲得分數最主要的方式就是對別隊的Bots造成傷害。另外,最後存活的Bot500分的獎分。

要造成傷害需要武器。Bots發射一般武器(能量波除外)需要彈藥。Bot的生命值代表可以承受的傷害,掉到零就陣亡了,變成一面旗子。

Bot的轉向、移動及發射飛彈都需要油料。油料耗盡時,這些動作都不能進行。Bot受傷愈重,耗油率愈大。

生命點數和彈藥不會自己重生,但能在Bot走到旗子、彈藥庫、戰略要點等特殊物品上時補充。

每個回合(Tick)在場的所有Bots各輪流執行一個行動命令,再換下個回合。

盤面元素

* bot(機器人) [^>v<]

每個Bot的頭向決定發射武器、前進及後退的方向。

Bot不會疊在一起。走到別的Bot上會碰壁(bump)

* spawn(進入點) [1..9@]

遊戲開始時,Bots隨機出現於進入點上。

有些進入點可以特別指明給某個Bot.

進入點在遊戲開時後視同空地,不起作用。

* wall(石牆) [#]

石牆不能穿透,不能擊破。

* fence(矮牆) [+]

矮牆不能穿透,可以用任何武器擊破。

* flag(旗子) [P]

走到旗子上的Bot若已受傷,吃掉旗子可補滿生命值、加30點彈藥、350點油料;若生命值為滿,則吃掉旗子會使生命值減5點。

* mine(地雷) [O]

走到地雷上的Bot生命值減5點,燃油率增加5。如果是敵方佈的雷,佈雷者加400分。

* vault(彈藥庫) [A]

走到彈藥庫上的Bot20點彈藥。

任何武器打到彈藥庫都會造成爆炸,對週邊一格內的Bot各傷3點,燃油率增加3

擺在一起彈藥庫會連鎖爆炸。

 snode(戰略要點) [*]

停在戰略要點上的Bot5回合加1點油料,10回合加1點彈藥,15回合加一點生命值。生命值補滿為止。

武器

* laser(雷射)

雷射是最基本的武器,消耗1點彈藥,射程為前方五格,打到東西就停止。

沒開護盾的Bot5格內會受(6-距離)點傷害。開護盾的Bot祗有在最近的2格受(3-距離)點傷害。

雷射造成的燃油傷害與生命值傷害相同。

* bazooka(火箭炮)

消耗10點彈藥及300點油料,發射後以每回合一格的速向前方飛,打到東西就爆炸,對週邊一格內的Bot造成7(無護盾)4(有護盾)點傷害。

被直擊的Bot96點傷害,視護盾狀態決定。

燃油傷害與生命值傷害相同。

* grenade(榴彈炮)

消耗5點彈藥及200點油料,發射後以每回合一格的速向前方飛,打到東西就爆炸,對週邊一格內的Bot造成5(無護盾)2(有護盾)點傷害。

被直擊的Bot74點傷害,視護盾狀態決定。

直擊燃油傷害為129點,波及時41點。

 energy (能量波)

能量波消耗1點生命值,對周圍一格內的所有Bot造成2點傷害及2點燃油傷害。

能量波是惟一可以消除週邊地雷及旗子的武器。

 destruct (自爆)

自爆對周圍一格內的所有Bot造成相同於剩餘生命值的傷害,及同等的燃油傷害。

自爆後的Bot不會變成旗子。

防具

* shield (護盾)

護盾可處於昇起(enable)或落下(disable)狀態。

昇起時受的傷害會減少,但不能發射除能量波外的武器。當然可以自爆。

* laymine (佈雷)

開啟(enable)佈雷的Bot會在之後移動時於原先所在位置佈雷,每次需消耗5點彈藥。

* cloak (隱形)

開啟(enable)隱形的Bot不會被其她Bot$enemy_[x/y/h]$friend[x/y/h]偵測到。

隱形每回合消耗10點油料及2點彈藥。

計分規則

攻擊得分

Bazooka/火箭炮      直擊: 無護盾+500, 有護盾+300.         波及: 無護盾+400, 有護盾+200.

Grenade/榴彈炮      直擊: 無護盾+500, 有護盾+300.         波及: 無護盾+200, 有護盾+100.

Laser/雷射               實際傷害 * 20

Destruct/自爆          實際傷害 * 50

Energy/能量波 +100

Vault/引爆彈藥庫    +200

Mine/佈雷               +400

盤終獎分

Ø           1點生命值加50, 低於零每1點扣50

Ø           因傷害造成的耗油率(burn rate) 1點扣1

Ø           最後存活的隊伍成員平分500

4.           如何撰寫Bots

系統變數

自訂資訊

$name, $author

$team

$pic

目前狀態

$shield, $laymine, $cloak

$bumped, $found

$score, $burn

資源存量

$fuel, $max_fuel

$ammo, $max_ammo

$life, $max_life

座標及方向

$x, $y, $h

$enemy_x, $enemy_y, $enemy_h

$friend_x, $friend _y, $friend_h

$snode_x, $snode_y

內部變數

$id, $botcount

$lastcmd

$state, $line

行動指令

掃瞄

scan front, scan left, scan right;

scan perimeter;

scan cross, scan corner;

scan longrange;

scan position [1..9];

scan relative [1..9];

scan gps $x, $y;

移動

move forward, move backward;

turn left, turn right;

攻擊

fire energy;

fire laser;

fire bazooka;

fire grenade, fire grenade $d;

啟用及停用

enable/disable shield;

enable/disable laymine;

enable/disable cloak;

雜項

attempt repair;

attempt destruct;

beam fuel/ammo/command;

內定函式

偵測其她Bots

&nearst(“friend”|”enemy”)

&inperim(“friend”|”enemy”)

&headto(“friend”|”enemy”)

指令結果檢查

&found(“$obj1|$obj2|…”)

&bumped(“$obj1|$obj2|…”)

目前狀態

&damaged()

&ready($weapon)

&onnode()

雜項

&turnto(2|4|6|8)

&distance($x, $y)

&toggle()

流程控制

條件判斷

if ($condition) {…}

unless($condition) {…}

elsif ($condition) {…}

else {…}

… if/unless ($condition)

副程式操作

LABEL: {…}

redo;

goto LABEL;

call LABEL;

return;

5.           自訂地圖及畫面

地圖檔 (maps目錄)

前置註解

=background 背景

=bot[1..9] 內定Bot

=sound 開場聲音

=snode x, y戰略要點座標