




已閱讀5頁,還剩45頁未讀, 繼續免費閱讀
版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
目錄 第一章 緒論 . - 1 - 1.1 問題概述 . - 1 - 1.1.1 問題的來源 . - 1 - 1.1.2 目的和意義 . - 1 - 1.1.3 國內外研究現狀 . - 1 - 1.2 問題剖析 . - 2 - 1.2.1 主要問題 . - 2 - 1.2.2 難點和關鍵 . - 3 - 1.2.3 思路和方法 . - 3 - 第二章 相關的知識和工具 . - 4 - 2.1 解決問題的知識基礎 . - 4 - 2.2 開發平臺 . - 5 - 2.3 數據庫 . - 5 - 第三章 總體設計 . - 6 - 3.1 總體設計的框架 . - 6 - 3.2 模塊功能概述 . - 7 - 3.3 關鍵算法 . - 8 - 3.4關鍵技術 . - 12 - 第四章 詳細設計 . - 14 - 4.1數據庫結構 . - 14 - 4.2模塊結構 . - 14 - 4.3 重要模塊詳述 . - 15 - 第五章 程序編碼 . - 18 - 5.1 數據結構 . - 18 - 5.2主要界面 . - 21 - 5.3 重要模塊程序實現 . - 24 - 第六章 問題和展望 . - 32 - 6.1 特色與成功 . - 32 - 6.2 問題與展望 . - 32 - 參考文獻 . - 33 - 附錄 . - 34 - 游戲大廳 . - 34 - 游戲類 . - 38 - 緒論 - 1 - 第一章 緒論 1.1 問題概述 1.1.1 問題的來源 隨著 Internet 的普及,網絡游戲已經成為大家耳濡目染的新生事物。網絡游戲從出現到現在的發展的時間很短,但是其發展速度卻非常之快。現在,可以說網絡游戲已經成為人們休閑、娛樂的有效方式。國內比較有名氣的網絡游戲有聯眾網絡游戲世界 中國游戲中心 以及這幾年受玩家親睞的傳奇、魔獸世界等。 1.1.2 目的和意義 對當今網絡游戲的設計、架構進行分析、探索和實踐。提供友好的客戶操作界面,通過客戶端與服務器之間的網絡傳遞數據,實現了多人協同游戲的目的。分析現今網絡游戲體系結構及設計模式的優缺點,及對網 絡游戲的發展給予分析和展望。 1.1.3 國內外研究現狀 現今網絡游戲的體系結構(見圖 1-1) ,包括客戶機程序、服務器程序、數據庫服務器。 網絡游戲 - 2 - 圖 1-1 網絡游戲體系結構 1.2 問題剖析 1.2.1 主要問題 在開發網絡游戲時,首先要建立底層的網絡通信類,利用網絡通信類連接構建客戶服務器之間的 TCP/IP連接,然后在該連接的基礎上利用自設定的協議進行客戶端登錄、進行游戲等操作。在以上協議的基礎上,根據不同的游戲編寫不同的游戲邏輯處理類,在該邏輯處理類中實現了對應的游戲邏輯,如實例中的軍棋,則實現相互之 間的對弈等功能。同時在服務器端還需要和數據庫服務器交互,用于讀取或保存客戶信息(如用戶積分、密碼、個人資料等數據)。 緒論 - 3 - 1.2.2 難點和關鍵 1、有一個或多個游戲服務器啟動特定游戲服務。 2、游戲者到游戲網站上下載客戶端程序并且申請游戲賬號 ID。然后啟動客戶端程序通過某種網絡協議連接游戲服務器。 3、客戶端程序負責處理客戶端顯示和操作界面,具有簡單的邏輯處理功能,同時負責接收發送與服務器端交互的數據包。 4、服務器程序負責處理服務器端邏輯、游戲邏輯、客戶之間的網絡信息傳遞,以及數據庫之間的數據讀取保存工作。 同時服務器端還要承擔客戶端數據的接收、轉發工作。 1.2.3 思路和方法 網絡游戲通常的運行方式 (見圖 1-2)。 圖 1-2 網絡游戲交互圖 網絡游戲 - 4 - 第二章 相關的知識和工具 2.1 解決問題的知識基礎 網絡游戲常用的網絡協議有適用于 Internet 的 TCP/IP協議、適用局域網(比如星際)的 IPX協議。 (一 ) TCP/IP協議 TCP/IP協議 (Transmission Control Protocol/Internet Protocol,傳輸控制協議 /網際協議 )是 Internet 中計算機進行通信的標準, 其命名起源于該組協議中最重要的兩個協議 TCP和 IP。任何關于 Internet協議的討論必須由 TCP/IP開始,它也是其他所有協議的基礎。 TCP/IP協議是 Internet網絡的共同語言,主機之間必須利用 TCP/IP互通信息。 TCP/IP協議目前已經成為發展最成功的通信協議之一,它起源于 20 世紀 60年代末美國政府資助的一個分級交換網絡研究項目,允許分布在各地的使用不同操作系統的網絡進行通信。隨著世界范圍個人電腦的普及,日常無論收發郵件、訪問網頁和文件傳輸都已經離不開 TCP/IP協議, TCP/IP協議已經成為 Internet的基礎。 (二 ) TCP/IP結構 TCP/IP實際上就是在物理網上的一組完整的協議。其核心部分是傳輸層協議 (TCP/UDP)、網絡層 (IP)和物理接口層,這三層通常在操作系統內核中實現。 TCP/UDP 層提供了傳輸層服務,而 IP協議提供了網絡層服務。 TCP/IP協議是一個四層協議,其結構如圖 2-1 所示。 圖 2-1 TCP/IP 協議體系結構圖 相關的知識和工具 - 5 - 應用程序與 TCP/IP 可靠傳輸之間接口具有五大特性: 面向數據流 當兩個用戶進程傳輸大量數據時,我們把這些數據當做可劃分為八位組( octer,字節)的比特流,在目的機器上運行的數據流投遞服務軟件提給接收方的八位組與信源機上發送方送出來的完全相同。 虛電路連接 數據流的傳輸與電話相似,使用“虛電路”這個術語來描述這種連接是因為在應用程序看來這種連接像是一條專用的硬件電路,這種可靠連接的錯覺是由數據流投遞服務提供。 有緩沖的傳送 使用虛電路服務來發送數據流的應用程序不斷向協議軟件遞交數據八位組。為了提高效率以及減少網絡延遲,協議軟件在實現時都會從數據流中收集到足夠多的數據,組成大小合理的數據包后再送到網絡上傳輸。 無結構的數據 TCP/IP 協議并不區 分結構化的數據流。使用數據流的應用程序必須在開始連接之前就了解數據流的內容并對其格式進行協商。 這點很重要,在程序中表現為 send函數只能發送字符串,這就需要將接收的字符串轉化需要的結構化的數據。 全雙工連接 TCP/IP 流服務所提供的功能是雙向的全雙工連接。其中包括了兩個獨立、流向相反的數據流,而這兩個數據流之間不進行顯式的交互。 常用協議主要包括 TCP/UDP層協議和 IP層協議。 TCP和 UDP都是傳輸層協議,都使用 IP協議作為網絡層協議。使用 UDP 協議的應用程序必須承擔可靠性的工作,包括報文的丟失、重復 、亂序以及連接失效等問題,而程序員編程時則容易疏忽。 2.2 開發平臺 操作系統 Windows 2000, 開發工具 VisualC+6.0。 2.3 數據庫 SQL Server 2000, 是一個全面的數據庫平臺,引擎為關系型數據和結構化數據提供了安全可靠的存儲功能。 網絡游戲 - 6 - 第三章 總體設計 3.1 總體設計的框架 軍棋游戲的總體設計框架,客戶端如圖 3-1所示。 圖 3-1 軍棋游戲架構客戶端 軍棋游戲的總體設計框架,服務器如圖 3-2所示。 圖 3-2 軍棋游戲架構服務器 總體設計 - 7 - 3.2 模塊功能 概述 客戶端類的劃分: 游戲基本類:負責處理游戲中一些完成基本功能的類,如處理聲音類、處理動畫圖標,圖形按鈕等類,基本類的特點是被其他類在特定處所調用,并不動生成對象。 游戲框架類:負責處理游戲中客戶端用于顯示程序界面和繪制游戲界面以及顯示用戶信息和廣告信息等處理任務。 游戲通信類:負責處理游戲中客戶服務器之間的網絡傳輸細節,從而在編程中不用考慮網絡通信細節,達到客戶和服務器之間的透明的效果。 游戲應用程序類:主要負責處理應用程序中各種設置顯示對話框、程序主線程處理、程序中基本的運行類框架的管理,以及游戲中 圖形的處理和顯示等任務的處理。 游戲處理類:主要用于處理游戲簡單邏輯、負責解析和處理與服務器端交互的游戲數據,以及在游戲運行中維護游戲中的各種數據,同時維護處理游戲主線程邏輯等功能。 服務器類的劃分: 游戲通信類:負責處理游戲中客戶服務器之間的網絡傳輸細節,從而在編程中不用考慮網絡通信細節,達到客戶和服務器之間透明傳輸的效果。 游戲協議類:負責處理游戲中客戶服務器之間交互所傳遞的數據,并且對該數據格式進行打包和解包,同時根據該包中所包含的指令串進行相應的操作。 游戲邏輯類:負責處理游戲邏輯,如軍棋游戲中用 于維護軍棋邏輯,判斷下棋,得分等處理類。 用戶管理類:用于管理用戶資料,在用戶登錄后通過數據庫驗證用戶名和密碼,通過驗證后從數據庫讀取用戶的詳細資料。同時在程序中維護用戶數據,在用戶游戲結束和退出游戲時將用戶數據保存到數據庫中。 服務器框架類:用于管理游戲大廳的數據,包括一些數據的列表。 數據庫類:用于網絡游戲的服務器端在處理大量的客戶資料時,使用數據庫進行大量數據的存儲和查詢所調用的類方法。 網絡游戲 - 8 - 3.3 關鍵算法 模塊間的數據傳遞設計,如圖 3-3所示。 圖 3-3 模塊間的數據傳遞設計 這樣,在 CTableView 和 CGameDlg 中通過指針,也可向服務器發送消息。而CCGameHallFrameView 收到消息后,同時也控制 CTableView和 CGameDlg 的行為。 采用內存作圖的方式,消除了閃爍。首先創建一個內存 dc,將繪圖的工作先在內存dc中做好,再貼到實際 dc上去。做法如下: 首先創建關于屏幕的內存 DC, 代碼為 MemDC.CreateCompatibleDC( pDC); 之后創建一幅關于屏幕 DC的圖畫 ,部分代碼如下 : CRect rect; this-GetClientRect(rect); CBitmap bmpFace; bmpFace.CreateCompatibleBitmap(pDC,rect.Width(),rect.Height(); 注意把握 rect的尺寸為客戶區域大小; 之后將這幅畫選入內存 DC中, 部分代碼如下: CBitmap* pOldBmp = NULL; pOldBmp = MemDC.SelectObject(&bmpFace); 之后可以開始在內存 DC中進行任何繪制動作; 部分代碼如下: CBrush brush(RGB(255,255,255); MemDC.FillRect(rect,&brush); for(int i=0;iBitBlt(rect.left,rect.top,rect.Width(),rect.Height(),&MemDC,rect.left,rect.top,SRCCOPY); 最后進行相關的資源回收動 作, 部分代碼如下: MemDC.SelectObject(pOldBmp); bmpFace.DeleteObject();。 同時我們要把系統的 ON_WM_ERASEBKGND消息 函數重載為 return FALSE, 否則 還是會 出現閃 爍 情況。 在對話框中用這個方法的時候,要注意將有控件的部分和需要繪圖的部分分開,可采用如下方法 ,部分代碼如下: : CRect rectClient;CRgn rgn1,rgn2;/rgn3,rgn4; GetClientRect(rectClient); rgn1.CreateRectRgnIndirect(rectClient); rgn2.CreateRectRgn(730,0,962,670); if(rgn1.CombineRgn(&rgn1,&rgn2,RGN_XOR) = ERROR) return; MemDC.FillRgn(&rgn1,&brush); 服務器對連接的用戶數據的數據結構的設計,用下面兩個結構: typedef struct TT int d4; int ID4; int board1717; BOOL begin4; ; typedef struct MM 網絡游戲 - 10 - CString name,sex; int score; ; 連接的 socket保存在如下鏈表中: typedef CList SOCKET_ARRAY; SOCKET_ARRAY m_connectionList; 與服務器建立連接后,相應的用戶數據,保存在 MM 結構數組中,位置為其 socket在 m_connectionList中的相應位置,這樣就可以通過連接的 socket找到相應的信息。TT 是保存大廳數據的結構, d 表示四個坐位有沒有人, ID 表示就坐的人的 socket 在鏈表中的位置。 board 為棋盤數據。每個桌子有每個桌子的棋盤數據,互不干擾。隨著游戲的進行而不斷更新。 begin表示四個玩家有沒有下調度完成的指令。 應用矩陣的 變換 實現坐標旋轉。不管你坐在哪個方位,玩游戲時,你始終是在正下方,這就需要實現虛擬坐標到目標坐標的旋轉變換,如圖 3-4。 圖 3-4 坐標圖 X為實際坐標, x為虛擬坐標,轉換公式推導如下,見圖 3-5。 圖 3-5 坐標變換公式推導 direct 為自己座位方向, switch(direct) case 0: (a=90o) X, Y, 1=-y+16, x, 1 /東 case 1:(a=0o) X, Y, 1=x, y, 1 /南 case 2:(a=-90o) X, Y, 1=y, -x+16, 1 /西 總體設計 - 11 - case 3:(a=180o) X, Y, 1=-x+16, -y+16, 1 /北 回溯法求工兵路徑,軍棋游戲邏輯不復雜,只有工兵能夠自由飛行。在這里沒有求工兵起點到目標點的 最短 路 徑 ,而只是 用 回溯 法 求出 其中一條路徑,所以在游戲中你會發現工兵有時候會繞些彎路。這和老鼠走迷宮差不多的。 工兵迷宮數組: int RAILWAY1717= 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0, 0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0, 0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0, 0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0, 0,0,0,0,0,1,1,3,1,3,1,1,0,0,0,0,0, 0,1,1,1,1,1,1,3,1,3,1,1,1,1,1,1,0, 0,1,0,0,0,2,2,0,2,0,2,2,0,0,0,1,0, 0,1,0,0,0,1,1,3,1,3,1,1,0,0,0,1,0, 0,1,0,0,0,2,2,0,2,0,2,2,0,0,0,1,0, 0,1,1,1,1,1,1,3,1,3,1,1,1,1,1,1,0, 0,0,0,0,0,1,1,3,1,3,1,1,0,0,0,0,0, 0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0, 0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0, 0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0, 0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0表示該位置不在工兵鐵道上, 1表示在該位置可向上下左右方向移動, 2表示在 該位置只能向上下方向移動, 3表示在該位置只能向左右方向移動。 網絡游戲 - 12 - 3.4 關鍵技術 網絡通信, Windows Socket 編程接口: Windows Socket (簡稱 WinSock)是在 Win32 平臺上訪問基層網絡協議的接口。在不同的 Win32平臺上, Windows Socket以不同的方式存在著,作為網絡編程接口而不是協議存在。 套接字( Socket)概念,套接字是從英文單詞 Socket 翻譯而來,它是網絡通信的基本操作單元,是應用 層到傳輸層的接口,可以將套接字看作不同主機間的進程進行雙向通信的端點。 Windows Socket組成部分, Windwos Sockets 實現一般都由兩部分組成:開發組件和運行組件。開發組件是供程序員開發 Windows Sockets 應用程序使用的,主要是WinSock.h頭文件。對于 Windows Sockets應用程序的源文件來說,只要包括 WinSock.h就可以了。除此之外,在使用 WinSock 的項目中還需要加入 WinSock API 引入庫wsock32.lib。運行組件是 Windows Sockets 應用程序接口的動態連接庫( DLL) ,文件名為 WinSock.dll,應用程序在執行時通過裝入它實現網絡通信功能。 Windows Sockets 編程的基本模式,要通過互聯網進行通信,你至少需要一對套接字,其中一個運行于客戶端,我們稱之為 ClientSocket,另一個運行于服務器端,我們稱之為 ServerSocket。使用 Socket 進行網絡通信一般有兩種方式:基于面向連接的流方式和基于無連接的數據報方式。面向連接的的流方式調用過程如圖 3-6所示。 總體設計 - 13 - 圖 3-6 面向連接的流方式調用過程 網絡游戲 - 14 - 第四章 詳細設計 4.1 數據庫結構 服務器端數據庫結構 如 表 4-1。 User 列名 數據類型 長度 允許空 描述 主鍵 name char 10 no 用戶名 code char 10 no 密碼 score int 4 yes 游戲積分 sex char 2 yes 性別 表 4-1, 玩家信息 用作記錄玩家游戲數據。 4.2 模塊結構 客戶端模塊結構: 游戲基本類 ,該類包中包括 CBorderButton、 CClockObject、 CWave 類。 游戲框架類,該類包中包括 CMainFrame、 CCGameHallFrameView、 CHtmlViewEx、CTableView類。 游戲通信類,該類包中包括 CClient類。 游戲應用程序類,該類包包括 CGameDlg 類,其中包括對游戲處理類的調用。 游戲處理類,該類包中主要包括 TakeGame 類。 服務器模塊結構: 游戲通信類,由 CServer類實現。 游戲協議類,由 CServerProtocol類實現。 游戲邏輯類,由 CServerLogic類實現。 數據庫類,由 CServerFrameSet類實現。 用戶管理類,由 CServerFrameView類實現。 服務器框架類,由 CServerFrame類實現。 詳細設計 - 15 - 4.3 重要模塊詳述 客戶端模塊: CBorderButton 類是帶有邊框的圖片按鈕類, CClockObject 類是時鐘類, CWave是用來播放聲音的類,當游戲用戶下棋,吃子,起身或坐下時要播放聲音,選擇在程序中調用 API 函數 PlaySound 直接播放在資源中的聲音文件。模塊描述如圖 4-1。 圖 4-1 游戲基本類模塊描述 CMainFrame 類是游戲窗口中的游戲大廳框架類,其中包括構架廣告顯示窗口,可玩的游戲類、工具 欄、游戲桌的信息、顯示信息等, CCGameHallFrameView類是用來在游戲大廳窗口左側顯示可以玩的游戲以及游戲室,采用樹狀結構顯示。 CHtmlViewEx 類用于構造廣告顯示窗口,用于游戲框架中顯示廣告頁。CTableView 顯示包含游戲桌的游戲大廳,在大廳中多人在等待開始游戲。模塊描述如圖 4-2。 圖 4-2 游戲框架類模塊描述 網絡游戲 - 16 - 游戲通信類, CClient,功能為建立和服務器的連接,能及處理通信,采用異步機制,以自定義消息事件處理通信等功能。采用自定義消息: WM_USER + 101。模塊描述 如圖 4-3。 圖 4-3 游戲通信類模塊描述 游戲應用程序類, CGameDlg,其中包括對游戲處理類的調用。 CGameDlg 主要負責處理應用程序中各種設置顯示對話框、程序主線程處理、以及游戲中的圖形的處理和顯示等任務的處理。模塊描述如圖 4-4。 圖 4-4 游戲應用程序類模塊描述 游戲處理類, TakeGame 主要用于處理游戲簡單邏輯、負責解析和處理與服務器端交互的游戲數據,以及在游戲運行時維護游戲中的各種數據,同時維護處理游戲主線程邏輯等功能。模塊描述如圖 4-5。 圖 4-5 游戲處理類模 塊描述 詳細設計 - 17 - 服務器模塊: 游戲通信類,由 CServer 類實現。負責處理游戲中客戶與服務器之間的網絡連接細節,從而使得對于客戶和服務器之間的數據傳輸可以忽略通信細節。模塊描述如圖 4-6。 圖 4-6 游戲通信類模塊描述 游戲協議類,由 CServerProtocol類實現。 游戲協議類負責 解析客戶 /服務器端所 傳輸的協議,同時根據不同的協議調用不同的操作函數,并根據用戶狀態變化維護用戶信息。模塊描述如圖 4-7。 圖 4-7 游戲協議類模塊描述 游戲邏輯類負責處理游戲邏輯,在軍棋游戲中包括計算得分,計算 贏等。游戲邏輯類 CServerLogic和游戲協議類分離的優點是可以只通過修改邏輯類來改變為不同的網絡游戲,如修改為“象棋邏輯”即可以成為象棋游戲,修改為“升級邏輯”即可以成為升級游戲。 用戶管理類,直接在 CCServerFrameView 中實現。 數據庫類,采用 SQL Server 2000 數據庫,只是用來保存玩家的資料等一些數據。采用 MFC ODBC 數據庫編程,在程序中為 CServerFrameSet 類。正如 MFC提供的其他類庫很好地對相應的 Win32 API 作了封裝, MFC 提供的 ODBC 類庫也相應地對 ODBC API 作了封裝,通過提供一種高級接口而避免直接使用 ODBC API網絡游戲 - 18 - 所涉及的種種繁瑣處理,簡化了對 ODBC 數據庫的應用程序編程。模塊描述如圖4-8。 圖 4-8 數據庫類模塊描述 第五章 程序編碼 5.1 數據結構 用 17 17的數組表示軍棋的棋盤,如下: int BOARD1717 = -1,-1,-1,-1,-1,-1,0,0,0,0,0,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,0,0,0,0,0,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,0,0,0,0,0,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,0,0,0,0,0,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,0,0,0,0,0,-1,-1,-1,-1,-1,-1, 程序編碼 - 19 - -1,-1,-1,-1,-1, 0,0,0,0,0,0, 0,-1,-1,-1,-1,-1, 0,0,0,0,0,0, 0, 0, 0, 0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,-1, 0,-1,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0, 0, 0, 0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,-1, 0,-1,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0, 0, 0, 0,0, 0,0,0,0,0,0, -1,-1,-1,-1,-1, 0, 7, 3, 4,5, 3, 0,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,10, 0, 1,0, 9,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1, 8,10, 0,1, 5,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1, 6, 0, 4,0, 3,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1, 2, 7, 6,1,11,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,11,12,11,2, 2,-1,-1,-1,-1,-1,-1, ; 1表示棋 盤以外的位置 0 表示棋盤內位置,但無棋子 1 工兵 2 排長 3 連長 4 營長 5 團長 6 旅長 7 師長 8 軍長 9 司令 10 炸彈 11 地雷 12 我方軍旗 網絡游戲 - 20 - 13 上方盟友或敵方的棋子 14 左邊敵方的棋子 15 右邊敵方的棋子 16 上方軍旗 17 左方軍旗 18 右方軍旗 為了處理工兵的走法的方便,將四個轉角斜對的位置恒置為 0,這樣在為工兵尋找路徑時會方便一些。 游戲協議 以 char(20)作為一次信息的起始點,終點。“”在字符串中用空格代替。以一字符串作為向服務 發出的請求信息,服務器也以相應的一字符串發送回客戶端作為應答。 對話: A桌子號聊天內容 坐下: B桌子號方位 調度完成: C桌子號方位 (棋盤數據 )用一維數據形式表示 6 5 的二維數組,數據之間用空格開。 開始游戲: (只由服務器發出 ) D對戰類型 下棋: E 桌子號方位起點 (x,y)終點 (x,y) 吃: (只由服務器發出 )(包括移動 ) F 起點 (x,y) + 終點 (x,y) 被吃: (只由服務器發出 ) G 起點 (x,y) + 終點 (x,y) 炸: (只由服務器發出 ) H 起點 (x,y) + 終點 (x,y) 程序編碼 - 21 - 輸:離開:(包括斷線 ) 投降 : I 方位 求和: K 桌子號方位 注冊: L 用戶名密碼 注冊成功: M + 用戶名 登錄: N + 用戶名密碼 登錄結果: O + 1/0 離開: P + 桌子號 方位 請求接收信息: Q + 桌子號 方位 碰: R 起點 (x,y) + 終點 (x,y) 5.2 主要界面 服務器界面如圖 5-1所示。 網絡游戲 - 22 - 圖 5-1 服務器啟動界面 客戶端大廳界面如圖 5-2所示。 程序編碼 - 23 - 圖 5-2 客戶端大廳界面 軍棋游戲界面,如圖 5-3所示: 網絡游戲 - 24 - 圖 5-3 軍棋游戲界面 5.3 重要模塊程序實現 客戶端三拆分窗口的實現 BOOL CMainFrame:OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext) if(NULL=m_wndSplitter.CreateStatic(this,1,2) return FALSE; if(!m_wndSplitter.CreateView(0,0,RUNTIME_CLASS(CTableView),CSize(620,800),pContext) return FALSE; if(NULL=m_wndLeftSplitter.CreateStatic(&m_wndSplitter,2,1, WS_CHILD|WS_VISIBLE,m_wndSplitter.IdFromRowCol(0,1) 程序編碼 - 25 - return FALSE; if(!m_wndLeftSplitter.CreateView(0,0,RUNTIME_CLASS(CCGameHallFrameView),CSize(380,300),pContext)| !m_wndLeftSplitter.CreateView(1,0,RUNTIME_CLASS(CHtmlViewEx),CSize(380,500),pContext) return FALSE; pWebView=(CHtmlViewEx*)m_wndLeftSplitter.GetPane(1,0); pServerTreeView=(CCGameHallFrameView*)m_wndLeftSplitter.GetPane(0,0) pTableView=(CTableView*)m_wndSplitter.GetPane(0,0); pServerTreeView-pTable=pTableView; pWebView-Navigate2(/zhou207,0,NULL); return TRUE; 客戶端初始化及連接 void CClient:ClientInit() if(WSAAsyncSelect(m_hSocket,m_hWnd,CLI_MESSAGE,FD_READ|FD_WRITE|FD_CLOSE|FD_CONNECT)0) AfxMessageBox(Error in select); BOOL CClient:InitAndConnect(HWND hWnd, UINT port, CString strServer) m_hWnd=hWnd; m_uPort=port; m_strServer=strServer; if(m_hSocket!=NULL) 網絡游戲 - 26 - /先將以前打開的套接字關閉 closesocket(m_hSocket); m_hSocket=NULL; /創建面向連接的 socket m_hSocket=socket(AF_INET,SOCK_STREAM,0); ASSERT(m_hSocket!=NULL); ClientInit(); /設置連接信息:網絡協議 IP地址端口 m_addr.sin_family=AF_INET; m_addr.sin_addr.S_un.S_addr=inet_addr(m_strServer.GetBuffer(0); m_addr.sin_port=htons(m_uPort); /連接服務器 int ret=0; int error=0; ret=connect(m_hSocket,(LPSOCKADDR)&m_addr,sizeof(m_addr); if(ret=SOCKET_ERROR) /連接失敗 if(GetLastError()!=WSAEWOULDBLOCK) AfxMessageBox(_T(請確認服務器確實已經打開并工作在同樣的端口!); return FALSE; return TRUE; 服務器初始化及連接 程序編碼 - 27 - void CServer:ServerInit() /設置 socket 的異步模式 if(WSAAsyncSelect(m_hSocket,m_hWnd,SER_MESSAGE,FD_ACCEPT|FD_READ|FD_WRITE|FD_CLOSE)0) AfxMessageBox(error select); BOOL CServer:InitAndListen(HWND hWnd, UINT port) m_uPort=port; m_hWnd=hWnd; if(m_hSocket!=NULL) /先關閉已經打開的 socket closesocket(m_hSocket); m_hSocket=NULL; /創建面向連接的流方式的套接字 m_hSocket=socket(AF_INET,SOCK_STREAM,0); ASSERT(m_hSocket!=NULL); ServerInit(); m_addr.sin_family=AF_INET; m_addr.sin_addr.S_un.S_addr=INADDR_ANY; m_addr.sin_port=htons(m_uPort); int ret=0; int error=0; /綁定套接字到本機的某個端口 ret=bind(m_hSocket,(LPSOCKADDR)&m_addr,sizeof(m_addr); if(ret = SOCKET_ERROR) 網絡游戲 - 28 - AfxMessageBox(Binding Error); return FALSE; ret = listen(m_hSocket, 64); if(ret = SOCKET_ERROR) AfxMessageBox(Listen Error); return FALSE; return TRUE; 回溯法尋找工兵路徑 BOOL TakeGame:TakeEngineer(CPoint from, CPoint to) POS p;int x,y;engineer=TRUE; p.d=0;p.x=from.x;p.y=from.y;top=0; if(RAILWAYp.xp.y=2) p.d=1; stacktop=p;int f1717; while(top=0) p=stacktop; if(p.x=to.x&p.y=to.y) return TRUE; if(p.dDoModal()=IDOK) name=login-m_name; code=login-m_code; ServerIP=login-m_ServerIP; if(name=|code=|ServerIP=) MessageBox(每項內容都不能為空 ); else r=1; delete login; else register1=new CRegister1(); if(register1-DoModal() if(register1-m_code1=register1-m_code2) code=register1-m_code1; sex=register1-m_sex; ServerIP=register1-m_IP; if(code=|sex=|ServerIP=) MessageBox(每項內容都 不能為空 ); else r=2; delete register1; if(r=1|r=2) if(ClientConnect()=TRUE) /m_Init=TRUE; /pTable-flag=1; /pTable-DrawTable(); pTable-pClient=&m_client; 附錄 - 35 - if(r=1) ClientMessage(N); else if(r=2) ClientMessage(L); *pResult = 0; void CCGameHallFrameView:OnSize(UINT nType, int cx, int cy) CFormView:OnSize(nType, cx, cy); / TODO: Add your message handler code here if( m_wndTree.m_hWnd ) / Fill the whole Client Area of the View with the Control m_wndTree.MoveWindow( 0, 0, cx, cy ); LRESULT CCGameHallFrameView:OnClientMessage(WPARAM wParam, LPARAM lParam) char s1024,k; int len;CString str; switch(lParam) case FD_CONNECT: len=GetLastError(); if(len!=0) AfxMessageBox(Error in Connecting); else m_Init=TRUE; return 0; case FD_READ: len=recv(m_client.m_hSocket,s,1024,0); slen=NULL;str=s; k=protocol.Anaysys(str); dealMessage(k); return 0; case FD_WRITE: return 0; case FD_CLOSE: return 0; default: MessageBox(服務器已關閉! ); return 0; 網絡游戲 - 36 - BOOL CCGameHallFrameView:ClientConnect() if(m_client.InitAndConnect(m_hWnd,PORT,ServerIP)=FALSE) return FALSE; return TRUE; char CH=char(20); void CCGameHallFrameView:ClientMessage(char k) CString str; str=CH; str+=k; switch(k) case L: str+=code; if(sex=女 ) str+= 2; else str+= 1; str+=CH; /MessageBox(str); Sleep(100); m_client.SendString(str); break; case N: str+=name;str+= ;str+=code; str+=CH; Sleep(100);
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 票務代理地勤服務知識考核試卷
- 碳素材料在智能窗戶中的功能實現考核試卷
- 出版業品牌建設與宣傳推廣考核試卷
- 數字出版物營銷策略與應用考核試卷
- 礦產勘查中的勘查成果資料信息化考核試卷
- 油炸食品在快餐行業中的應用與市場競爭考核試卷
- 淡水養殖水體富營養化風險評估考核試卷
- 晉中師范高等專科學校《Python語言程序設計實驗》2023-2024學年第二學期期末試卷
- 新疆塔城地區烏蘇市2025年數學四年級第二學期期末聯考試題含解析
- 山西醫科大學晉祠學院《大學生精益創新創業實踐》2023-2024學年第二學期期末試卷
- 眼科門診病歷
- 彝文《指路經》課件
- 高考閱讀理解(main-idea)(課堂)課件
- 有限元分析研究匯報課件
- 境外貨物管控應急預案方案
- 江蘇省醫療服務項目價格標準
- 公司報廢申請單
- 高新區市政道路可行性研究報告
- TSSITS 2002-2022 低速無人駕駛清掃車安全規范
- 個人理財分期還款計劃管理表1
- 畢業生就業推薦表word模板
評論
0/150
提交評論