有在關注 棋盤式回合式game 小房間的方式 適合erlang 的通訊方式 類會議室
> --
> 您已訂閱「Google 網上論壇」的「Erlang_Taiwan」群組,因此我們特別傳送這封郵件通知您。
> 如要在網路上查看這項討論,請造訪 https://groups.google.com/d/msg/erlang_taiwan/-/dZ9r5SU7dfEJ。
> 如要在此群組張貼留言,請傳送電子郵件至 erlang...@googlegroups.com。
> 如要取消訂閱此群組,請傳送電子郵件至 erlang_taiwa...@googlegroups.com。
> 如需更多選項,請造訪此群組:http://groups.google.com/group/erlang_taiwan?hl=zh-TW。
當初剛接觸 erlang ,了解到他的兩大特色:process 和 message 時,便認為這對用來寫模擬的程式非常有幫助,那時也就有了這遊戲的想法。
遊戲的核心便是將每個玩家的單位視為一個 process,透過 message 來溝通,目標玩家是像 Robocode 一樣鎖定在程式人員,透過編寫 AI 來進行遊戲。為了方便起見,下面我將玩家的 process 稱作 unit,遊戲中其他非玩家的物件稱為 object 或 obj,遊戲的核心稱為 engine 或 eng。
一、策略階段。在這個階段 eng 分別將每個 unit 的視野資料(限制每個 unit 只能看到其視野範圍中的 obj/unit)、unit 本身的狀態(死、活、生命點等等)傳給各個 unit,讓各個 unit 開始根據其策略進行計算,產生下一步要執行的命令(移動、攻擊、防禦等等)。
一、公平性:這個公平性指的不是遊戲規則上的公平性而是資源利用的公平性。在進行策略計算時每個 unit 都會運用到系統的資源(CPU, memory, disk),在某種程度上,資源運用的越多相對的可能就越容易獲勝,在遊戲規則中我們限制了每個 unit 的思考時間就是為了這個目的。並且為了不讓資源利用太過浮濫,讓玩家能寫出精要的程式碼,限制其系統資源的使用是有必要的,然而 erlang 本身沒有提供這樣的功能,所以我想只能用監視的方式來處理,當 unit 的資源利用超出限制便將其 kill 掉並於下個回合重新啟動,如果重啟次數過多便宣佈該玩家失格。
二、執行階段。在這個階段 eng 開始回收各個 unit 的命令,如果 unit 不能即時計算出命令則會被判為 idle。回收完命令後將收到的命令先作一次亂數的洗牌,確保不會有人總是最先執行。洗完牌之後便按次序依遊戲規則執行命令,並將命令結果更新在 eng 中作為下一個回合的開始資料。
二、安全性:因為玩家是程式人員且會跑玩家的程式碼在伺服器上,安全性會是需要考量的重點。因為 erlang 中沒有沙箱機制,遊戲的 eng 必須要能夠辨識\排除某些 api ,如 os:cmd 的使用,這部份可能在玩家提交程式碼的時候透過掃描程式碼的方式來處理。在 eng 本身也要能夠隱藏重要元件的 pid 避免遭到 DOS 的攻擊;對每一回合的時間控制也要確實,不會讓某些惡意的 unit 拖慢整個的節奏;系統資源也要監視,避免將記憶體或磁碟耗盡導致整個系統無法繼續。