vc++多人對戰(zhàn)平臺連連看系統(tǒng)畢業(yè)設計含源文件復習過程_第1頁
vc++多人對戰(zhàn)平臺連連看系統(tǒng)畢業(yè)設計含源文件復習過程_第2頁
vc++多人對戰(zhàn)平臺連連看系統(tǒng)畢業(yè)設計含源文件復習過程_第3頁
vc++多人對戰(zhàn)平臺連連看系統(tǒng)畢業(yè)設計含源文件復習過程_第4頁
vc++多人對戰(zhàn)平臺連連看系統(tǒng)畢業(yè)設計含源文件復習過程_第5頁
已閱讀5頁,還剩163頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領

文檔簡介

1、Good is good, but better carries it.精益求精,善益求善。vc+多人對戰(zhàn)平臺連連看系統(tǒng)畢業(yè)設計含源文件摘要因特網(wǎng)的發(fā)展使人類進入了一個全新的世界,人與人之間可以遠隔萬里為了同一興趣愛好而交流,做到了網(wǎng)絡無國界,信息無國界。隨著因特網(wǎng)的不斷發(fā)展,網(wǎng)絡游戲作為一個新的名詞融入到了人們的日常生活當中。網(wǎng)絡游戲來源于“onlinegame”,更直接的翻譯是“在線游戲”,亦即必須在大家聯(lián)網(wǎng)而且都在線的時候,才能夠團隊互動,否則就屬于單機游戲了。網(wǎng)絡游戲產(chǎn)業(yè)作為現(xiàn)代電腦電子技術的產(chǎn)物,正在以其獨特的魅力在全世界的娛樂領域占據(jù)主流位置,我們在承認廣大娛樂網(wǎng)民的選擇空間狹小的

2、同時,也必須明確的一點就是網(wǎng)絡游戲本身所具有的強大的吸引力。網(wǎng)絡游戲的吸引力主要在于,它在讓玩家打發(fā)時間的同時,可以讓人實現(xiàn)在顯示生活中不能實現(xiàn)的理想,得到在顯示中不能得到的東西。而且網(wǎng)游產(chǎn)業(yè)促動高科技技術不斷升級,作為經(jīng)濟增長的一大支撐點,已經(jīng)成為經(jīng)濟騰飛的“第四產(chǎn)業(yè)”。近年來,世界網(wǎng)絡游戲市場高速發(fā)展。根據(jù)統(tǒng)計,全球網(wǎng)絡玩家所占互聯(lián)網(wǎng)人群的比例已經(jīng)超過30%。網(wǎng)絡游戲憑借其信息雙向交流,速度快,不受空間限制等互聯(lián)網(wǎng)有時,具有誘人的互動性、仿真性和競技性,已經(jīng)成為網(wǎng)絡業(yè)盈利優(yōu)厚的三大領域之一。網(wǎng)絡平臺的發(fā)展,為網(wǎng)絡游戲奠定了堅實的“物質(zhì)”基礎。寬帶的迅猛發(fā)展為網(wǎng)絡游戲提供了“高速公路”,而專

3、用游戲服務器則為網(wǎng)絡游戲提供了容量巨大的“加油站”。前不久,網(wǎng)絡游戲還被視為一個“高風險”的行業(yè),但隨著人們對網(wǎng)絡游戲的重新認識,網(wǎng)絡游戲正在恢復其應有的地位。本文在基于VC+開發(fā)平臺的多人對戰(zhàn)平臺系統(tǒng)的工作基礎上采用基于B/S三層架構(gòu)模式,選取VC+6.0作為開發(fā)工具,以Access2007為后臺數(shù)據(jù)庫,來實現(xiàn)多人對戰(zhàn)平臺的基本功能。關鍵詞:連連看、網(wǎng)絡游戲、網(wǎng)絡對戰(zhàn)目錄TOCo1-3hzuHYPERLINKl_Toc261900585摘要PAGEREF_Toc261900585hIHYPERLINKl_Toc261900586目錄PAGEREF_Toc261900586hIIHYPERLI

4、NKl_Toc261900587第1章緒論PAGEREF_Toc261900587h1HYPERLINKl_Toc2619005881.1目的PAGEREF_Toc261900588h1HYPERLINKl_Toc2619005891.2意義PAGEREF_Toc261900589h1HYPERLINKl_Toc2619005901.3主要問題PAGEREF_Toc261900590h1HYPERLINKl_Toc2619005911.4技術要求PAGEREF_Toc261900591h1HYPERLINKl_Toc2619005921.5發(fā)展概況PAGEREF_Toc261900592h1H

5、YPERLINKl_Toc2619005931.6指導思想PAGEREF_Toc261900593h2HYPERLINKl_Toc261900594第2章系統(tǒng)解決方案的選擇PAGEREF_Toc261900594h3HYPERLINKl_Toc2619005952.1C/S結(jié)構(gòu)PAGEREF_Toc261900595h3HYPERLINKl_Toc2619005962.2三層架構(gòu)PAGEREF_Toc261900596h4HYPERLINKl_Toc2619005972.2.1什么是“三層架構(gòu)”PAGEREF_Toc261900597h4HYPERLINKl_Toc2619005982.2.2

6、三層架構(gòu)的優(yōu)缺點PAGEREF_Toc261900598h4HYPERLINKl_Toc261900599第3章需求分析PAGEREF_Toc261900599h5HYPERLINKl_Toc2619006003.1產(chǎn)品描述PAGEREF_Toc261900600h5HYPERLINKl_Toc2619006013.2產(chǎn)品功能PAGEREF_Toc261900601h5HYPERLINKl_Toc2619006023.3具體功能需求PAGEREF_Toc261900602h6HYPERLINKl_Toc2619006043.4協(xié)議設計PAGEREF_Toc261900604h9HYPERLIN

7、Kl_Toc2619006053.4.1控制消息UDP數(shù)據(jù)包格式PAGEREF_Toc261900605h9HYPERLINKl_Toc2619006063.4.2客戶端到服務器端(C-S)UDP數(shù)據(jù)包PAGEREF_Toc261900606h10HYPERLINKl_Toc2619006073.4.3服務器端到客戶端(S-C)UDP數(shù)據(jù)包PAGEREF_Toc261900607h11HYPERLINKl_Toc2619006083.4.4數(shù)據(jù)庫設計PAGEREF_Toc261900608h11HYPERLINKl_Toc2619006093.4.5詳細設計PAGEREF_Toc2619006

8、09h11HYPERLINKl_Toc261900610第4章總體設計PAGEREF_Toc261900610h12HYPERLINKl_Toc2619006114.1開發(fā)環(huán)境PAGEREF_Toc261900611h12HYPERLINKl_Toc2619006124.2相關表設計圖PAGEREF_Toc261900612h12HYPERLINKl_Toc261900613第5章詳細設計PAGEREF_Toc261900613h28HYPERLINKl_Toc2619006155.1用戶注冊功能PAGEREF_Toc261900615h28HYPERLINKl_Toc2619006165.2

9、登錄頁面PAGEREF_Toc261900616h38HYPERLINKl_Toc2619006175.3游戲大廳PAGEREF_Toc261900617h45HYPERLINKl_Toc2619006185.4游戲房間PAGEREF_Toc261900618h54HYPERLINKl_Toc2619006195.5游戲準備界面PAGEREF_Toc261900619h63HYPERLINKl_Toc2619006205.6游戲界面PAGEREF_Toc261900620h67HYPERLINKl_Toc261900622第6章總結(jié)與展望PAGEREF_Toc261900622h96HYPER

10、LINKl_Toc261900623致謝PAGEREF_Toc261900623h96第1章緒論1.1目的網(wǎng)絡小游戲制作的目的是滿足了人們休閑的需要,在緊張工作之余休閑類的小游戲能夠給人帶來最大程度的放松,也可以增進人們之間的交流,溝通,通過游戲還可以認識更多的朋友,也可以到達跨省、跨市,甚至跨國間人們互相娛樂的目的。另外也通過本程序?qū)赡陙硭鶎W的專業(yè)知識和其他方面的知識融入到實際應用中。1.2意義通過此次課題的設計,掌握如何制作一個游戲軟件,以及制作游戲軟件的整個流程,制作游戲軟件的步驟,為以后的就業(yè)工作打下基礎。1.3主要問題開始制作游戲時,主要要解決的問題有以下幾個方面:如何設置整個游戲

11、的界面;如何控制連連看游戲中隨機圖片的生成且每種圖片必須為偶數(shù)個;游戲開始后,判斷鼠標兩次點擊的圖片能否消去,即圖片是否相同且圖片之間路徑的判斷;如何連接網(wǎng)絡上的兩臺計算機實現(xiàn)網(wǎng)絡對戰(zhàn),互發(fā)消息,如何判斷游戲是否結(jié)束以及輸贏問題等。1.4技術要求網(wǎng)絡中任意計算機當運行該游戲軟件是,要有一臺當服務器,如果要當服務器,則等待客戶機的連接請求;如果要當客戶機,則要主動去連接服務器。游戲中能正確判斷鼠標兩次點下的圖片是否可以消去、能正確判斷游戲是否已經(jīng)結(jié)束和哪一方玩家勝出。還可順利發(fā)消息給對方和接收對方發(fā)來的消息。1.5發(fā)展概況網(wǎng)絡游戲正處于加速發(fā)展周期中,中國網(wǎng)絡游戲市場迅速擴大,近三年的年均增長率

12、超過100%。網(wǎng)絡游戲的告訴發(fā)展,逐漸引起了我國政府的高度重視,信息產(chǎn)業(yè)部、文化部、新聞出版總屬等相關部門都在積極推動各項市場監(jiān)管和鼓勵網(wǎng)絡游戲產(chǎn)業(yè)發(fā)展的政策措施的出臺,2003年網(wǎng)絡游戲首次被正式納入國家863計劃,標志著我國網(wǎng)絡游戲產(chǎn)業(yè)已經(jīng)的到政府的充分重視。除外,在網(wǎng)絡游戲產(chǎn)業(yè)發(fā)展的同時,有力帶動了相關行業(yè)的發(fā)展,如軟件、計算機、通信、電信運營、互聯(lián)網(wǎng)等,根據(jù)統(tǒng)計,網(wǎng)絡游戲能夠帶動10倍于自身產(chǎn)值的相關行業(yè)的發(fā)展。預計未來三年,中國游戲時常規(guī)模仍將保持60%以上的告訴增長,至2006年市場規(guī)模將接近100億元,而多樣的資本運作模式將成為網(wǎng)絡游戲產(chǎn)業(yè)發(fā)展的重要推動力。同時,手機游戲、家用游

13、戲機、游戲傳媒、電子競技等游戲周邊行業(yè)也將快速發(fā)展起來。1.6指導思想按照軟件開發(fā)的總過程進行設計,經(jīng)歷定義和計劃、需求分析、軟件設計、軟件編碼、軟件測試等過程。第2章系統(tǒng)解決方案的選擇2.1C/S結(jié)構(gòu)C/S(Client/Server)結(jié)構(gòu),即大家熟知的客戶機和服務器結(jié)構(gòu)。它是軟件系統(tǒng)體系結(jié)構(gòu),通過它可以充分利用兩端硬件環(huán)境的優(yōu)勢,將任務合理分配到Client端和Server端來實現(xiàn),降低了系統(tǒng)的通訊開銷。目前大多數(shù)應用軟件系統(tǒng)都是Client/Server形式的兩層結(jié)構(gòu),由于現(xiàn)在的軟件應用系統(tǒng)正在向分布式的Web應用發(fā)展,Web和Client/Server應用都可以進行同樣的業(yè)務處理,應用

14、不同的模塊共享邏輯組件;因此,內(nèi)部的和外部的用戶都可以訪問新的和現(xiàn)有的應用系統(tǒng),通過現(xiàn)有應用系統(tǒng)中的邏輯可以擴展出新的應用系統(tǒng)。這也就是目前應用系統(tǒng)的發(fā)展方向。C/S結(jié)構(gòu)的優(yōu)點是能充分發(fā)揮客戶端的處理能力,很多工作可以在客戶端處理后再提交給服務器。對應的優(yōu)點就是客戶端響應速度快。C/S架構(gòu)軟件的優(yōu)勢與劣勢:(1)應用服務器運行數(shù)據(jù)負荷較輕。最簡單的C/S體系結(jié)構(gòu)的數(shù)據(jù)庫應用由兩部分組成,即客戶應用程序和數(shù)據(jù)庫服務器程序。二者可分別稱為前臺程序與后臺程序。運行數(shù)據(jù)庫服務器程序的機器,也稱為應用服務器。一旦服務器程序被啟動,就隨時等待響應客戶程序發(fā)來的請求;客戶應用程序運行在用戶自己的電腦上,對應

15、于數(shù)據(jù)庫服務器,可稱為客戶電腦,當需要對數(shù)據(jù)庫中的數(shù)據(jù)進行任何操作時,客戶程序就自動地尋找服務器程序,并向其發(fā)出請求,服務器程序根據(jù)預定的規(guī)則作出應答,送回結(jié)果,應用服務器運行數(shù)據(jù)負荷較輕。(2)數(shù)據(jù)的儲存管理功能較為透明。在數(shù)據(jù)庫應用中,數(shù)據(jù)的儲存管理功能,是由服務器程序和客戶應用程序分別獨立進行的,前臺應用可以違反的規(guī)則,并且通常把那些不同的(不管是已知還是未知的)運行數(shù)據(jù),在服務器程序中不集中實現(xiàn),例如訪問者的權(quán)限,編號可以重復、必須有客戶才能建立定單這樣的規(guī)則。所有這些,對于工作在前臺程序上的最終用戶,是“透明”的,他們無須過問(通常也無法干涉)背后的過程,就可以完成自己的一切工作。在

16、客戶服務器架構(gòu)的應用中,前臺程序不是非?!笆菪 ?,麻煩的事情都交給了服務器和網(wǎng)絡。在C/S體系的下,數(shù)據(jù)庫不能真正成為公共、專業(yè)化的倉庫,它受到獨立的專門管理。(3)C/S架構(gòu)的劣勢是高昂的維護成本且投資大。首先,采用C/S架構(gòu),要選擇適當?shù)臄?shù)據(jù)庫平臺來實現(xiàn)數(shù)據(jù)庫數(shù)據(jù)的真正“統(tǒng)一”,使分布于兩地的數(shù)據(jù)同步完全交由數(shù)據(jù)庫系統(tǒng)去管理,但邏輯上兩地的操作者要直接訪問同一個數(shù)據(jù)庫才能有效實現(xiàn),有這樣一些問題,如果需要建立“實時”的數(shù)據(jù)同步,就必須在兩地間建立實時的通訊連接,保持兩地的數(shù)據(jù)庫服務器在線運行,網(wǎng)絡管理工作人員既要對服務器維護管理,又要對客戶端維護和管理,這需要高昂的投資和復雜的技術支持,維

17、護成本很高,維護任務量大。2.2三層架構(gòu)2.2.1什么是“三層架構(gòu)”三層架構(gòu)(3-tierapplication)通常意義上的三層架構(gòu)就是將整個業(yè)務應用劃分為:表現(xiàn)層(UI)、業(yè)務邏輯層(BLL)、數(shù)據(jù)訪問層(DAL)。區(qū)分層次的目的即為了“高內(nèi)聚,低耦合”的思想。所謂三層體系結(jié)構(gòu),是在客戶端與數(shù)據(jù)庫之間加入了一個“中間層”,也叫組件層。這里所說的三層體系,不是指物理上的三層,不是簡單地放置三臺機器就是三層體系結(jié)構(gòu),也不僅僅有B/S應用才是三層體系結(jié)構(gòu),三層是指邏輯上的三層,即使這三個層放置到一臺機器上。三層體系的應用程序?qū)I(yè)務規(guī)則、數(shù)據(jù)訪問、合法性校驗等工作放到了中間層進行處理。通常情況下,

18、客戶端不直接與數(shù)據(jù)庫進行交互,而是通過COM/DCOM通訊與中間層建立連接,再經(jīng)由中間層與數(shù)據(jù)庫進行交互。2.2.2三層架構(gòu)的優(yōu)缺點優(yōu)點:(1)開發(fā)人員可以只關注整個結(jié)構(gòu)中的其中某一層;(2)可以很容易的用新的實現(xiàn)來替換原有層次的實現(xiàn);(3)可以降低層與層之間的依賴;(4)有利于標準化;(5)利于各層邏輯的復用。缺點:(1)降低了系統(tǒng)的性能。這是不言而喻的。如果不采用分層式結(jié)構(gòu),很多業(yè)務可以直接造訪數(shù)據(jù)庫,以此獲取相應的數(shù)據(jù),如今卻必須通過中間層來完成。(2)有時會導致級聯(lián)的修改。這種修改尤其體現(xiàn)在自上而下的方向。如果在表示層中需要增加一個功能,為保證其設計符合分層式結(jié)構(gòu),可能需要在相應的業(yè)務

19、邏輯層和數(shù)據(jù)訪問層中都增加相應的代碼。第3章需求分析3.1產(chǎn)品描述本產(chǎn)品是一款網(wǎng)絡游戲。系統(tǒng)由服務端與客戶端兩個程序構(gòu)成。采用C/S構(gòu)架方式實現(xiàn)。服務端主要業(yè)務:提供客戶端請求的服務、中轉(zhuǎn)游戲數(shù)據(jù)等。而客戶端提供友好的人機交互方式,供用戶游戲平臺,主要實現(xiàn)了最多6人一起游戲,按照以下順序?qū)崿F(xiàn):進入游戲大廳、準備開始游戲,如果有3個以上的客戶端預備開始游戲,而限定時間內(nèi)又沒有新的客戶端準備開始,服務端就要求客戶端開始游戲的倒計時,倒計時完成后,各玩家開始游戲。在游戲過程中,各玩家可以看到其它玩家的游戲進度的縮略圖,但不允許增加新玩家,其它沒有游戲的玩家只可以旁觀游戲3.2產(chǎn)品功能模塊功能說明服務

20、端玩家信息管理積分管理在線用戶管理游戲桌子管理游戲棋盤管理信息中轉(zhuǎn)管理客戶端注冊新玩家登陸功能大廳瀏覽功能準備與自動搜尋游戲功能游戲旁觀功能各玩家地圖縮略圖積分排行連連看游戲規(guī)則3.3具體功能需求3.3.1服務器端:玩家信息管理引言:該功能實現(xiàn)玩家基礎數(shù)據(jù)管理,包括玩家的游戲ID、姓名、密碼、昵稱、性別、生日、聯(lián)系電話。這些數(shù)據(jù)是由客戶端輸入,玩家提交信息后,通過網(wǎng)絡傳輸?shù)椒斩耍斩蓑炞C合法性后,自動生成一個新的游戲ID,告訴客戶端,并將該玩家的一系列信息存入對應數(shù)據(jù)庫表中。輸入處理輸出游戲ID姓名昵稱密碼性別生日聯(lián)系電話游戲ID是服務端自動生成給玩家的游戲編號,玩家登陸時用該編號登陸(編

21、號位數(shù)不限,可以為1位也可以為任意位數(shù)值)姓名與昵稱長度都不能超過8位,可以為字母空格漢字。密碼長度5位,必需給出確認密碼的輸入(不限定字符,可為任意字符)性別:男、女生日形如:*年*月*日聯(lián)系電話:7位或8位或11位或12位(12位時第一個數(shù)字必需是0)所有輸入不按規(guī)則輸入,均給出相應錯誤提示,提示要有針對性如果兩次密碼輸入不一致,給用戶一個友好提示,要求改正密碼用*輸出3.3.2服務端:積分管理功能引言:服務端必需在每次游戲結(jié)束后,按各玩家游戲的進度情況,評出6個等級出來,分別加分6、3、1、0、-1、-2,并在玩家積分表加入對應的積分值,并在客戶端能查看出積分排行情況,列出前10名的玩家

22、信息。積分表包含:游戲ID(連連看游戲ID值暫定為1000)、玩家ID、積分輸入處理輸出各玩家游戲的進度1、服務端要求統(tǒng)計出各玩家所得分值1、服務端應將該次游戲的各玩家得到累計到對應積分表中客戶端能查看積分在前10名的玩家排行榜3.3.3服務端:在線用戶管理引言:服務端必需在列表視圖里顯示當前在線玩家,某玩家上線或下線必需實時更新列表。該列表內(nèi)容包括玩家ID、昵稱、玩家狀態(tài)(空閑、旁觀、正在游戲)輸入處理輸出實時更新在線用戶列表,及相應玩家狀態(tài)3.3.4服務器端:游戲桌子管理功能引言:游戲桌子數(shù)量暫定為1張,共6個位置,至少要3個人坐不同位置才可以開始游戲。服務端當監(jiān)控到該桌子數(shù)量玩家數(shù)有3個

23、以上,并在10秒內(nèi)沒有新玩家坐下,即可通知各坐下的客戶端開始倒計時,開始倒計時后不允許新玩家再坐下空位置。如果各玩家主動都提出開始游戲,則可不用倒計時直接開始游戲。3.3.5服務器端:游戲棋盤管理引言:開始游戲提交后,服務端隨機生成本次游戲的棋盤布局數(shù)據(jù),大小為12*8,發(fā)送給各玩家。(注:共有12*8=96項數(shù)據(jù),數(shù)據(jù)取值暫定16種,每種數(shù)據(jù)出現(xiàn)6次)輸入處理輸出無隨機生成大小為12*8的棋盤布局數(shù)據(jù)將棋盤數(shù)據(jù)發(fā)送給各玩家3.3.6服務器端:信息中轉(zhuǎn)管理功能引言:對各玩家的互相通訊的信息,都要經(jīng)過服務器中轉(zhuǎn)。包含游戲中通訊的數(shù)據(jù)、私聊、群聊等信息3.3.7客戶端:注冊新玩家引言:該功能在客戶

24、端輸入新玩家信息,包括玩家的姓名、密碼、昵稱、性別、生日、聯(lián)系電話。玩家提交信息后,通過網(wǎng)絡傳輸?shù)椒斩耍斩四苓^后,通知客戶端生成一個新的玩家ID,并在界面里提示出輸入處理輸出姓名昵稱密碼性別生日聯(lián)系電話姓名與昵稱長度都不能超過8位密碼長度5位,必需給出確認密碼的輸入性別:男、女生日形如:*年*月*日聯(lián)系電話:7位或8位或11位或12位(12位時第一個數(shù)字必需是0)所有輸入不按規(guī)則輸入,均給出相應錯誤提示,提示要有針對性如果兩次密碼輸入不一致,給用戶一個友好提示,要求改正密碼用*輸出注冊成功與否要提示客戶,如果成功則要給出新玩家的ID號3.3.8客戶端:登陸功能引言:客戶端啟動程序后,要求

25、客戶輸入玩家ID與密碼,通過服務器驗證后,如果存在該玩家且密碼正確,則允許登陸,進入系統(tǒng)后,在界面上能直觀看出當前玩家昵稱。否則登陸失敗提示登陸出錯信息,不允許進入系統(tǒng)輸入處理輸出玩家ID密碼對輸入的數(shù)據(jù)進行合法驗證(數(shù)據(jù)格式驗證)1、登陸結(jié)果要給出提示,提示內(nèi)容要人性化,合理3.3.9客戶端:大廳瀏覽功能引言:客戶端進入系統(tǒng)后,可以瀏覽到當前游戲的大廳,及桌子數(shù)。目前只有一個桌子,因此在客戶端能看到當前一張桌子,及桌子6個座位的入座情況即可。3.3.10客戶端:準備與自動搜尋位置功能引言:客戶端各玩家根據(jù)當前桌子的入座情況,選擇一個空位置即可進入游戲狀態(tài),準備開始游戲。在入座過程中,有一玩家

26、比你先坐下,則要提示已有玩家入坐該位置。自動搜尋位置:該功能實現(xiàn)自動的搜索出一空位置,提示玩家是否入座該位置。3.3.11客戶端:游戲旁觀功能引言:該功能實現(xiàn)游戲桌子已經(jīng)開始游戲后,其它非游戲中的玩家,可以進入旁觀游戲狀態(tài),瀏覽到各玩家游戲進度情況。但不能任何方式干擾正在游戲玩家3.3.12客戶端:各玩家地圖縮略圖引言:在游戲過程中,當前玩家可以看到其它玩家的游戲進度,用地圖縮略圖的方式清楚看到對方游戲狀態(tài)。3.3.13客戶端:積分排行引言:任何玩家都可以由主界面的功能鏈接,查看到當前全服積分提在前10名玩家信息,顯示玩家信息只要主要信息即可3.3.14連連看游戲規(guī)則與約定引言:哪個玩家最快連

27、完全圖,則得分最高,只要一玩家連完全圖,則游戲結(jié)束。此時服務端根據(jù)各玩家連接圖片數(shù)量,排出該次游戲名次出來,并提示各玩家得分情況重列功能:客戶端提供連連看圖片重列功能:重新放置剩下圖片,可隨機改變剩下圖片位置與順序,重列次數(shù)暫定為最多重列5次連擊次數(shù)統(tǒng)計:當連接圖片一次與上一次連接時間相差在1秒內(nèi)認為是連擊,并要累計連接最大數(shù),并顯示在界面上。當斷連擊后,下次連擊要顯示出上次連擊的最大數(shù),如本次連擊了兩個,上次最大數(shù)為12次,則顯示:2/123.3.15連連看游戲特效引言:連接線特效:兩張相像的圖被消時,要在這兩張圖之間爆破連線(模仿QQ連連看效果)3.4協(xié)議設計3.4.1控制消息UDP數(shù)據(jù)包

28、格式名稱內(nèi)容描述長度VERSION0100協(xié)議版本2CMD_TYPEXx命令類型(00,01)1KEYWORDXx加密字段1COMMANDXxxx命令代碼2SEQNUMXxxx數(shù)據(jù)包序號2UINXxxxxxxx發(fā)送方標識4PARAMETERS可變可選參數(shù)可變CMD_TYPE取值范圍值含義00C-S01S-C3.4.2客戶端到服務器端(C-S)UDP數(shù)據(jù)包名稱代碼描述CMD_KEEPALIVE0 x01學生在線保持CMD_REG0 x02用戶注冊CMD_LOGIN0 x03用戶登錄CMD_SEND_LOG_DATE0 x04向服務器請求在線列表CMD_FANGJIAN_DATE0 x05進入游戲

29、房間CMD_CLOSE_DATE0 x06關閉游戲CMD_KEEPALIVE名稱內(nèi)容描述長度HOST可變主機名稱可變MACXxxxxxxxxxxxMAC地址63.4.3服務器端到客戶端(S-C)UDP數(shù)據(jù)包名稱代碼描述SRV_LOGIN_OK0 x01登錄成功SRV_REG_OK0 x02注冊成功SRV_QUNLIAO_DATE0 x03群聊信息SRV_GAME_OVER0 x04游戲結(jié)束SRV_EXIT_TUPIAN0 x05離開桌子SRV_YOUXI_KAISHI0 x06游戲開始SRV_CHONGZHI0 x07重置圖片3.4.4數(shù)據(jù)庫設計根據(jù)系統(tǒng)流程圖對數(shù)據(jù)庫進行設計(詳細見第4章)。

30、3.4.5詳細設計進行了系統(tǒng)詳細設計,并進行編碼設計,完成了對多人對戰(zhàn)平臺(連連看)系統(tǒng)大部分功能模塊的開發(fā)。(詳細見第5章)。第4章總體設計4.1開發(fā)環(huán)境開發(fā)工具:MicrosoftVisualC+6.0數(shù)據(jù)庫:MicrosoftAccess數(shù)據(jù)庫4.2相關表設計圖服務器類圖客戶端類圖數(shù)據(jù)庫表設計圖:用戶明細表:用戶積分表玩家在線狀態(tài)表在線狀態(tài)明細表數(shù)據(jù)庫關系圖系統(tǒng)用例圖注冊功能流程圖登錄功能流程圖請求實時在線列表流程圖坐下位置流程圖準備開始游戲流程圖開始游戲流程圖重置圖片流程圖小地圖功能流程圖聊天流程圖實時更新圖片流程圖第5章詳細設計由于是客戶機/服務器模式,因此下列的功能都將是服務器和客

31、戶端對應的功能一起講解5.1用戶注冊功能1、注冊如圖5.1.1圖5.1.1注冊首先,我們先來查看如何獲得用戶輸入的數(shù)據(jù)為了保存用戶的數(shù)據(jù),我們需要定義變量進行接收:CStringm_username;CStringm_nicheng;CStringm_pass;CStringm_two_pass;CStringm_tel;CTimem_date;intm_men;接下來是處理和打包數(shù)據(jù):先是判斷用戶是否有輸入數(shù)據(jù):BOOLMyReg:CheckNull()UpdateData();if(m_username.IsEmpty()MessageBox(用戶名不能為空!);m_pEdit=(CEdi

32、t*)this-GetDlgItem(IDC_YONGHU);m_pEdit-SetFocus();returnFALSE;if(m_nicheng.IsEmpty()MessageBox(昵稱不能為空!);m_pEdit=(CEdit*)this-GetDlgItem(IDC_NICHENG);m_pEdit-SetFocus();returnFALSE;if(m_pass.IsEmpty()MessageBox(密碼不能為空!);m_pEdit=(CEdit*)this-GetDlgItem(IDC_MIMA);m_pEdit-SetFocus();returnFALSE;if(m_two

33、_pass.IsEmpty()MessageBox(確認的密碼不能為空!);m_pEdit=(CEdit*)this-GetDlgItem(IDC_QUERENMIMA);m_pEdit-SetFocus();returnFALSE;if(m_tel.IsEmpty()MessageBox(電話不能為空!);m_pEdit=(CEdit*)this-GetDlgItem(IDC_DIANHUA);m_pEdit-SetFocus();returnFALSE;if(m_men=-1)MessageBox(性別不能為空!);m_pEdit=(CEdit*)this-GetDlgItem(IDC_R

34、ADIO1);m_pEdit-SetFocus();returnFALSE;returnTRUE;如果有輸入空的數(shù)據(jù),則返回假,正確返回真。之后是判斷數(shù)據(jù)是否輸入正確:BOOLMyReg:CheckFull()if(!CheckNull()returnFALSE;if(m_pass.GetLength()!=5|m_two_pass.GetLength()!=5)MessageBox(密碼長度不正確!);m_pEdit=(CEdit*)this-GetDlgItem(IDC_MIMA);m_pEdit-SetFocus();m_pass.Empty();m_two_pass.Empty();U

35、pdateData(FALSE);returnFALSE;if(m_pass!=m_two_pass)MessageBox(兩次輸入的密碼不正確!);m_pEdit=(CEdit*)this-GetDlgItem(IDC_MIMA);m_pEdit-SetFocus();m_pass.Empty();m_two_pass.Empty();UpdateData(FALSE);returnFALSE;if(m_tel.GetLength()=7|m_tel.GetLength()=8|m_tel.GetLength()=11)returnTRUE;elseif(m_tel.GetLength()=

36、12)if(m_tel.Left(1)!=0)MessageBox(你輸入的電話的第一位不正確,請重新輸入!);m_pEdit=(CEdit*)this-GetDlgItem(IDC_DIANHUA);m_pEdit-SetFocus();m_tel.Empty();UpdateData(FALSE);returnFALSE;returnTRUE;elseMessageBox(你輸入的電話的位數(shù)不正確,請重新輸入!);m_pEdit=(CEdit*)this-GetDlgItem(IDC_DIANHUA);m_pEdit-SetFocus();m_tel.Empty();UpdateData(

37、FALSE);returnFALSE;returnTRUE;當數(shù)據(jù)都驗證成功之后,將調(diào)用下面函數(shù)發(fā)送至服務器端voidMyReg:OnOK()/TODO:Addextravalidationhereif(!CheckFull()return;REG_DATEm_reg;memset(&m_reg,0,sizeof(REG_DATE);strcpy(m_reg.birthday,m_date.Format(%Y-%m-%d);strcpy(m_reg.nicheng,m_nicheng);strcpy(m_reg.password,m_pass);strcpy(m_reg.tel,m_tel);

38、strcpy(m_reg.user_name,m_username);m_reg.sex=m_men;charbufsizeof(REG_DATE)+sizeof(int)+1;memset(buf,0,sizeof(buf);sprintf(buf,%04d,REG);char*p=buf;p+=4;memcpy(p,&m_reg,sizeof(REG_DATE);sendto(MySocket:m_socket,buf,sizeof(REG_DATE)+sizeof(int)+1,0,(sockaddr*)&MySocket:udp_addr,sizeof(sockaddr_in);/這里

39、將數(shù)據(jù)發(fā)送到服務器服務器端:服務器在接受到客戶端的信息之后,將調(diào)用下面的函數(shù)進行處理:voidCMyDlg:Reg_date(LPPER_IO_DATApData)REG_DATEreg=*(REG_DATE*)(m_buf);CStringc_sql;intn;c_sql.Format(insertintoaccount(用戶名,昵稱,密碼,性別,生日,電話)values(%s,%s,%s,%d,%s,%s),reg.user_name,reg.nicheng,reg.password,reg.sex,reg.birthday,reg.tel);LONGtext=m_ado.JExecute

40、WithoutRecordset(c_sql);/這里調(diào)用ADO連接數(shù)據(jù)庫switch(text)case1:RECORDSETrs=m_ado.JExecuteWithRecordset(selectMAX(用戶ID)asidfromaccount);if(rs!=NULL)while(!rs-rsEOF)CStringc_sql;c_sql.Format(insertintoaccount_jifen(用戶ID)values(%d),n);m_ado.JExecuteWithoutRecordset(c_sql);REG_DATEsend_reg;memset(&send_reg,0,si

41、zeof(REG_DATE);send_reg.id=n;send_reg.flag=EXEC_OK;charbufsizeof(int)+sizeof(REG_DATE)+1=0;char*s=buf;sprintf(buf,%04d,REG);s+=4;memcpy(s,&send_reg,sizeof(REG_DATE);sendto(m_sock.GetSock(),buf,sizeof(int)+sizeof(REG_DATE)+1,0,(sockaddr*)&pData-addr,sizeof(sockaddr_in);break;default:REG_DATEsend_reg;

42、send_reg.flag=OTHER_ERROR;charbufsizeof(int)+sizeof(REG_DATE)+1=0;char*s=buf;sprintf(buf,%04d,REG);s+=4;memcpy(s,&send_reg,sizeof(REG_DATE);sendto(m_sock.GetSock(),buf,sizeof(int)+sizeof(REG_DATE)+1,0,(sockaddr*)&pData-addr,sizeof(sockaddr_in);/這里將注冊成功或失敗的信息返回給客戶端break;客戶端:接收到服務器端發(fā)送回來的信息之后將成功或失敗的信息顯

43、示出來,如果失敗,將需要用戶繼續(xù)輸入,如果成功,將提示成功信息,并返回到登陸界面。LRESULTMyReg:OnUserReg(WPARAMwParam,LPARAMlParam).CStringstr;str.Format(注冊成功rn登陸ID為:%d,m_reg.id);MessageBox(str);elseMessageBox(注冊失敗);m_username=_T();m_nicheng=_T();m_pass=_T();m_two_pass=_T();m_tel=_T();m_date=CTime:GetCurrentTime();m_men=-1;UpdateData(FALSE

44、);m_pEdit=(CEdit*)this-GetDlgItem(IDC_YONGHU);m_pEdit-SetFocus();return1;MyGlobalVariable*m_glb=MyGlobalVariable:GetMyGlobalVariable();:SendMessage(m_glb-GetLoginHwnd(),USER_MSG,(unsignedint)&m_reg.id,NULL);CDialog:OnOK();return0;注冊成功的界面5.2登錄頁面1、登錄頁面如圖5.1.2圖5.1.2登錄截圖首先定義2個變量接受用戶輸入的賬號和密碼的信息,定義如下:CStr

45、ingm_id;CStringm_mima;當用戶點擊了登陸界面之后,將調(diào)用以下函數(shù)進行處理:voidMyLogin:OnOK()/TODO:AddextravalidationhereUpdateData();LOGIN_DATEm_log;memset(&m_log,0,sizeof(LOGIN_DATE);m_log.user_name=atoi(m_id);strcpy(m_log.password,m_mima);charbufsizeof(LOGIN_DATE)+sizeof(int)+1;memset(buf,0,sizeof(buf);sprintf(buf,%04d,LOGI

46、N);char*p=buf;p+=4;memcpy(p,&m_log,sizeof(LOGIN_DATE);sendto(MySocket:m_socket,buf,sizeof(LOGIN_DATE)+sizeof(int)+1,0,(sockaddr*)&MySocket:udp_addr,sizeof(sockaddr_in);/這里將用戶輸入的數(shù)據(jù)發(fā)送到服務器端服務器端:當服務器收到用戶提交的登錄請求之后,將調(diào)用以下函數(shù)查詢數(shù)據(jù)庫并返回成功或失敗的信息voidCMyDlg:Lonin_date(LPPER_IO_DATApData)LOGIN_DATEm_log;memset(&m_l

47、og,0,sizeof(LOGIN_DATE);m_log=*(LOGIN_DATE*)m_buf);CStringstr;str.Format(SELECTcount(*)as個數(shù)FROMaccountwhere用戶ID=%dand密碼=%s,m_log.user_name,m_log.password);RECORDSETflag=m_ado.JExecuteWithRecordset(str);intn=0;if(flag!=NULL)while(!flag-rsEOF)n=GIF(flag,個數(shù));flag-MoveNext();if(n=1)/賬號和密碼正確inta=0;str.Fo

48、rmat(selectcount(*)as個數(shù)fromaccount_zaixianwhere用戶ID=%d,m_log.user_name);RECORDSETrs=m_ado.JExecuteWithRecordset(str);if(rs!=NULL)while(!rs-rsEOF)a=GIF(rs,個數(shù));rs-MoveNext();if(a=1)charbuf10=0;sprintf(buf,%04d%04d,LOGIN,REPEAT_LOGIN);sendto(m_sock.GetSock(),buf,10,0,(sockaddr*)&pData-addr,sizeof(socka

49、ddr_in);return;str.Format(selecta.用戶IDasID,a.昵稱as昵稱,b.積分as積分fromaccountasa,account_jifenasbwherea.用戶ID=%danda.用戶ID=b.用戶ID,m_log.user_name);rs=m_ado.JExecuteWithRecordset(str);XINXIm_xinxi=GetXinxi(rs);charbufsizeof(int)+sizeof(XINXI)+1=0;sprintf(buf,%04d,BAOCUN_XINXI);char*p=buf;p+=4;memcpy(p,&m_xin

50、xi,sizeof(XINXI);sendto(m_sock.GetSock(),buf,sizeof(int)+sizeof(XINXI)+1,0,(sockaddr*)&pData-addr,sizeof(sockaddr_in);/客戶端保存相應的數(shù)據(jù);chararr10=0;sprintf(arr,%04d%04d,LOGIN,EXEC_OK);sendto(m_sock.GetSock(),arr,10,0,(sockaddr*)&pData-addr,sizeof(sockaddr_in);charbuf1sizeof(int)+sizeof(XINXI)+1=0;sprintf(

51、buf1,%04d,SEND_LOG_DATE);p=buf1;p+=4;memcpy(p,&m_xinxi,sizeof(XINXI);for(ADDRITit=m_addr.begin();it!=m_addr.end();+it)sendto(m_sock.GetSock(),buf1,sizeof(int)+sizeof(XINXI)+1,0,(sockaddr*)&(*it),sizeof(sockaddr_in);m_addr.push_back(pData-addr);/*更新list控件*/rs=NULL;str.Format(selecta.用戶IDasID,a.昵稱as昵稱

52、,a.積分as積分,b.在線狀態(tài)as狀態(tài)fromaccount_zaixianasa,account_zhuangtaiasbwherea.用戶ID=%danda.在線ID=b.在線ID,m_log.user_name);rs=m_ado.JExecuteWithRecordset(str);UpdateList(rs);CTimet=CTime:GetCurrentTime();CStringstr,m_xianshi_xinxi,str1;str=t.Format(%Y-%m-%d%H:%M:%S:);str1.Format(%s玩家%05d上線了!rn,str,m_log.user_na

53、me);m_xinxi_xianshi.ReplaceSel(str1);m_xinxi_xianshi.SetSel(-1,-1);elsecharbuf10=0;sprintf(buf,%04d%04d,LOGIN,LOGIN_ERROR);sendto(m_sock.GetSock(),buf,10,0,(sockaddr*)&pData-addr,sizeof(sockaddr_in);客戶端:當收到服務器端處理完畢的數(shù)據(jù)之后,將調(diào)用下面函數(shù)進行處理。成功之后將顯示游戲大廳界面。LRESULTMyLogin:OnUserLog(WPARAMwParam,LPARAMlparm)intl

54、og=atoi(char*)wParam);delete(char*)wParam;if(log=EXEC_OK)/賬號密碼驗證成功MySysCfg:Set_old_user(m_id);MySysCfg:write_to_old_file();/memcpy(m_id,m_id,m_id.GetLength();MyGlobalVariable*m_glb=MyGlobalVariable:GetMyGlobalVariable();m_glb-SetLoginHwnd(NULL);CDialog:OnOK();return0;if(log=LOGIN_ERROR)MessageBox(您輸

55、入的用戶名或密碼不正確,請您重新輸入!);m_id=;m_mima=;UpdateData(FALSE);CEdit*pEdit=(CEdit*)this-GetDlgItem(IDC_YONGHU);pEdit-SetFocus();return0;if(log=REPEAT_LOGIN)MessageBox(您輸入的用戶名已經(jīng)登錄,請您重新輸入!);m_id=;m_mima=;UpdateData(FALSE);CEdit*pEdit=(CEdit*)this-GetDlgItem(IDC_YONGHU);pEdit-SetFocus();return0;return0;5.3游戲大廳客戶

56、端的大廳界面如圖5.2.1圖5.2.1大廳界面界面左邊是選擇游戲大廳的界面,這個功能不需要連接服務器,相關的顯示函數(shù)如下:voidCMyDlg:InitTreeText()/初始化控件信息m_tree.DeleteAllItems();HTREEITEMroot;HTREEITEMroot1;root=m_tree.InsertItem(連連看,0,1);m_tree.SetItemData(root,0);root1=m_tree.InsertItem(連連看一區(qū),0,1,root);m_tree.SetItemData(root1,1);voidCMyDlg:OnDblclkTree1(N

57、MHDR*pNMHDR,LRESULT*pResult)/選擇房間/TODO:AddyourcontrolnotificationhandlercodeherePOINTpoint;GetCursorPos(&point);UINTuFlags;m_tree.ScreenToClient(&point);HTREEITEMhItem=m_tree.HitTest(point,&uFlags);if(hItem!=NULL)&(TVHT_ONITEM&uFlags)inti=m_tree.GetItemData(hItem);if(i=1)if(m_bool=FALSE)CStringstr;s

58、tr=m_tree.GetItemText(hItem);m_tab.InsertItem(1,str,0);m_tab.SetCurSel(1);m_fangjian=newMyFangjian();m_fangjian-Create(IDD_FANGJIAN,&m_tab);m_sum+;m_bool=TRUE;DoTab(m_sum);elseMessageBox(你已經(jīng)開啟房間了);*pResult=0;界面中間的窗體顯示的是游戲中積分排名前10名的玩家的信息,相關的函數(shù)如下:charbufsizeof(int)+1;memset(buf,0,sizeof(buf);sprintf(b

59、uf,%04d,REQUEST_DATE);sendto(MySocket:m_socket,buf,sizeof(int)+1,0,(sockaddr*)&MySocket:udp_addr,sizeof(sockaddr_in);/向服務器請求列表數(shù)據(jù)服務器端:服務器在接受到客戶端的請求之后,調(diào)用函數(shù)查詢數(shù)據(jù)庫并返回結(jié)果集:voidCMyDlg:Request_date(LPPER_IO_DATApData)charbufDATA_SIZE=0;intx=0;RECORDSETrs=m_ado.JExecuteWithRecordset(selecta.昵稱as昵稱,a.積分as積分,b.

60、在線狀態(tài)as狀態(tài)fromaccount_zaixianasa,account_zhuangtaiasbwherea.在線ID=b.在線ID);x=Pack_date(rs,buf);chararrDATA_SIZE=0;sprintf(arr,%04d%04d,REQUEST_DATE,x);char*p=arr;p+=8;memcpy(p,buf,sizeof(XINXI)*x);sendto(m_sock.GetSock(),arr,sizeof(XINXI)*x+8,0,(sockaddr*)&pData-addr,sizeof(sockaddr_in);/將信息發(fā)送回客戶端intCMy

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論