這里的應用層,指的是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主要封裝了德州撲克的一些基本規則,如果選出最大牌型、比較牌型的大小,洗牌,找出贏家等。