vc++多人對戰平臺連連看系統畢業設計含源文件復習過程_第1頁
vc++多人對戰平臺連連看系統畢業設計含源文件復習過程_第2頁
vc++多人對戰平臺連連看系統畢業設計含源文件復習過程_第3頁
vc++多人對戰平臺連連看系統畢業設計含源文件復習過程_第4頁
vc++多人對戰平臺連連看系統畢業設計含源文件復習過程_第5頁
已閱讀5頁,還剩163頁未讀 繼續免費閱讀

下載本文檔

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

文檔簡介

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

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

3、用游戲服務器則為網絡游戲提供了容量巨大的“加油站”。前不久,網絡游戲還被視為一個“高風險”的行業,但隨著人們對網絡游戲的重新認識,網絡游戲正在恢復其應有的地位。本文在基于VC+開發平臺的多人對戰平臺系統的工作基礎上采用基于B/S三層架構模式,選取VC+6.0作為開發工具,以Access2007為后臺數據庫,來實現多人對戰平臺的基本功能。關鍵詞:連連看、網絡游戲、網絡對戰目錄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發展概況PAGEREF_Toc261900592h1H

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

6、三層架構的優缺點PAGEREF_Toc261900598h4HYPERLINKl_Toc261900599第3章需求分析PAGEREF_Toc261900599h5HYPERLINKl_Toc2619006003.1產品描述PAGEREF_Toc261900600h5HYPERLINKl_Toc2619006013.2產品功能PAGEREF_Toc261900601h5HYPERLINKl_Toc2619006023.3具體功能需求PAGEREF_Toc261900602h6HYPERLINKl_Toc2619006043.4協議設計PAGEREF_Toc261900604h9HYPERLIN

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

8、09h11HYPERLINKl_Toc261900610第4章總體設計PAGEREF_Toc261900610h12HYPERLINKl_Toc2619006114.1開發環境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章總結與展望PAGEREF_Toc261900622h96HYPER

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

28、格式名稱內容描述長度VERSION0100協議版本2CMD_TYPEXx命令類型(00,01)1KEYWORDXx加密字段1COMMANDXxxx命令代碼2SEQNUMXxxx數據包序號2UINXxxxxxxx發送方標識4PARAMETERS可變可選參數可變CMD_TYPE取值范圍值含義00C-S01S-C3.4.2客戶端到服務器端(C-S)UDP數據包名稱代碼描述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名稱內容描述長度HOST可變主機名稱可變MACXxxxxxxxxxxxMAC地址63.4.3服務器端到客戶端(S-C)UDP數據包名稱代碼描述SRV_LOGIN_OK0 x01登錄成功SRV_REG_OK0 x02注冊成功SRV_QUNLIAO_DATE0 x03群聊信息SRV_GAME_OVER0 x04游戲結束SRV_EXIT_TUPIAN0 x05離開桌子SRV_YOUXI_KAISHI0 x06游戲開始SRV_CHONGZHI0 x07重置圖片3.4.4數據庫設計根據系統流程圖對數據庫進行設計(詳細見第4章)。

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

31、戶端對應的功能一起講解5.1用戶注冊功能1、注冊如圖5.1.1圖5.1.1注冊首先,我們先來查看如何獲得用戶輸入的數據為了保存用戶的數據,我們需要定義變量進行接收:CStringm_username;CStringm_nicheng;CStringm_pass;CStringm_two_pass;CStringm_tel;CTimem_date;intm_men;接下來是處理和打包數據:先是判斷用戶是否有輸入數據: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;如果有輸入空的數據,則返回假,正確返回真。之后是判斷數據是否輸入正確: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(你輸入的電話的位數不正確,請重新輸入!);m_pEdit=(CEdit*)this-GetDlgItem(IDC_DIANHUA);m_pEdit-SetFocus();m_tel.Empty();UpdateData(

37、FALSE);returnFALSE;returnTRUE;當數據都驗證成功之后,將調用下面函數發送至服務器端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、將數據發送到服務器服務器端:服務器在接受到客戶端的信息之后,將調用下面的函數進行處理: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);/這里調用ADO連接數據庫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;客戶端:接收到服務器端發送回來的信息之后將成功或失敗的信息顯

43、示出來,如果失敗,將需要用戶繼續輸入,如果成功,將提示成功信息,并返回到登陸界面。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;當用戶點擊了登陸界面之后,將調用以下函數進行處理: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);/這里將用戶輸入的數據發送到服務器端服務器端:當服務器收到用戶提交的登錄請求之后,將調用以下函數查詢數據庫并返回成功或失敗的信息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個數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,個數);flag-MoveNext();if(n=1)/賬號和密碼正確inta=0;str.Fo

48、rmat(selectcount(*)as個數fromaccount_zaixianwhere用戶ID=%d,m_log.user_name);RECORDSETrs=m_ado.JExecuteWithRecordset(str);if(rs!=NULL)while(!rs-rsEOF)a=GIF(rs,個數);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);/客戶端保存相應的數據;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.在線狀態as狀態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);客戶端:當收到服務器端處理完畢的數據之后,將調用下面函數進行處理。成功之后將顯示游戲大廳界面。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(您輸入的用戶名已經登錄,請您重新輸入!);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大廳界面界面左邊是選擇游戲大廳的界面,這個功能不需要連接服務器,相關的顯示函數如下:voidCMyDlg:InitTreeText()/初始化控件信息m_tree.DeleteAllItems();HTREEITEMroot;HTREEITEMroot1;root=m_tree.InsertItem(連連看,0,1);m_tree.SetItemData(root,0);root1=m_tree.InsertItem(連連看一區,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(你已經開啟房間了);*pResult=0;界面中間的窗體顯示的是游戲中積分排名前10名的玩家的信息,相關的函數如下: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);/向服務器請求列表數據服務器端:服務器在接受到客戶端的請求之后,調用函數查詢數據庫并返回結果集:voidCMyDlg:Request_date(LPPER_IO_DATApData)charbufDATA_SIZE=0;intx=0;RECORDSETrs=m_ado.JExecuteWithRecordset(selecta.昵稱as昵稱,a.積分as積分,b.

60、在線狀態as狀態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);/將信息發送回客戶端intCMy

溫馨提示

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

評論

0/150

提交評論