房間類遊戲中的房間ID管理

2021-10-01 22:18:23 字數 1482 閱讀 2168

一、房間類遊戲的房間基本屬性

房間類遊戲在我們的生活中並不陌生,像跑跑卡丁車、勁舞團、歡樂麻將等,都是房間匹配的。

1、uuid 全域性唯一

2、房間id 當前唯一,且供客戶端顯示

3、房間型別

4、房間名字(可選)

5、建立時間

6、密碼 可選

7、加入條件 如需要扣除多少金幣,房卡等

8、等等。。。。

二、uuid

uuid的設計決定了整個房間管理的複雜度,通常有幾個辦法

1、資料庫自增

2、某程序擁有唯一分配權,或者多程序按段分配

3、自行構建,如時間,md5碼等。

為了便於檢視,在開發中,我選擇了當前時間戳+房間id的方式。

時間為當前utc毫秒數。 13位字元長度, 而房間id一般是4-7位。 整個uuid的長度可以控制在20位左右。

這樣設計有乙個好處,即當我看到uuid的時候,也能立即獲得房間id。除錯的時候非常方便。

三、房間id

房間id作為乙個顯示和玩家操作房間的入口,一般在4-7位。不宜過長。而長度決定了當前房間的容量。

4位:9999 即九千九百九十九

5位:99999 即九萬九千九百九十九

6位:999999 即九十九萬九千九百九十九

7位:9999999 即九百九十九萬九千九百九十九

房間id的生成可以採用十分簡單的辦法。如下偽**所示:

/**

* 房間id生成函式

*/function generateroomid()

return roomid;

}//建立房間偽**

let ret = null;

//最多嘗試10次 避免死迴圈

for(let i = 0; i < 10; ++i)

break;

}}if(ret)

else

在資料庫表設計的時候,uuid為主鍵, id要加unique索引。這樣當插入資料庫的時候,若已經有相同的id存在,則會報錯。

四、uuid和房間id的使用

由於房間id用完後會被釋放,所以系統之間的引用最好是採用uuid。

比如,加入房間,解散房間,退出房間,查詢房間以及記錄使用者所在的房間等,都要使用uuid。

舉乙個簡單的例子。玩家a進入了房間666666,玩到一半下線了。房間666666的其他玩家解散了房間。此時,另乙個玩家建立了乙個新房間,剛好分配到了666666這個房間id。當玩家a再次上線時,如果資料庫裡記錄的是666666,那麼系統就會引導玩家進入這個新建立的房間。然而這個房間並非他原來的房間。

由此可之,會復用的id,是不能作為資料儲存依據的。

這裡有乙個特殊情況,就是玩家會手工輸入房間號。對於這樣的情況,只需要特殊處理一下這個請求即可。

**和生活一樣,每乙個細節都值得去總結,這樣才能一天比一天好。 

對於多人聯機遊戲中 遊戲房間實現的想法

實現多人在 間的功能後 為了能讓使用者sessionid與名字匹配 用map將 session與名字 用key value儲存 private static map map newhashmap string session map.put m.getziji session 1 2新建乙個sess...

BFS在Roglike遊戲中生成房間的應用

roglike遊戲中,生成房間後,我們可以使用廣度優先遍歷的思想,利用佇列實現找到最遠距離的房間並返回,這種方法對各種生成的地牢的相容性較好,但也較為複雜。解決了一些如 u字形地牢 起點道終點的距離不是最遠但玩家到達終點的路程最長 不能很好的選擇終點的問題,如圖 下面附上 c 中 廣度優先遍歷的 b...

房間類遊戲後台框架 一 介紹

一 系統結構 設計的思路就是高可擴充套件,只要當前負載已達到上限,只需要整體擴容或者部分擴容即可,整個擴容過程使用者沒有感知。最終目標全自動化,將各個元件放在docker下執行,kubernetes控制遊戲的擴容。1 閘道器 閘道器負責接收來自客戶端資訊,對使用者身份鑑權並解析其資料,從服務發現管理...