Battlesnake – Introduction

Battlesnake N 部曲

  1. Battlesnake – Introduction
  2. Battlesnake – Map
  3. Battlesnake – Dead End
  4. Battlesnake – Hunger

Battlesnake 是一個貪食蛇的線上程式競賽,每個人根據官方提供的 API 來和其他玩家競賽,誰能在一場比賽中活到最後,誰就是贏家。

參加方式非常簡單,主辦方會透過 HTTP Request 來呼叫你的 API 進行遊戲,你只須完成官方指定好的四個 API 後並架設完成,即可參加競賽。因此,你會須要有一台自己的伺服器,現在網路上很多免費的資源可以使用,如果不想花錢,也可以花時間找適合自己的喔。

而因媒介是 HTTP Request,因此實際上你想用什麼語言來實作都行,最後只要透過 Nginx 或類似服務來當中介即可,相當的自由,趕快參加吧!

接下來會簡單介紹比賽資訊以及 API 資訊,最終仍須以官方資訊為主,可在 https://docs.battlesnake.io 查看。

比賽資訊

基本規則

  • 地圖保證為正方形,並且會是 7×7、11×11、19×19 其中一種大小。
  • 一場比賽中,最少會有一位敵人,至多會有七位敵人。
  • 出生點位置是固定的,但參賽者會被隨機分配到其中一點,可在此查看詳細機制
  • API 的 response 必須在 250ms 內,否則視為無回應,並且蛇會朝著當下的方向繼續前進(遊戲開始時預設方向為上方)。

食物生成機制

  • 每一回合中(turn),都有一定機率會隨機生成食物,每回合食物至多只會生成一個,並且將會隨機放在地圖上(不會生成在蛇的身上)。如果此回合未生成食物,下回合食物生成機率會提高,而此機率會在生成食物那回合重置。
  • 遊戲開始時,地圖上的食物數量是隨機的,但會保證食物數量大於蛇的數量。

死亡條件

  • 撞到牆或餓死。
  • 撞到自己或其他蛇的身體。
  • 當多條蛇的頭互撞時,如果一樣長,那大家一起死,否則最長的人存活。

以上就是比賽的一些資訊,基本上和貪食蛇是一樣的,只是變成多人程式對戰。

API 資訊

總共有四個 API 必須實作,分別是 start、move、end、ping。

start

一場比賽即將開始,在這個 api 中,已包含地圖上所有的資訊(將在 move api 說明),你可以回傳自己的蛇的資訊,包含顏色以及頭和尾巴的樣子。

{
"color": "#ff00ff",
"headType": "bendr",
"tailType": "pixel"
}

move

這是最重要也是最關鍵的 API,決定此回合你要怎麼移動,回傳格式如下:

{
"move": "right" // "up", "down", "left", "right"
}

此 API 中會包含地圖上的資訊,格式如下(資料經過簡化,以避免版面太長):

{
"game": {
"id": "xxxxxxxx-yyyy-zzzz-mmmm-nnnnnnnnnnnn" // 遊戲 id,同一場遊戲值會相同
},
"turn": 352, // 第幾回合
"board": {
"height": 11, // 地圖高度,必定為正方形
"width": 11,
"food": [ // 食物
{
"x": 3,
"y": 1
},
{
"x": 1,
"y": 9
}
],
"snakes": [ // 場上所有蛇的資訊,自己的蛇也會在這裡面
{
"id": "gs_aaa", // 蛇的 id
"name": "aaa/bbb", // 蛇的名字
"health": 68, // 此值歸零時代表餓死
"body": [ // 身體,順序是:頭 → 尾
{ // 這裡是蛇的頭
"x": 8,
"y": 4
},
{
"x": 9,
"y": 4
},
{ // 這裡是蛇的尾巴
"x": 9,
"y": 5
}
]
},
{
"id": "gs_bbb",
"name": "ccc/ddd",
"health": 83,
"body": [
{
"x": 8,
"y": 6
},
{
"x": 8,
"y": 7
},
{
"x": 7,
"y": 7
}
]
}
]
},
"you": { // 自身蛇的資訊,已包含在上方 snakes 中
"id": "gs_aaa",
"name": "aaa/bbb",
"health": 68,
"body": [
{
"x": 8,
"y": 4
},
{
"x": 9,
"y": 4
},
{
"x": 9,
"y": 5
}
]
}
}

註:假設地圖大小為 N,左上是 0, 0,右下是 N, N

end

一場比賽結束,嗯,就是結束了,回傳 200 即可。

ping

確認你的伺服器是否還活著,直接回傳 200。

以上就是四個須實做的 API 簡介,是不是很簡單啊!

但有一點須特別注意,因主辦方會經常確認你的 API 是否還在線,因此當接到 Request 並發現 game id 僅是一串數字,則代表這是確認你 API 在線的檢查,並不是實際進行中的一場比賽,因此如果你有把遊戲資料存起來,這點要特別注意,不然會有一堆垃圾資料。

Battlesnake 的簡介到這就差不多啦,接下來是地圖的時間囉~