




已閱讀5頁,還剩45頁未讀, 繼續(xù)免費(fèi)閱讀
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
目錄 第一章 緒論 . - 1 - 1.1 問題概述 . - 1 - 1.1.1 問題的來源 . - 1 - 1.1.2 目的和意義 . - 1 - 1.1.3 國內(nèi)外研究現(xiàn)狀 . - 1 - 1.2 問題剖析 . - 2 - 1.2.1 主要問題 . - 2 - 1.2.2 難點(diǎn)和關(guān)鍵 . - 3 - 1.2.3 思路和方法 . - 3 - 第二章 相關(guān)的知識(shí)和工具 . - 4 - 2.1 解決問題的知識(shí)基礎(chǔ) . - 4 - 2.2 開發(fā)平臺(tái) . - 5 - 2.3 數(shù)據(jù)庫 . - 5 - 第三章 總體設(shè)計(jì) . - 6 - 3.1 總體設(shè)計(jì)的框架 . - 6 - 3.2 模塊功能概述 . - 7 - 3.3 關(guān)鍵算法 . - 8 - 3.4關(guān)鍵技術(shù) . - 12 - 第四章 詳細(xì)設(shè)計(jì) . - 14 - 4.1數(shù)據(jù)庫結(jié)構(gòu) . - 14 - 4.2模塊結(jié)構(gòu) . - 14 - 4.3 重要模塊詳述 . - 15 - 第五章 程序編碼 . - 18 - 5.1 數(shù)據(jù)結(jié)構(gòu) . - 18 - 5.2主要界面 . - 21 - 5.3 重要模塊程序?qū)崿F(xiàn) . - 24 - 第六章 問題和展望 . - 32 - 6.1 特色與成功 . - 32 - 6.2 問題與展望 . - 32 - 參考文獻(xiàn) . - 33 - 附錄 . - 34 - 游戲大廳 . - 34 - 游戲類 . - 38 - 緒論 - 1 - 第一章 緒論 1.1 問題概述 1.1.1 問題的來源 隨著 Internet 的普及,網(wǎng)絡(luò)游戲已經(jīng)成為大家耳濡目染的新生事物。網(wǎng)絡(luò)游戲從出現(xiàn)到現(xiàn)在的發(fā)展的時(shí)間很短,但是其發(fā)展速度卻非常之快。現(xiàn)在,可以說網(wǎng)絡(luò)游戲已經(jīng)成為人們休閑、娛樂的有效方式。國內(nèi)比較有名氣的網(wǎng)絡(luò)游戲有聯(lián)眾網(wǎng)絡(luò)游戲世界 中國游戲中心 以及這幾年受玩家親睞的傳奇、魔獸世界等。 1.1.2 目的和意義 對當(dāng)今網(wǎng)絡(luò)游戲的設(shè)計(jì)、架構(gòu)進(jìn)行分析、探索和實(shí)踐。提供友好的客戶操作界面,通過客戶端與服務(wù)器之間的網(wǎng)絡(luò)傳遞數(shù)據(jù),實(shí)現(xiàn)了多人協(xié)同游戲的目的。分析現(xiàn)今網(wǎng)絡(luò)游戲體系結(jié)構(gòu)及設(shè)計(jì)模式的優(yōu)缺點(diǎn),及對網(wǎng) 絡(luò)游戲的發(fā)展給予分析和展望。 1.1.3 國內(nèi)外研究現(xiàn)狀 現(xiàn)今網(wǎng)絡(luò)游戲的體系結(jié)構(gòu)(見圖 1-1) ,包括客戶機(jī)程序、服務(wù)器程序、數(shù)據(jù)庫服務(wù)器。 網(wǎng)絡(luò)游戲 - 2 - 圖 1-1 網(wǎng)絡(luò)游戲體系結(jié)構(gòu) 1.2 問題剖析 1.2.1 主要問題 在開發(fā)網(wǎng)絡(luò)游戲時(shí),首先要建立底層的網(wǎng)絡(luò)通信類,利用網(wǎng)絡(luò)通信類連接構(gòu)建客戶服務(wù)器之間的 TCP/IP連接,然后在該連接的基礎(chǔ)上利用自設(shè)定的協(xié)議進(jìn)行客戶端登錄、進(jìn)行游戲等操作。在以上協(xié)議的基礎(chǔ)上,根據(jù)不同的游戲編寫不同的游戲邏輯處理類,在該邏輯處理類中實(shí)現(xiàn)了對應(yīng)的游戲邏輯,如實(shí)例中的軍棋,則實(shí)現(xiàn)相互之 間的對弈等功能。同時(shí)在服務(wù)器端還需要和數(shù)據(jù)庫服務(wù)器交互,用于讀取或保存客戶信息(如用戶積分、密碼、個(gè)人資料等數(shù)據(jù))。 緒論 - 3 - 1.2.2 難點(diǎn)和關(guān)鍵 1、有一個(gè)或多個(gè)游戲服務(wù)器啟動(dòng)特定游戲服務(wù)。 2、游戲者到游戲網(wǎng)站上下載客戶端程序并且申請游戲賬號(hào) ID。然后啟動(dòng)客戶端程序通過某種網(wǎng)絡(luò)協(xié)議連接游戲服務(wù)器。 3、客戶端程序負(fù)責(zé)處理客戶端顯示和操作界面,具有簡單的邏輯處理功能,同時(shí)負(fù)責(zé)接收發(fā)送與服務(wù)器端交互的數(shù)據(jù)包。 4、服務(wù)器程序負(fù)責(zé)處理服務(wù)器端邏輯、游戲邏輯、客戶之間的網(wǎng)絡(luò)信息傳遞,以及數(shù)據(jù)庫之間的數(shù)據(jù)讀取保存工作。 同時(shí)服務(wù)器端還要承擔(dān)客戶端數(shù)據(jù)的接收、轉(zhuǎn)發(fā)工作。 1.2.3 思路和方法 網(wǎng)絡(luò)游戲通常的運(yùn)行方式 (見圖 1-2)。 圖 1-2 網(wǎng)絡(luò)游戲交互圖 網(wǎng)絡(luò)游戲 - 4 - 第二章 相關(guān)的知識(shí)和工具 2.1 解決問題的知識(shí)基礎(chǔ) 網(wǎng)絡(luò)游戲常用的網(wǎng)絡(luò)協(xié)議有適用于 Internet 的 TCP/IP協(xié)議、適用局域網(wǎng)(比如星際)的 IPX協(xié)議。 (一 ) TCP/IP協(xié)議 TCP/IP協(xié)議 (Transmission Control Protocol/Internet Protocol,傳輸控制協(xié)議 /網(wǎng)際協(xié)議 )是 Internet 中計(jì)算機(jī)進(jìn)行通信的標(biāo)準(zhǔn), 其命名起源于該組協(xié)議中最重要的兩個(gè)協(xié)議 TCP和 IP。任何關(guān)于 Internet協(xié)議的討論必須由 TCP/IP開始,它也是其他所有協(xié)議的基礎(chǔ)。 TCP/IP協(xié)議是 Internet網(wǎng)絡(luò)的共同語言,主機(jī)之間必須利用 TCP/IP互通信息。 TCP/IP協(xié)議目前已經(jīng)成為發(fā)展最成功的通信協(xié)議之一,它起源于 20 世紀(jì) 60年代末美國政府資助的一個(gè)分級(jí)交換網(wǎng)絡(luò)研究項(xiàng)目,允許分布在各地的使用不同操作系統(tǒng)的網(wǎng)絡(luò)進(jìn)行通信。隨著世界范圍個(gè)人電腦的普及,日常無論收發(fā)郵件、訪問網(wǎng)頁和文件傳輸都已經(jīng)離不開 TCP/IP協(xié)議, TCP/IP協(xié)議已經(jīng)成為 Internet的基礎(chǔ)。 (二 ) TCP/IP結(jié)構(gòu) TCP/IP實(shí)際上就是在物理網(wǎng)上的一組完整的協(xié)議。其核心部分是傳輸層協(xié)議 (TCP/UDP)、網(wǎng)絡(luò)層 (IP)和物理接口層,這三層通常在操作系統(tǒng)內(nèi)核中實(shí)現(xiàn)。 TCP/UDP 層提供了傳輸層服務(wù),而 IP協(xié)議提供了網(wǎng)絡(luò)層服務(wù)。 TCP/IP協(xié)議是一個(gè)四層協(xié)議,其結(jié)構(gòu)如圖 2-1 所示。 圖 2-1 TCP/IP 協(xié)議體系結(jié)構(gòu)圖 相關(guān)的知識(shí)和工具 - 5 - 應(yīng)用程序與 TCP/IP 可靠傳輸之間接口具有五大特性: 面向數(shù)據(jù)流 當(dāng)兩個(gè)用戶進(jìn)程傳輸大量數(shù)據(jù)時(shí),我們把這些數(shù)據(jù)當(dāng)做可劃分為八位組( octer,字節(jié))的比特流,在目的機(jī)器上運(yùn)行的數(shù)據(jù)流投遞服務(wù)軟件提給接收方的八位組與信源機(jī)上發(fā)送方送出來的完全相同。 虛電路連接 數(shù)據(jù)流的傳輸與電話相似,使用“虛電路”這個(gè)術(shù)語來描述這種連接是因?yàn)樵趹?yīng)用程序看來這種連接像是一條專用的硬件電路,這種可靠連接的錯(cuò)覺是由數(shù)據(jù)流投遞服務(wù)提供。 有緩沖的傳送 使用虛電路服務(wù)來發(fā)送數(shù)據(jù)流的應(yīng)用程序不斷向協(xié)議軟件遞交數(shù)據(jù)八位組。為了提高效率以及減少網(wǎng)絡(luò)延遲,協(xié)議軟件在實(shí)現(xiàn)時(shí)都會(huì)從數(shù)據(jù)流中收集到足夠多的數(shù)據(jù),組成大小合理的數(shù)據(jù)包后再送到網(wǎng)絡(luò)上傳輸。 無結(jié)構(gòu)的數(shù)據(jù) TCP/IP 協(xié)議并不區(qū) 分結(jié)構(gòu)化的數(shù)據(jù)流。使用數(shù)據(jù)流的應(yīng)用程序必須在開始連接之前就了解數(shù)據(jù)流的內(nèi)容并對其格式進(jìn)行協(xié)商。 這點(diǎn)很重要,在程序中表現(xiàn)為 send函數(shù)只能發(fā)送字符串,這就需要將接收的字符串轉(zhuǎn)化需要的結(jié)構(gòu)化的數(shù)據(jù)。 全雙工連接 TCP/IP 流服務(wù)所提供的功能是雙向的全雙工連接。其中包括了兩個(gè)獨(dú)立、流向相反的數(shù)據(jù)流,而這兩個(gè)數(shù)據(jù)流之間不進(jìn)行顯式的交互。 常用協(xié)議主要包括 TCP/UDP層協(xié)議和 IP層協(xié)議。 TCP和 UDP都是傳輸層協(xié)議,都使用 IP協(xié)議作為網(wǎng)絡(luò)層協(xié)議。使用 UDP 協(xié)議的應(yīng)用程序必須承擔(dān)可靠性的工作,包括報(bào)文的丟失、重復(fù) 、亂序以及連接失效等問題,而程序員編程時(shí)則容易疏忽。 2.2 開發(fā)平臺(tái) 操作系統(tǒng) Windows 2000, 開發(fā)工具 VisualC+6.0。 2.3 數(shù)據(jù)庫 SQL Server 2000, 是一個(gè)全面的數(shù)據(jù)庫平臺(tái),引擎為關(guān)系型數(shù)據(jù)和結(jié)構(gòu)化數(shù)據(jù)提供了安全可靠的存儲(chǔ)功能。 網(wǎng)絡(luò)游戲 - 6 - 第三章 總體設(shè)計(jì) 3.1 總體設(shè)計(jì)的框架 軍棋游戲的總體設(shè)計(jì)框架,客戶端如圖 3-1所示。 圖 3-1 軍棋游戲架構(gòu)客戶端 軍棋游戲的總體設(shè)計(jì)框架,服務(wù)器如圖 3-2所示。 圖 3-2 軍棋游戲架構(gòu)服務(wù)器 總體設(shè)計(jì) - 7 - 3.2 模塊功能 概述 客戶端類的劃分: 游戲基本類:負(fù)責(zé)處理游戲中一些完成基本功能的類,如處理聲音類、處理動(dòng)畫圖標(biāo),圖形按鈕等類,基本類的特點(diǎn)是被其他類在特定處所調(diào)用,并不動(dòng)生成對象。 游戲框架類:負(fù)責(zé)處理游戲中客戶端用于顯示程序界面和繪制游戲界面以及顯示用戶信息和廣告信息等處理任務(wù)。 游戲通信類:負(fù)責(zé)處理游戲中客戶服務(wù)器之間的網(wǎng)絡(luò)傳輸細(xì)節(jié),從而在編程中不用考慮網(wǎng)絡(luò)通信細(xì)節(jié),達(dá)到客戶和服務(wù)器之間的透明的效果。 游戲應(yīng)用程序類:主要負(fù)責(zé)處理應(yīng)用程序中各種設(shè)置顯示對話框、程序主線程處理、程序中基本的運(yùn)行類框架的管理,以及游戲中 圖形的處理和顯示等任務(wù)的處理。 游戲處理類:主要用于處理游戲簡單邏輯、負(fù)責(zé)解析和處理與服務(wù)器端交互的游戲數(shù)據(jù),以及在游戲運(yùn)行中維護(hù)游戲中的各種數(shù)據(jù),同時(shí)維護(hù)處理游戲主線程邏輯等功能。 服務(wù)器類的劃分: 游戲通信類:負(fù)責(zé)處理游戲中客戶服務(wù)器之間的網(wǎng)絡(luò)傳輸細(xì)節(jié),從而在編程中不用考慮網(wǎng)絡(luò)通信細(xì)節(jié),達(dá)到客戶和服務(wù)器之間透明傳輸?shù)男Ч?游戲協(xié)議類:負(fù)責(zé)處理游戲中客戶服務(wù)器之間交互所傳遞的數(shù)據(jù),并且對該數(shù)據(jù)格式進(jìn)行打包和解包,同時(shí)根據(jù)該包中所包含的指令串進(jìn)行相應(yīng)的操作。 游戲邏輯類:負(fù)責(zé)處理游戲邏輯,如軍棋游戲中用 于維護(hù)軍棋邏輯,判斷下棋,得分等處理類。 用戶管理類:用于管理用戶資料,在用戶登錄后通過數(shù)據(jù)庫驗(yàn)證用戶名和密碼,通過驗(yàn)證后從數(shù)據(jù)庫讀取用戶的詳細(xì)資料。同時(shí)在程序中維護(hù)用戶數(shù)據(jù),在用戶游戲結(jié)束和退出游戲時(shí)將用戶數(shù)據(jù)保存到數(shù)據(jù)庫中。 服務(wù)器框架類:用于管理游戲大廳的數(shù)據(jù),包括一些數(shù)據(jù)的列表。 數(shù)據(jù)庫類:用于網(wǎng)絡(luò)游戲的服務(wù)器端在處理大量的客戶資料時(shí),使用數(shù)據(jù)庫進(jìn)行大量數(shù)據(jù)的存儲(chǔ)和查詢所調(diào)用的類方法。 網(wǎng)絡(luò)游戲 - 8 - 3.3 關(guān)鍵算法 模塊間的數(shù)據(jù)傳遞設(shè)計(jì),如圖 3-3所示。 圖 3-3 模塊間的數(shù)據(jù)傳遞設(shè)計(jì) 這樣,在 CTableView 和 CGameDlg 中通過指針,也可向服務(wù)器發(fā)送消息。而CCGameHallFrameView 收到消息后,同時(shí)也控制 CTableView和 CGameDlg 的行為。 采用內(nèi)存作圖的方式,消除了閃爍。首先創(chuàng)建一個(gè)內(nèi)存 dc,將繪圖的工作先在內(nèi)存dc中做好,再貼到實(shí)際 dc上去。做法如下: 首先創(chuàng)建關(guān)于屏幕的內(nèi)存 DC, 代碼為 MemDC.CreateCompatibleDC( pDC); 之后創(chuàng)建一幅關(guān)于屏幕 DC的圖畫 ,部分代碼如下 : CRect rect; this-GetClientRect(rect); CBitmap bmpFace; bmpFace.CreateCompatibleBitmap(pDC,rect.Width(),rect.Height(); 注意把握 rect的尺寸為客戶區(qū)域大??; 之后將這幅畫選入內(nèi)存 DC中, 部分代碼如下: CBitmap* pOldBmp = NULL; pOldBmp = MemDC.SelectObject(&bmpFace); 之后可以開始在內(nèi)存 DC中進(jìn)行任何繪制動(dòng)作; 部分代碼如下: 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); 最后進(jìn)行相關(guān)的資源回收動(dòng) 作, 部分代碼如下: MemDC.SelectObject(pOldBmp); bmpFace.DeleteObject();。 同時(shí)我們要把系統(tǒng)的 ON_WM_ERASEBKGND消息 函數(shù)重載為 return FALSE, 否則 還是會(huì) 出現(xiàn)閃 爍 情況。 在對話框中用這個(gè)方法的時(shí)候,要注意將有控件的部分和需要繪圖的部分分開,可采用如下方法 ,部分代碼如下: : 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); 服務(wù)器對連接的用戶數(shù)據(jù)的數(shù)據(jù)結(jié)構(gòu)的設(shè)計(jì),用下面兩個(gè)結(jié)構(gòu): typedef struct TT int d4; int ID4; int board1717; BOOL begin4; ; typedef struct MM 網(wǎng)絡(luò)游戲 - 10 - CString name,sex; int score; ; 連接的 socket保存在如下鏈表中: typedef CList SOCKET_ARRAY; SOCKET_ARRAY m_connectionList; 與服務(wù)器建立連接后,相應(yīng)的用戶數(shù)據(jù),保存在 MM 結(jié)構(gòu)數(shù)組中,位置為其 socket在 m_connectionList中的相應(yīng)位置,這樣就可以通過連接的 socket找到相應(yīng)的信息。TT 是保存大廳數(shù)據(jù)的結(jié)構(gòu), d 表示四個(gè)坐位有沒有人, ID 表示就坐的人的 socket 在鏈表中的位置。 board 為棋盤數(shù)據(jù)。每個(gè)桌子有每個(gè)桌子的棋盤數(shù)據(jù),互不干擾。隨著游戲的進(jìn)行而不斷更新。 begin表示四個(gè)玩家有沒有下調(diào)度完成的指令。 應(yīng)用矩陣的 變換 實(shí)現(xiàn)坐標(biāo)旋轉(zhuǎn)。不管你坐在哪個(gè)方位,玩游戲時(shí),你始終是在正下方,這就需要實(shí)現(xiàn)虛擬坐標(biāo)到目標(biāo)坐標(biāo)的旋轉(zhuǎn)變換,如圖 3-4。 圖 3-4 坐標(biāo)圖 X為實(shí)際坐標(biāo), x為虛擬坐標(biāo),轉(zhuǎn)換公式推導(dǎo)如下,見圖 3-5。 圖 3-5 坐標(biāo)變換公式推導(dǎo) 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 /西 總體設(shè)計(jì) - 11 - case 3:(a=180o) X, Y, 1=-x+16, -y+16, 1 /北 回溯法求工兵路徑,軍棋游戲邏輯不復(fù)雜,只有工兵能夠自由飛行。在這里沒有求工兵起點(diǎn)到目標(biāo)點(diǎn)的 最短 路 徑 ,而只是 用 回溯 法 求出 其中一條路徑,所以在游戲中你會(huì)發(fā)現(xiàn)工兵有時(shí)候會(huì)繞些彎路。這和老鼠走迷宮差不多的。 工兵迷宮數(shù)組: 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表示在該位置可向上下左右方向移動(dòng), 2表示在 該位置只能向上下方向移動(dòng), 3表示在該位置只能向左右方向移動(dòng)。 網(wǎng)絡(luò)游戲 - 12 - 3.4 關(guān)鍵技術(shù) 網(wǎng)絡(luò)通信, Windows Socket 編程接口: Windows Socket (簡稱 WinSock)是在 Win32 平臺(tái)上訪問基層網(wǎng)絡(luò)協(xié)議的接口。在不同的 Win32平臺(tái)上, Windows Socket以不同的方式存在著,作為網(wǎng)絡(luò)編程接口而不是協(xié)議存在。 套接字( Socket)概念,套接字是從英文單詞 Socket 翻譯而來,它是網(wǎng)絡(luò)通信的基本操作單元,是應(yīng)用 層到傳輸層的接口,可以將套接字看作不同主機(jī)間的進(jìn)程進(jìn)行雙向通信的端點(diǎn)。 Windows Socket組成部分, Windwos Sockets 實(shí)現(xiàn)一般都由兩部分組成:開發(fā)組件和運(yùn)行組件。開發(fā)組件是供程序員開發(fā) Windows Sockets 應(yīng)用程序使用的,主要是WinSock.h頭文件。對于 Windows Sockets應(yīng)用程序的源文件來說,只要包括 WinSock.h就可以了。除此之外,在使用 WinSock 的項(xiàng)目中還需要加入 WinSock API 引入庫wsock32.lib。運(yùn)行組件是 Windows Sockets 應(yīng)用程序接口的動(dòng)態(tài)連接庫( DLL) ,文件名為 WinSock.dll,應(yīng)用程序在執(zhí)行時(shí)通過裝入它實(shí)現(xiàn)網(wǎng)絡(luò)通信功能。 Windows Sockets 編程的基本模式,要通過互聯(lián)網(wǎng)進(jìn)行通信,你至少需要一對套接字,其中一個(gè)運(yùn)行于客戶端,我們稱之為 ClientSocket,另一個(gè)運(yùn)行于服務(wù)器端,我們稱之為 ServerSocket。使用 Socket 進(jìn)行網(wǎng)絡(luò)通信一般有兩種方式:基于面向連接的流方式和基于無連接的數(shù)據(jù)報(bào)方式。面向連接的的流方式調(diào)用過程如圖 3-6所示。 總體設(shè)計(jì) - 13 - 圖 3-6 面向連接的流方式調(diào)用過程 網(wǎng)絡(luò)游戲 - 14 - 第四章 詳細(xì)設(shè)計(jì) 4.1 數(shù)據(jù)庫結(jié)構(gòu) 服務(wù)器端數(shù)據(jù)庫結(jié)構(gòu) 如 表 4-1。 User 列名 數(shù)據(jù)類型 長度 允許空 描述 主鍵 name char 10 no 用戶名 code char 10 no 密碼 score int 4 yes 游戲積分 sex char 2 yes 性別 表 4-1, 玩家信息 用作記錄玩家游戲數(shù)據(jù)。 4.2 模塊結(jié)構(gòu) 客戶端模塊結(jié)構(gòu): 游戲基本類 ,該類包中包括 CBorderButton、 CClockObject、 CWave 類。 游戲框架類,該類包中包括 CMainFrame、 CCGameHallFrameView、 CHtmlViewEx、CTableView類。 游戲通信類,該類包中包括 CClient類。 游戲應(yīng)用程序類,該類包包括 CGameDlg 類,其中包括對游戲處理類的調(diào)用。 游戲處理類,該類包中主要包括 TakeGame 類。 服務(wù)器模塊結(jié)構(gòu): 游戲通信類,由 CServer類實(shí)現(xiàn)。 游戲協(xié)議類,由 CServerProtocol類實(shí)現(xiàn)。 游戲邏輯類,由 CServerLogic類實(shí)現(xiàn)。 數(shù)據(jù)庫類,由 CServerFrameSet類實(shí)現(xiàn)。 用戶管理類,由 CServerFrameView類實(shí)現(xiàn)。 服務(wù)器框架類,由 CServerFrame類實(shí)現(xiàn)。 詳細(xì)設(shè)計(jì) - 15 - 4.3 重要模塊詳述 客戶端模塊: CBorderButton 類是帶有邊框的圖片按鈕類, CClockObject 類是時(shí)鐘類, CWave是用來播放聲音的類,當(dāng)游戲用戶下棋,吃子,起身或坐下時(shí)要播放聲音,選擇在程序中調(diào)用 API 函數(shù) PlaySound 直接播放在資源中的聲音文件。模塊描述如圖 4-1。 圖 4-1 游戲基本類模塊描述 CMainFrame 類是游戲窗口中的游戲大廳框架類,其中包括構(gòu)架廣告顯示窗口,可玩的游戲類、工具 欄、游戲桌的信息、顯示信息等, CCGameHallFrameView類是用來在游戲大廳窗口左側(cè)顯示可以玩的游戲以及游戲室,采用樹狀結(jié)構(gòu)顯示。 CHtmlViewEx 類用于構(gòu)造廣告顯示窗口,用于游戲框架中顯示廣告頁。CTableView 顯示包含游戲桌的游戲大廳,在大廳中多人在等待開始游戲。模塊描述如圖 4-2。 圖 4-2 游戲框架類模塊描述 網(wǎng)絡(luò)游戲 - 16 - 游戲通信類, CClient,功能為建立和服務(wù)器的連接,能及處理通信,采用異步機(jī)制,以自定義消息事件處理通信等功能。采用自定義消息: WM_USER + 101。模塊描述 如圖 4-3。 圖 4-3 游戲通信類模塊描述 游戲應(yīng)用程序類, CGameDlg,其中包括對游戲處理類的調(diào)用。 CGameDlg 主要負(fù)責(zé)處理應(yīng)用程序中各種設(shè)置顯示對話框、程序主線程處理、以及游戲中的圖形的處理和顯示等任務(wù)的處理。模塊描述如圖 4-4。 圖 4-4 游戲應(yīng)用程序類模塊描述 游戲處理類, TakeGame 主要用于處理游戲簡單邏輯、負(fù)責(zé)解析和處理與服務(wù)器端交互的游戲數(shù)據(jù),以及在游戲運(yùn)行時(shí)維護(hù)游戲中的各種數(shù)據(jù),同時(shí)維護(hù)處理游戲主線程邏輯等功能。模塊描述如圖 4-5。 圖 4-5 游戲處理類模 塊描述 詳細(xì)設(shè)計(jì) - 17 - 服務(wù)器模塊: 游戲通信類,由 CServer 類實(shí)現(xiàn)。負(fù)責(zé)處理游戲中客戶與服務(wù)器之間的網(wǎng)絡(luò)連接細(xì)節(jié),從而使得對于客戶和服務(wù)器之間的數(shù)據(jù)傳輸可以忽略通信細(xì)節(jié)。模塊描述如圖 4-6。 圖 4-6 游戲通信類模塊描述 游戲協(xié)議類,由 CServerProtocol類實(shí)現(xiàn)。 游戲協(xié)議類負(fù)責(zé) 解析客戶 /服務(wù)器端所 傳輸?shù)膮f(xié)議,同時(shí)根據(jù)不同的協(xié)議調(diào)用不同的操作函數(shù),并根據(jù)用戶狀態(tài)變化維護(hù)用戶信息。模塊描述如圖 4-7。 圖 4-7 游戲協(xié)議類模塊描述 游戲邏輯類負(fù)責(zé)處理游戲邏輯,在軍棋游戲中包括計(jì)算得分,計(jì)算 贏等。游戲邏輯類 CServerLogic和游戲協(xié)議類分離的優(yōu)點(diǎn)是可以只通過修改邏輯類來改變?yōu)椴煌木W(wǎng)絡(luò)游戲,如修改為“象棋邏輯”即可以成為象棋游戲,修改為“升級(jí)邏輯”即可以成為升級(jí)游戲。 用戶管理類,直接在 CCServerFrameView 中實(shí)現(xiàn)。 數(shù)據(jù)庫類,采用 SQL Server 2000 數(shù)據(jù)庫,只是用來保存玩家的資料等一些數(shù)據(jù)。采用 MFC ODBC 數(shù)據(jù)庫編程,在程序中為 CServerFrameSet 類。正如 MFC提供的其他類庫很好地對相應(yīng)的 Win32 API 作了封裝, MFC 提供的 ODBC 類庫也相應(yīng)地對 ODBC API 作了封裝,通過提供一種高級(jí)接口而避免直接使用 ODBC API網(wǎng)絡(luò)游戲 - 18 - 所涉及的種種繁瑣處理,簡化了對 ODBC 數(shù)據(jù)庫的應(yīng)用程序編程。模塊描述如圖4-8。 圖 4-8 數(shù)據(jù)庫類模塊描述 第五章 程序編碼 5.1 數(shù)據(jù)結(jié)構(gòu) 用 17 17的數(shù)組表示軍棋的棋盤,如下: 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 表示棋盤內(nèi)位置,但無棋子 1 工兵 2 排長 3 連長 4 營長 5 團(tuán)長 6 旅長 7 師長 8 軍長 9 司令 10 炸彈 11 地雷 12 我方軍旗 網(wǎng)絡(luò)游戲 - 20 - 13 上方盟友或敵方的棋子 14 左邊敵方的棋子 15 右邊敵方的棋子 16 上方軍旗 17 左方軍旗 18 右方軍旗 為了處理工兵的走法的方便,將四個(gè)轉(zhuǎn)角斜對的位置恒置為 0,這樣在為工兵尋找路徑時(shí)會(huì)方便一些。 游戲協(xié)議 以 char(20)作為一次信息的起始點(diǎn),終點(diǎn)?!啊痹谧址杏每崭翊?。以一字符串作為向服務(wù) 發(fā)出的請求信息,服務(wù)器也以相應(yīng)的一字符串發(fā)送回客戶端作為應(yīng)答。 對話: A桌子號(hào)聊天內(nèi)容 坐下: B桌子號(hào)方位 調(diào)度完成: C桌子號(hào)方位 (棋盤數(shù)據(jù) )用一維數(shù)據(jù)形式表示 6 5 的二維數(shù)組,數(shù)據(jù)之間用空格開。 開始游戲: (只由服務(wù)器發(fā)出 ) D對戰(zhàn)類型 下棋: E 桌子號(hào)方位起點(diǎn) (x,y)終點(diǎn) (x,y) 吃: (只由服務(wù)器發(fā)出 )(包括移動(dòng) ) F 起點(diǎn) (x,y) + 終點(diǎn) (x,y) 被吃: (只由服務(wù)器發(fā)出 ) G 起點(diǎn) (x,y) + 終點(diǎn) (x,y) 炸: (只由服務(wù)器發(fā)出 ) H 起點(diǎn) (x,y) + 終點(diǎn) (x,y) 程序編碼 - 21 - 輸:離開:(包括斷線 ) 投降 : I 方位 求和: K 桌子號(hào)方位 注冊: L 用戶名密碼 注冊成功: M + 用戶名 登錄: N + 用戶名密碼 登錄結(jié)果: O + 1/0 離開: P + 桌子號(hào) 方位 請求接收信息: Q + 桌子號(hào) 方位 碰: R 起點(diǎn) (x,y) + 終點(diǎn) (x,y) 5.2 主要界面 服務(wù)器界面如圖 5-1所示。 網(wǎng)絡(luò)游戲 - 22 - 圖 5-1 服務(wù)器啟動(dòng)界面 客戶端大廳界面如圖 5-2所示。 程序編碼 - 23 - 圖 5-2 客戶端大廳界面 軍棋游戲界面,如圖 5-3所示: 網(wǎng)絡(luò)游戲 - 24 - 圖 5-3 軍棋游戲界面 5.3 重要模塊程序?qū)崿F(xiàn) 客戶端三拆分窗口的實(shí)現(xiàn) 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) 網(wǎng)絡(luò)游戲 - 26 - /先將以前打開的套接字關(guān)閉 closesocket(m_hSocket); m_hSocket=NULL; /創(chuàng)建面向連接的 socket m_hSocket=socket(AF_INET,SOCK_STREAM,0); ASSERT(m_hSocket!=NULL); ClientInit(); /設(shè)置連接信息:網(wǎng)絡(luò)協(xié)議 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); /連接服務(wù)器 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(請確認(rèn)服務(wù)器確實(shí)已經(jīng)打開并工作在同樣的端口!); return FALSE; return TRUE; 服務(wù)器初始化及連接 程序編碼 - 27 - void CServer:ServerInit() /設(shè)置 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) /先關(guān)閉已經(jīng)打開的 socket closesocket(m_hSocket); m_hSocket=NULL; /創(chuàng)建面向連接的流方式的套接字 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; /綁定套接字到本機(jī)的某個(gè)端口 ret=bind(m_hSocket,(LPSOCKADDR)&m_addr,sizeof(m_addr); if(ret = SOCKET_ERROR) 網(wǎng)絡(luò)游戲 - 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(每項(xiàng)內(nèi)容都不能為空 ); 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(每項(xiàng)內(nèi)容都 不能為空 ); 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(服務(wù)器已關(guān)閉! ); return 0; 網(wǎng)絡(luò)游戲 - 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. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 小兒丁型病毒性肝炎護(hù)理
- 新疆生產(chǎn)建設(shè)兵團(tuán)五校2025年高三下學(xué)期第一次教學(xué)質(zhì)量檢測試題英語試題含解析
- 2025至2031年中國空調(diào)溫控器零件行業(yè)投資前景及策略咨詢研究報(bào)告
- 2025至2031年中國簡式單缸高位運(yùn)送器行業(yè)投資前景及策略咨詢研究報(bào)告
- 民法典講座課件
- 徐州工業(yè)職業(yè)技術(shù)學(xué)院《工程優(yōu)化與Matab設(shè)計(jì)》2023-2024學(xué)年第二學(xué)期期末試卷
- 宣城市重點(diǎn)中學(xué)2025年高三下學(xué)期三校五測英語試題試卷含解析
- 委托書萬能電子版
- 2025至2031年中國電容測試分選儀行業(yè)投資前景及策略咨詢研究報(bào)告
- 2025-2030年中國3C電子線行業(yè)運(yùn)行走勢及投資發(fā)展戰(zhàn)略研究報(bào)告
- 山東省煙臺(tái)市2024-2025學(xué)年高二地理下學(xué)期期中試題
- 門窗店和裝修公司合作協(xié)議書
- 順豐控股成本問題及對策分析
- 美的公司存貨管理存在的問題及研究對策
- 抖音火花合同模板
- 2024年共青團(tuán)入團(tuán)積極分子考試題庫(含答案)
- 初中英語非連續(xù)性文本的閱讀策略分析
- 輿情管控培訓(xùn)課件講稿
- EPC項(xiàng)目投標(biāo)人承包人工程經(jīng)濟(jì)的合理性分析、評價(jià)
- 2024年甘肅水投集團(tuán)遴選引洮供水公司招聘筆試參考題庫含答案解析
- 河南安陽的紅色故事
評論
0/150
提交評論