棋牌游戲服務器架構: 詳細設計(二) 應用層設計


      這里的應用層,指的是CenterServer、LogonServer、LogServer、RoomServer等幾個服務器,另外還包括游戲模塊的設計。不過游戲模塊和前4個服務器的設計很不相同。這里先說一下服務器應用的詳細設計。

      這上面提到的4個服務器都需要響應客戶端(這里的客戶端的意思是泛指)的請求,進行數據庫操作,同時還要能夠配置,以及顯示系統運行的狀態信息等。這里會采用MVC模式來組織應用層邏輯。

 圖1  Application層基本結構

      IController從ITCPServiceObserver繼承而來,會與ITCPServerService進行交互,因此它需要解析客戶端發過來的請求,如果需要作數據操作,則轉發給IModel處理。

      IModel從DBServiceObserver繼承而來,一些獲取數據及存儲數據的操作由它完成,這是通過IDatabaseServicer提供的服務完成的。

      IView實現了IObserver接口,主要用來顯示IController和IModel的一些狀態信息以及其他消息。

      Applications中的內個Server只要按照其任務實現IController,IModel和IView就行了。

1  Center Server詳細設計

       CenterServer的主要功能是維護游戲列表和房間信息。游戲列表是從ServerInfoDB中加載到的,下面是一個簡略的結構圖。

 

圖2 CenterServer維護的信息結構

      因為前面已經詳細介紹了應用層架構,所以這里只是列出IModel的實現,至於IController的實現,則是解析請求。要么用ServerList中取出游戲列表信息和房間信息返回之。要么向ServerList中添加房間,刪除房間以及讓ServerList更新在線人數等。

      CenterServer在處理請求時產生的輸出信息會讓IView輸出顯示。

2  Logon Server 詳細設計

圖3  LogonServer結構圖

      IController的實現LogonController有以下幾個任務:

      1) 轉發注冊請求給LogonHandler讓其處理;

      2) 轉發登錄請求給LogonHander讓其處理;

      3) 定時使用CenterSocket發送請求給CenterServer, 取回的游戲列表和房間信息存入ServerList這中。

      IModel的實現LogonHandler的主要功能就是注冊用戶以及驗證登錄。

      CenterSocket是用來向CenterServer發送請求的。

      ServerList存的數據和CenterServer中的ServerList一樣,但是其實現不同,它存的是LogonController從CenterServer中取回來的。

3  LogServer詳細設計

      LogServer的實現比較簡單,下面是其結構圖

圖4 LogServer結構圖

      LogServer從IController繼承下來,它接收玩家核查游戲過程的請求,並將其轉發給LogFetcher處理,處理完成后,將結果返回給玩家。

      LogFetcher實現了IModel, 它的任務很簡單,就是去數據庫取得游戲過程的日志。

4  Room Server 詳細設計

      RoomServer是最重要的一類Server,玩家的大多數操作都由它來響應,其結構圖如圖5所示。

 圖5 RoomServer結構圖

      UserManager繼承自IModel, 主要任務是管理在線玩家,RoomController在接收到玩家進入房間的請求后,就會根據玩家的的用戶名和密碼從UserInfoDB中加載該玩家的詳細信息,生成一個UserItem, 加入在線隊列。UserManager同時還會維護一個離線隊列,存儲那些請求離線或者掉線的玩家。

      RoomController實現了IController接口。它主要有以下幾個功能:

      1) 將進入房間的請求交和UserManager處理.

      2) 啟動時通過CenterSocket向CenterServer注冊,關閉時從其中注銷,同時定時通過CenterSocket從CenterServer取回游戲列表和房間信息(由於空間問題,圖中沒有畫出來,基本和LogonServer差不多)。

      3) 將游戲相關的請求轉交給TableMgr處理.

      4) 處理聊天及管理請求。

       TableMgr管理着這個房間里的桌子。而Table則是處理公共棋牌游戲邏輯的地方。主要包括找椅子坐下,離開等。而具體地游戲命令比如德州撲克的加注等會由Table轉發給GameModule進行處理。處理結果由RoomController返回給玩家。

5  Game Module詳細設計

      這里以德州撲克為例,來說明一個游戲的邏輯的結構,

 

圖6 德州撲克游戲模塊結構

      這里雖然給出的是德州撲克的結構圖,但是其他游戲也有類似的結構。

      每一個游戲模塊都必須要實現兩個接口ITableObserver,游戲的主要邏輯就在放在這里面,因為桌子會將玩家的操作信息轉化以后傳遞過來,所以這里是處理洗牌,發牌,玩家投注處理的最佳場所。另外一個必須實現的接口是IGameServiceMgr,這個接口是游戲模塊暴露給桌子的工廠接口,桌子通過它才能創建出TexasPokerTableObserver。

      IGameServiceMgr中方法說明:

      1) CreateTableObserver  創建游戲邏輯處理的實現,這里會創建並返回TexasPokerTableObserver。

      2) GetGameAttrib  返回游戲的屬性,主要包括: 游戲的名稱 ,游戲描述,游戲模塊的名稱,客戶端模塊名稱,游戲數據庫名稱等

      3) RectifyRoomOption 由於一些游戲對房間有特殊要求,所以RoomServer需要調用這個接口調整房間的一些設置

      4) CreateAndroidUser 創建機器人的監聽者, 其角色相當於現實中的玩家。

      TexasPokerRule主要封裝了德州撲克的一些基本規則,如果選出最大牌型、比較牌型的大小,洗牌,找出贏家等。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM