
游戲系統(tǒng)組件
- 中心服
中心服用于向客戶端提供全局配置及初始化,它不直接與玩家交互,主要維護(hù)游戲列表和房間信息,主要包括游戲類型、游戲種類、房間信息、在線等。
中心服配置主要包括網(wǎng)絡(luò)配置和數(shù)據(jù)庫配置,網(wǎng)絡(luò)配置包括監(jiān)聽端口、最大連接數(shù),這里的最大連接數(shù)是指最多支持多少個登錄服和房間服,因為只有這兩種服務(wù)器會連接中心服。數(shù)據(jù)庫配置主要包括服務(wù)器數(shù)據(jù)庫所在機器的IP和端口以及賬戶密碼。中心服會根據(jù)這些配置來管理游戲列表、房間列表等信息。
- 登錄服
登錄服主要提供玩家注冊與登錄校驗,它可定時從中心服取回游戲列表和房間信息,因為這些數(shù)據(jù)在不斷變化,登錄服需要在玩家登錄時將這些信息返回。
- 大廳服
大廳服主要用于玩家連接游戲,創(chuàng)建房間、加入房間、比賽模式服務(wù)自動分配房間。
- 房間服
房間服控制游戲房間的啟動、停止、添加、刪除等管理操作,它可在啟動時向中心服注冊,關(guān)閉時從中心服注銷。玩家進(jìn)入房間時通知中心服更新在線人數(shù),并定時連接中心服更新游戲列表和房間信息。
房間服務(wù)器啟動時,先要發(fā)送請求給中心服進(jìn)行注冊,在關(guān)閉時要從中心服中注銷。同時會定時通知中心服更新在線人數(shù),定時從中心服上取回最新的游戲列表和房間信息。
房間服需要和玩家進(jìn)行交互,玩家進(jìn)入房間,找桌子坐下時請求由自己來處理。而游戲操作如加注、發(fā)牌等,房間服會轉(zhuǎn)發(fā)給游戲模塊進(jìn)行處理。
房間服管理著在線用戶列表,在玩家進(jìn)入房間和離開房間時都需要更新在線數(shù)據(jù),在線列表中記錄的玩家信息從玩家?guī)熘屑虞d。玩家在進(jìn)行游戲時,由于輸贏的關(guān)系玩家積分或游戲幣都會隨之變化,為了記錄這些變化,它需要和游戲庫進(jìn)行交互。
管理員可通過房間服來發(fā)布消息、踢出玩家、警告玩家、設(shè)置玩家權(quán)限、設(shè)置房間屬性等活動。玩家也可以通過房間服參與聊天。
玩家的大部分操作都是和房間服來響應(yīng)的,啟動一個房間服實例相當(dāng)于開啟一個新的房間,所以要擴容基本上只需要增加機器并開啟更多的房間服即可。房間服的配置主要包括房間基本信息、網(wǎng)絡(luò)配置、數(shù)據(jù)庫配置、與中心服相關(guān)配置。房間基本信息包括房間類型、桌子數(shù)、椅子數(shù)等。網(wǎng)絡(luò)配置主要包括監(jiān)聽端口和最大連接數(shù),這里的最大連接數(shù)是指房間內(nèi)最多支持多少玩家同時在線。房間服和登錄服一樣,需要定時從中心服更新游戲列表和房間信息發(fā)送給客戶端。
- 數(shù)據(jù)庫
保存用戶信息、游戲數(shù)據(jù)、系統(tǒng)運行狀態(tài)、日志等
游戲系統(tǒng)結(jié)構(gòu)
采用多服分布式架構(gòu),由一個中心服(CenterServer)、多個主服務(wù)器(MainServer)、多個從服務(wù)器(LocalServer)同時工作以實現(xiàn)游戲邏輯、用戶管理、通訊等功能。
- 中心服:向客戶端提供全局配置以及初始化數(shù)據(jù),主要是定位一個主服務(wù)器的IP地址。
- 主服務(wù)器:管理客戶端用戶身份驗證與登錄、管理從服務(wù)器的建立、數(shù)據(jù)庫讀寫
- 從服務(wù)器:管理客戶端游戲通信、大廳與房間等,可自由添加、刪除、修改。
游戲系統(tǒng)流程
游戲玩家登錄
客戶端用戶在登錄場景中點擊登錄,登錄方式可能是游客、微信等。登錄實際上是請求玩家的信息、游戲服IP與端口、玩家房間信息等。當(dāng)用戶登錄成功后,會使用獲取到的IP和端口跟游戲服建立長連接,同時會根據(jù)房間信息,選擇進(jìn)入大廳或是游戲。
玩家開房
- 客戶端將用戶賬戶密碼發(fā)送給登錄服執(zhí)行登錄操作,登錄服驗證成功后返回游戲列表給客戶端。
- 玩家選擇具體游戲后進(jìn)入房間,客戶端發(fā)送請求給房間服務(wù)器,房間服務(wù)器將房間信息返回給客戶端顯示。
- 玩家選擇桌子坐下開始游戲時,客戶端將游戲動作發(fā)送給對應(yīng)的房間服務(wù)器,房間服務(wù)器將操作解析后轉(zhuǎn)發(fā)給游戲邏輯模塊進(jìn)行處理,并將處理結(jié)果返回給客戶端。

用戶與服務(wù)器交互流程
- 系統(tǒng)是首先啟動中心服,中心服從配置文件中讀取主服務(wù)器列表、客戶端所需的全局配置、初始化數(shù)據(jù)等。
- 中心服等待客戶端的連接,客戶端連接后中心服將定位到某個主服務(wù)器的IP地址和端口,發(fā)往客戶端。
- 客戶端收到主服務(wù)器信息后,與中心服斷開連接。
主服務(wù)器啟動后,可以在主服務(wù)器中創(chuàng)建多個從服務(wù)器與房間,創(chuàng)建完成后從服務(wù)器的IP和端口就作為唯一標(biāo)識寫入數(shù)據(jù)庫和主服務(wù)器內(nèi)存。
房間號、房間所屬游戲類型、所屬從服務(wù)器編號作為房間的房間的唯一標(biāo)識被寫入數(shù)據(jù)庫和主服務(wù)器內(nèi)存。
從服務(wù)器創(chuàng)建以后,就在它所屬的機器上啟動。 - 客戶端與主服務(wù)器建立連接
客戶端登錄后首先和主服務(wù)器建立連接,一直到客戶端退出時才斷開。建立連接成功后生成界面結(jié)構(gòu)樹。 - 主服務(wù)器從數(shù)據(jù)庫中讀取從服務(wù)器信息到主服務(wù)器內(nèi)存
首先讀取游戲類型以建立基本信息,然后讀取界面樹節(jié)點以獲取客戶端界面結(jié)構(gòu)、從服務(wù)器信息、大廳與房間信息。
客戶端請求登錄并成功與主服務(wù)器連接時,主服務(wù)器將這些信息一次性發(fā)送到客戶端內(nèi)存,客戶端根據(jù)這些信息生成界面結(jié)構(gòu)樹。
當(dāng)用戶點擊某個游戲房間時,系統(tǒng)從內(nèi)存中讀取房間信息,根據(jù)房間所屬的從服務(wù)器IP和端口,嘗試和從服務(wù)器建立連接,連接成功后從服務(wù)器會將房間信息發(fā)送給客戶端??蛻舳耸盏胶蟾鶕?jù)這些信息生成房間。
每當(dāng)客戶端游戲位置發(fā)生改變時將向從服務(wù)器發(fā)送改變信息,從服務(wù)器保存、修改所有與之連接的客戶端的位置信息列表。
當(dāng)房間桌子坐滿時游戲開始,游戲開始后客戶端與從服務(wù)器通信并更新游戲信息。
當(dāng)客戶端退出游戲即返回大廳這個房間。當(dāng)退出大廳時首先和從服務(wù)器斷開連接,然后和主服務(wù)器斷開連接,最終終止整個客戶端程序。
游戲組件模塊
組件模塊以中心數(shù)據(jù)管理模塊為中心,數(shù)據(jù)庫處理模塊和socket管理模塊提供外部操作聯(lián)系。
