![基于CSocket聯(lián)網(wǎng)撲克游戲開發(fā)畢業(yè)論文_第1頁](http://file4.renrendoc.com/view/8ebfe63de05abab117927f23f20e27cb/8ebfe63de05abab117927f23f20e27cb1.gif)
![基于CSocket聯(lián)網(wǎng)撲克游戲開發(fā)畢業(yè)論文_第2頁](http://file4.renrendoc.com/view/8ebfe63de05abab117927f23f20e27cb/8ebfe63de05abab117927f23f20e27cb2.gif)
![基于CSocket聯(lián)網(wǎng)撲克游戲開發(fā)畢業(yè)論文_第3頁](http://file4.renrendoc.com/view/8ebfe63de05abab117927f23f20e27cb/8ebfe63de05abab117927f23f20e27cb3.gif)
![基于CSocket聯(lián)網(wǎng)撲克游戲開發(fā)畢業(yè)論文_第4頁](http://file4.renrendoc.com/view/8ebfe63de05abab117927f23f20e27cb/8ebfe63de05abab117927f23f20e27cb4.gif)
![基于CSocket聯(lián)網(wǎng)撲克游戲開發(fā)畢業(yè)論文_第5頁](http://file4.renrendoc.com/view/8ebfe63de05abab117927f23f20e27cb/8ebfe63de05abab117927f23f20e27cb5.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、 基于CSocket網(wǎng)絡(luò)游戲程序的開發(fā)摘要如今,網(wǎng)絡(luò)游戲變得越來越普及。那么這些網(wǎng)絡(luò)游戲是用什么軟件來開發(fā)的?目前, java、VB、C+等語言都被廣泛應(yīng)用于游戲開發(fā)中。由于Visual MFC有更好的開發(fā)界面, Visual C+開發(fā)出來的程序穩(wěn)定性好,可移植性強,而且軟件與硬件相互獨立,所以擁有可視化集成開發(fā)環(huán)境的VC+或許是比較好的開發(fā)工具。本文所述的斗地主是在VC+開發(fā)環(huán)境下編譯的,整個游戲采用結(jié)構(gòu)化的方式進行編譯,逐步完善系統(tǒng)功能。系統(tǒng)采用CSocket實現(xiàn)連網(wǎng)游戲。CSocket是MFC在CAsyncSocket基礎(chǔ)上派生的一個同步阻塞Socket的封裝類。而Socket是Wind
2、ows中得到廣泛應(yīng)用的、開放的、支持多協(xié)議的網(wǎng)絡(luò)編程接口。一個CSocket對象代表了一個比CAsyncSocket對象更高層次的Windows Socket的抽象,CSocket類與CSocketFile類和CArchive類一起工作來發(fā)送和接收數(shù)據(jù),因此使它更加容易使用。本程序以斗地主為例,編程并實現(xiàn)了CSocket功能,達到了預(yù)期連網(wǎng)打牌的效果。本文主要以斗地主為例,描述了斗地主的開發(fā)過程,包括游戲界面的開發(fā)、基于CSocket網(wǎng)絡(luò)游戲的實現(xiàn)、核心算法的實現(xiàn)。運用軟件工程的知識對程序開發(fā)過程進行詳細介紹。經(jīng)過詳細設(shè)計、系統(tǒng)檢測等方法來保證程序的穩(wěn)定運行。【關(guān)鍵詞】Managers,Soc
3、ket,CSocket,模塊化編程,算法LAN Networking Game Based on CSocketBao Longbo(School of mathematics, physics and information, Zhejiang Ocean University 316000)AbstractToday, online games have become more and more popular. What software are these online games developed by ?Currently, java, VB, C + + and other l
4、anguages are widely used in games development. Because Visual MFC interface has better development. The programs what Visual C + + developed are stably and transplantable, software and hardware also independent with each other. So a visual integrated development environment for VC + + probably is a
5、better development tool.Landlords described in this article are in VC + + development environment, compiler, and the entire game use a structured approach to build and gradually perfect the system functions. System uses CSocket to achieve networking game. CSocket is a synchronous blocking Socket wra
6、ppers derived by MFC based on CAsynncSocket. The Socket is widely used for open, multi-protocol network programming interface in windows. A CSocket object represents a Windows Socket abstract at a higher level than CAsyncSocket. Class CSocket、CSocketFile and CArchive work together to send and receiv
7、e data, so it is more easily used. This program uses Landlords as an example, programmers implement CSocket functions to achieves the desired effect. In this article, Landlords as an example, describes the development process of Landlords, including the development of the game interface, online game
8、 based on CSocket and the core algorithm. Using knowledge of software engineering, describes the development process of the program in details. After detail designing、system testing and other methods, it ensure the stable operation of the program.【Keywords】Managers,CSocket,Modular Programming,Socket
9、,algorithm目錄 TOC o 1-3 h z u HYPERLINK l _Toc263344047 摘要 PAGEREF _Toc263344047 h I HYPERLINK l _Toc263344048 Abstract PAGEREF _Toc263344048 h II HYPERLINK l _Toc263344049 1概述 PAGEREF _Toc263344049 h 1 HYPERLINK l _Toc263344050 1.1 選題背景 PAGEREF _Toc263344050 h 1 HYPERLINK l _Toc263344051 1.2 研究現(xiàn)狀 PA
10、GEREF _Toc263344051 h 1 HYPERLINK l _Toc263344052 1.3 斗地主簡介 PAGEREF _Toc263344052 h 2 HYPERLINK l _Toc263344053 1.4 問題描述 PAGEREF _Toc263344053 h 2 HYPERLINK l _Toc263344054 2 對本程序規(guī)則和開發(fā)工具介紹 PAGEREF _Toc263344054 h 3 HYPERLINK l _Toc263344055 2.1 程序游戲規(guī)則介紹 PAGEREF _Toc263344055 h 3 HYPERLINK l _Toc2633
11、44056 2.2 Visual C+簡介 PAGEREF _Toc263344056 h 3 HYPERLINK l _Toc263344057 2.3 基于Socket的網(wǎng)絡(luò)編程 PAGEREF _Toc263344057 h 5 HYPERLINK l _Toc263344058 2.4 基于CSocket網(wǎng)絡(luò)編程 PAGEREF _Toc263344058 h 6 HYPERLINK l _Toc263344059 3 程序總體分析 PAGEREF _Toc263344059 h 7 HYPERLINK l _Toc263344060 3.1 程序運行過程 PAGEREF _Toc26
12、3344060 h 7 HYPERLINK l _Toc263344061 3.2 Managers核心算法流程 PAGEREF _Toc263344061 h 7 HYPERLINK l _Toc263344062 4 程序前期準備 PAGEREF _Toc263344062 h 9 HYPERLINK l _Toc263344063 4.1 游戲界面設(shè)計 PAGEREF _Toc263344063 h 9 HYPERLINK l _Toc263344064 4.2 BUTTON控件實現(xiàn) PAGEREF _Toc263344064 h 10 HYPERLINK l _Toc263344065
13、 4.3 程序相關(guān)繪圖 PAGEREF _Toc263344065 h 10 HYPERLINK l _Toc263344066 4.4 動畫制作 PAGEREF _Toc263344066 h 10 HYPERLINK l _Toc263344067 5算法實現(xiàn) PAGEREF _Toc263344067 h 10 HYPERLINK l _Toc263344068 5.1 游戲開始 PAGEREF _Toc263344068 h 10 HYPERLINK l _Toc263344069 5.2 游戲進行 PAGEREF _Toc263344069 h 10 HYPERLINK l _Toc
14、263344070 5.3 CSocket方法實現(xiàn) PAGEREF _Toc263344070 h 10 HYPERLINK l _Toc263344071 5.3.1 數(shù)據(jù)傳輸?shù)姆椒?PAGEREF _Toc263344071 h 10 HYPERLINK l _Toc263344072 5.3.2 數(shù)據(jù)傳輸?shù)囊?guī)定 PAGEREF _Toc263344072 h 10 HYPERLINK l _Toc263344073 5.3.4 如何判斷游戲開始 PAGEREF _Toc263344073 h 10 HYPERLINK l _Toc263344074 5.3.5 CSocket 的不足 P
15、AGEREF _Toc263344074 h 10 HYPERLINK l _Toc263344075 6 系統(tǒng)測試和功能評價 PAGEREF _Toc263344075 h 10 HYPERLINK l _Toc263344076 6.1 系統(tǒng)測試 PAGEREF _Toc263344076 h 10 HYPERLINK l _Toc263344077 6.2常用系統(tǒng)測試技術(shù) PAGEREF _Toc263344077 h 10 HYPERLINK l _Toc263344078 6.3測試過程 PAGEREF _Toc263344078 h 10 HYPERLINK l _Toc26334
16、4079 6.4 系統(tǒng)欠缺 PAGEREF _Toc263344079 h 10 HYPERLINK l _Toc263344080 7 系統(tǒng)運行 PAGEREF _Toc263344080 h 10 HYPERLINK l _Toc263344081 7.1 游戲配置界面 PAGEREF _Toc263344081 h 10 HYPERLINK l _Toc263344082 7.2 游戲主界面 PAGEREF _Toc263344082 h 10 HYPERLINK l _Toc263344083 總結(jié) PAGEREF _Toc263344083 h 10 HYPERLINK l _Toc
17、263344084 參考文獻 PAGEREF _Toc263344084 h 101概述1.1 選題背景隨著計算機的普及和網(wǎng)絡(luò)技術(shù)的發(fā)展,各種各樣的網(wǎng)絡(luò)游戲在人們的生活中扮演越來越重要的角色。很多人都把一些小游戲作為工作之余的休閑活動,斗地主就在其中扮演了相當重要的角色,大部分人都有玩過各式各樣的斗地主游戲。游戲就是在不停的完善當中才能越做越好,本程序只是作為一個簡單的原型,雖然具備大部分斗地主游戲的功能,卻有很多欠缺。1.2 研究現(xiàn)狀在當今國際上,對于斗地主的設(shè)計可以用很多工具實現(xiàn),比如說vb、java、c語言等,每種語言工具都有其各自利弊。用java設(shè)計斗地主是當前國際比較常見的一種方法,
18、因為java語言比較簡單,這是許多程序員更愿意使用該語言的主要原因,還有就是java語言是面向?qū)ο蟮?、健壯的、安全的、體系結(jié)構(gòu)中立的、可移植的、解釋性的、髙性能的、多線程的、動態(tài)的。用vb設(shè)計斗地主也是可以實現(xiàn)其功能的一種方法,但目前應(yīng)用vb來實現(xiàn)斗地主不是很常見,因為vb必須在沒有MSVBVMDLL的計算機上安裝所需的DLL文件,對于操作系統(tǒng)的設(shè)計比較困難,因此很多程序員都不愿去使用vb來設(shè)計。還有比較常見的就是用C語言設(shè)計,因為C語言使用起來相對比較簡單,是國際上很長用的一種編程方法,也是最基礎(chǔ)的編程語言。當前國際設(shè)計斗地主主要就是這幾種,每種都有其各自的好處。用Visual C+設(shè)計斗地
19、主,在當前國際上是很常用的,目前很多公司都是使用Visual C+來設(shè)計棋牌類游戲,這是由于Visual MFC對于開發(fā)界面有更好的效果,還有Visual C+開發(fā)出來的程序穩(wěn)定性好,可移植性強,而且軟件與硬件相互獨立,而這正是棋牌類游戲所需要的。當前國際上用Visual C+設(shè)計斗地主技術(shù)已經(jīng)比較成熟,對于斗地主功能的實現(xiàn)效果也不錯,這也是Visual C+比其他工具更適合做單機斗地主的原因。而本游戲用到的CSocket技術(shù)是MFC在CAsyncSocket基礎(chǔ)上派生的一個同步阻塞Socket封裝類。1.3 斗地主簡介斗地主起源于湖北,據(jù)傳是一位叫吳修全的年輕人,根據(jù)當?shù)亓餍械膿淇送娣ā芭艿?/p>
20、快”改編的。斗地主玩法簡單,娛樂性強,老少皆宜,如今已風(fēng)靡整個中國,并流行于互聯(lián)網(wǎng)上。四人斗地主的規(guī)則是由中國象棋棋王胡榮華總結(jié)和定型的,92181棋牌更是多次用這套規(guī)則舉行網(wǎng)絡(luò)斗地主比賽,上海也曾經(jīng)用這套規(guī)則舉辦過多次電視轉(zhuǎn)播的群眾比賽。 斗地主對抗性和配合性都很強。該游戲由三個人玩(四人也能玩),用一副牌共54 張牌。每局牌有一個玩家是“地主”,地主為一方,其余兩家農(nóng)民為另一方,雙方對戰(zhàn),地主的目標是(以合法的出牌方式)先出完手里所有的牌,而農(nóng)民的目標是在地主出完牌以前,先出完手里所有的牌。先出完牌的人所代表的一方獲勝。斗地主屬于基礎(chǔ)類撲克游戲的范疇。斗地主后期又增加了網(wǎng)絡(luò)斗地主,納入了比
21、賽制,已競技為中心。如:淘汰賽制、循環(huán)賽制、雙敗淘汰賽制、積分晉級賽制、分組出線賽制、打立出局賽制、瑞士移位賽制、復(fù)活賽制等,以上的賽制在JJ比賽中得到的充分體現(xiàn)1。1.4 問題描述用C+實現(xiàn)斗地主游戲主要有三部分。第一部分是界面設(shè)計;第二部分是游戲內(nèi)核(包括出牌大小、如何過牌、出牌等)設(shè)計;第三部分是網(wǎng)絡(luò)部分。解決了這三部分的問題,程序也就基本完成了。在程序中定義了比較出牌大小的Managers算法,對發(fā)牌、點牌進行設(shè)計的LBUTTONDOWN響應(yīng)等來實現(xiàn)斗地主程序。2 對本程序規(guī)則和開發(fā)工具介紹2.1 程序游戲規(guī)則介紹該游戲由3個人玩,用一副牌,地主為一方,其余兩家為另一方,雙方對戰(zhàn),先出
22、完牌的一方獲勝,出牌規(guī)則類似“爭上游”。發(fā)牌:一副牌,留3張底牌,其它發(fā)給3家,底牌加到地主手中。叫牌:叫牌按出牌順序輪流開始叫牌,每人只能叫一次。叫牌的人為地主,如果都選擇不叫,則重新發(fā)牌,重新叫地主。出牌:首先將3張底牌交給地主,3張底牌為可見。由地主開始出牌,然后按逆時針順序依次出牌,輪到用戶跟牌時,用戶可按右下方“過牌”按鈕表示不出,或者按照規(guī)則按“出牌”選擇符合規(guī)則的牌,直至某一方出完牌為止。牌型說明:1.雙王。2.炸彈(四張大小相同的牌)。3.單牌(單張牌)。4.雙牌(兩張大小相同的牌)。5.三張牌(三張大小相同的牌)。6.三帶一手(三張大小相同的牌+1張單牌或一對牌)。7.單順(
23、5張或更多的連續(xù)單牌,不包括2點和雙王,不分花色)。8.雙順(3對或更多的連續(xù)對牌(不包括2點和雙王)。9.三順(兩個或更多的連續(xù)“三張牌”,不包括2點和雙王)。10.飛機帶翅膀(3順+同數(shù)量的一手牌)。11.四帶二(4張牌+兩手牌)。牌型比較:雙王炸彈一般牌型(單牌,對牌,三張牌,三帶一手,單順,雙順,三順,飛機帶翅膀,四帶二)。一般牌型:只有牌型且張數(shù)相同的牌才可按牌點數(shù)比較大小。其中三帶一,三帶二,飛機帶翅膀,四帶二組合牌型,比較其相同張數(shù)最多的牌點數(shù)大小。游戲術(shù)語:地主(叫的一方為地主,可獲得底牌)。游戲規(guī)則:只能出大于上家的牌,沒有則不出,直到一方出完,則游戲結(jié)束。2.2 Visua
24、l C+簡介Visual C+ (簡稱 VC+)是被公認為比較難入門的編程工具, 它使用的編程語言是 C+, 但是由于VC+的平臺依賴性,決定了它的使用必須要跟 Windows 操作系統(tǒng)緊密聯(lián)系。 這種操作系統(tǒng)相關(guān)性,大大增加了 VC+的學(xué)習(xí)難度。 主要原因包括 Windows 操作系統(tǒng)的復(fù)雜性和封閉性。復(fù)雜性包括操作系統(tǒng)的各類消息及其處理流程、令人眼花繚亂的 API 函數(shù)及宏定義和復(fù)雜的應(yīng)用程序結(jié)構(gòu)等;封閉性主要是指操作系統(tǒng)本身的非開放性。 所以,如果缺少有效的學(xué)習(xí)引導(dǎo),容易造成對 VC+學(xué)習(xí)的“淺嘗輒止”,被它的高難度所嚇倒。Visual C+是一個功能強大的可視化軟件開發(fā)工具。自1993
25、年Microsoft公司推出Visual C+1.0后,隨著其新版本的不斷問世,Visual C+已成為專業(yè)程序員進行軟件開發(fā)的首選工具。 雖然微軟公司推出了Visual C+.NET(Visual C+7.0),但它的應(yīng)用的很大的局限性,只適用于Windows 2000,Windows XP和Windows NT4.0。所以實際中,更多的是以Visual C+6.0為平臺。Visual C+6.0不僅是一個C+編譯器,而且是一個基于Windows操作系統(tǒng)的可視化集成開發(fā)環(huán)境(integrated development environment,IDE)。Visual C+6.0由許多組件組成
26、,包括編輯器、調(diào)試器以及程序向?qū)ppWizard、類向?qū)lass Wizard等開發(fā)工具。 這些組件通過一個名為Developer Studio的組件集成為和諧的開發(fā)環(huán)境2。 Visual C+作為一種程序設(shè)計語言,它同時也是一個集成開發(fā)工具,提供了軟件代碼自動生成和可視化的資源編輯功能。在使用Visual C+開發(fā)應(yīng)用程序的過程中,系統(tǒng)為我們生成了大量的各種類型的文件,在本節(jié)中將要詳細介紹Visual C+中這些不同類型的文件分別起到什么樣的作用,在此基礎(chǔ)上對Visual C+如何管理應(yīng)用程序所用到的各種文件有一個全面的認識。首先要介紹的是擴展名為dsw的文件類型,這種類型的文件在VC中
27、是級別最高的,稱為Workspace文件。在VC中,應(yīng)用程序是以Project的形式存在的,Project文件以.dsp擴展名,在Workspace文件中可以包含多個Project,由Workspace文件對它們進行統(tǒng)一的協(xié)調(diào)和管理。與dsw類型的Workspace文件相配合的一個重要的文件類型是以opt為擴展名的文件,這個文件中包含的是在Workspace文件中要用到的本地計算機的有關(guān)配置信息,所以這個文件不能在不同的計算機上共享,當我們打開一個Workspace文件時,如果系統(tǒng)找不到需要的opt類型文件,就會自動地創(chuàng)建一個與之配合的包含本地計算機信息的opt文件。上面提到Project文件
28、的擴展名是dsp,這個文件中存放的是一個特定的工程,也就是特定的應(yīng)用程序的有關(guān)信息,每個工程都對應(yīng)有一個dsp類型的文件。以clw為擴展名的文件是用來存放應(yīng)用程序中用到的類和資源的信息的,這些信息是VC中的ClassWizard工具管理和使用類的信息來源。對應(yīng)每個應(yīng)用程序有一個readme.txt文件,這個文件中列出了應(yīng)用程序中用到的所有的文件的信息,打開并查看其中的內(nèi)容就可以對應(yīng)用程序的文件結(jié)構(gòu)有一個基本的認識。在應(yīng)用程序中大量應(yīng)用的是以h和cpp為擴展名的文件,以h為擴展名的文件稱為頭文件。以cpp為擴展名的文件稱為實現(xiàn)文件,一般說來h為擴展名的文件與cpp為擴展名的文件是一一對應(yīng)配合使用
29、的,在h為擴展名的文件中包含的主要是類的定義,而在cpp為擴展名的文件中包含的主要是類成員函數(shù)的實現(xiàn)代碼。在應(yīng)用程序中經(jīng)常要使用一些位圖、菜單之類的資源,VC中以rc為擴展名的文件稱為資源文件,其中包含了應(yīng)用程序中用到的所有的windows資源,要指出的一點是rc文件可以直接在VC集成環(huán)境中以可視化的方法進行編輯和修改。最后要介紹的是以rc2為擴展名的文件,它也是資源文件,但這個文件中的資源不能在VC的集成環(huán)境下直接進行編輯和修改,而是由我們自己根據(jù)需要手工地編輯這個文件。對于以ico,bmp等為擴展名的文件是具體的資源,產(chǎn)生這種資源的途徑很多。使用rc資源文件的目的就是為了對程序中用到的大量
30、的資源進行統(tǒng)一的管理。2.3 基于Socket的網(wǎng)絡(luò)編程用層通過傳輸層進行數(shù)據(jù)通信時,TCP和UDP會遇到同時為多個應(yīng)用程序進程提供并發(fā)服務(wù)的問題。多個TCP連接或多個應(yīng)用程序進程可能需要通過同一個TCP協(xié)議端口傳輸數(shù)據(jù)。為了區(qū)別不同的應(yīng)用程序進程和連接,許多計算機操作系統(tǒng)為應(yīng)用程序與TCP/IP協(xié)議交互提供了稱為套接字(Socket)的接口,區(qū)分不同應(yīng)用程序進程間的網(wǎng)絡(luò)通信和連接。生成套接字,主要有3個參數(shù):通信的目的IP地址、使用的傳輸層協(xié)議(TCP或UDP)和使用的端口號。Socket原意是“插座”。通過將這3個參數(shù)結(jié)合起來,與一個“插座”Socket綁定,應(yīng)用層就可以和傳輸層通過套接字
31、接口,區(qū)分來自不同應(yīng)用程序進程或網(wǎng)絡(luò)連接的通信,實現(xiàn)數(shù)據(jù)傳輸?shù)牟l(fā)服務(wù)。Socket可以看成在兩個程序進行通訊連接中的一個端點,一個程序?qū)⒁欢涡畔懭隨ocket中,該Socket將這段信息發(fā)送給另外一個Socket中,使這段信息能傳送到其他程序中。Host A上的程序A將一段信息寫入Socket中,Socket的內(nèi)容被Host A的網(wǎng)絡(luò)管理軟件訪問,并將這段信息通過Host A的網(wǎng)絡(luò)接口卡發(fā)送到Host B,Host B的網(wǎng)絡(luò)接口卡接收到這段信息后,傳送給Host B的網(wǎng)絡(luò)管理軟件,網(wǎng)絡(luò)管理軟件將這段信息保存在Host B的Socket中,然后程序B才能在Socket中閱讀這段信息。要通過互
32、聯(lián)網(wǎng)進行通信,至少需要一對套接字,一個運行于客戶機端,稱之為Client Socket,另一個運行于服務(wù)器端,稱之為Server Socket。根據(jù)連接啟動的方式以及本地套接字要連接的目標,套接字之間的連接過程可以分為三個步驟:服務(wù)器監(jiān)聽,客戶端請求,連接確認。服務(wù)器監(jiān)聽:是服務(wù)器端套接字并不定位具體的客戶端套接字,而是處于等待連接的狀態(tài),實時監(jiān)控網(wǎng)絡(luò)狀態(tài)。客戶端請求:是指由客戶端的套接字提出連接請求,要連接的目標是服務(wù)器端的套接字。為此,客戶端的套接字必須首先描述它要連接的服務(wù)器的套接字,指出服務(wù)器端套接字的地址和端口號,然后就向服務(wù)器端套接字提出連接請求。連接確認:是指當服務(wù)器端套接字監(jiān)聽
33、到或者說接收到客戶端套接字的連接請求,它就響應(yīng)客戶端套接字的請求,建立一個新的線程,把服務(wù)器端套接字的描述發(fā)給客戶端,一旦客戶端確認了此描述,連接就建立好了。而服務(wù)器端套接字繼續(xù)處于監(jiān)聽狀態(tài),繼續(xù)接收其他客戶端套接字的連接請求。Socket編程實現(xiàn)原理(從連接的建立到連接的關(guān)閉,每個socket應(yīng)用都大致包括以下幾個基本步驟):1 .服務(wù)器端socket綁定于特定端口,服務(wù)器偵聽socket等待連接請求;2 .客戶端向服務(wù)器和特定端口提交連接請求;3 .服務(wù)器接受連接,產(chǎn)生一新的socket,綁定到另一端口,由此socket來處理和客戶端的交互,服務(wù)器繼續(xù)偵聽原socket來接受其他客戶端的連
34、接請求;4 .連接成功后客戶端也產(chǎn)生一socket,并通過它來與服務(wù)器端通訊(注意客戶端socket并不與特定端口綁定)。5 .接下來,服務(wù)器端和客戶端就通過讀取和寫入各自的socket來進行通訊。2.4 基于CSocket網(wǎng)絡(luò)編程CSocket是MFC在CAsyncSocket基礎(chǔ)上派生的一個同步阻塞Socket的封裝類。它是如何即把CAsyncSocket變成同步的,同時又能響應(yīng)同樣的Socket事件呢? 其實很簡單,CSocket在Connect()返回WSAEWOULDBLOCK錯誤時,不是在OnConnect(),OnReceive()這些事件終端函數(shù)里去等待。這些事件處理函數(shù)是CS
35、ocketWnd窗口對象回調(diào)的,而窗口對象收到來自Socket的事件,又是靠線程消息隊列分發(fā)過來的。所以,Socket事件首先是作為一個消息發(fā)給CSocketWnd窗口對象,這個消息肯定需要經(jīng)過線程消息隊列的分發(fā),最終CSocketWnd窗口對象收到這些消息就調(diào)用相應(yīng)的回調(diào)函數(shù)(OnConnect()等)。一個CSocket對象代表了一個比CAsyncSocket對象更高層次的Windows Socket的抽象,CSocket類與CSocketFile類和CArchive類一起工作來發(fā)送和接收數(shù)據(jù),因此使用它更加容易使用。CSocket對象提供阻塞模式,因為阻塞功 能對于CArchive的同步
36、操作是至關(guān)重要的。在這里有必要對阻塞的概念作一解釋: 一個socket可以處于阻塞模式或非阻塞模式,當一個套接字處于阻塞模式(即同步操作)時,它的阻塞函數(shù)直到操作完成才會返回控制權(quán),之所以稱為阻塞是因為此套接字的阻塞函數(shù)在完成操作返回之前什么也不能做。如果一個socket處于非阻塞模式(即異步操作),則會被調(diào)用函數(shù)立即返回。在CAsyncSocket類中可以用GetLastError 成員函數(shù)查詢最后的錯誤,如果錯誤是WSAEWOULDBLOCK則說明有阻塞,而CSocket絕不會返回WSAEWOULDBLOCK,因為它自己管理阻塞。微軟建議盡量使用非阻塞模式,通過網(wǎng)絡(luò)事件的發(fā)生而通知應(yīng)用程序
37、進行相應(yīng)的處理。但在CSocket類中,為了利用CArchive 處理通訊中的許多問題和簡化編程,它的一些成員函數(shù)總是具有阻塞性質(zhì)的,這是因為CArchive類需要同步的操作3。3 程序總體分析3.1 程序運行過程游戲核心網(wǎng)絡(luò)游戲界面把程序分為3部分。第一部分是界面;第二部分是游戲內(nèi)核,用來計算是否可以出牌,由誰出牌,比較所出牌的大小,游戲是否結(jié)束等;第三部分是網(wǎng)絡(luò)部分。圖3-1 游戲交互圖在網(wǎng)絡(luò)部分,主機和客戶機的區(qū)別是參數(shù)bool m_Isserver,參數(shù)bool m_ready3用來記錄3個玩家是否準備就緒。Bool m_ready3這個參數(shù)中有在服務(wù)器上才有存在的意義,因為只有服務(wù)器
38、才能開始游戲。服務(wù)器的玩家是0號,依次加入的分別為1號和2號。 在游戲核心Manager中,Card PlayCards320記錄的是3個玩家的牌,會不斷地更新。CardOutCards20記錄的是已經(jīng)出掉的牌,一次最多出20張牌。Int OutPlayer表示走牌的玩家的號數(shù),服務(wù)器是0號,后面加入的依次是1號,2號玩家。3.2 Managers核心算法流程DoMsg(int num,int action)準備過牌/出牌/單擊牌/放棄地主/接受地主退出游戲用戶操作 點擊則改變Click屬性 Game_state=-1時選地主改變PlayMain,改變誰是地主PlayCardsxy.Click
39、 點牌則改 -1Game_state紅桃-梅花-方塊的順序擺放,每種花色都可以采用升序或者降序排列;而另一種方法就是把牌擺放成一個矩陣,而牌的排列順序由數(shù)據(jù)結(jié)構(gòu)中的紙牌類Card來決定。下面是Card類函數(shù)聲明:Class CardPublic;Card; Virtual Card(); int Num;/牌面數(shù)目 2-10 J=11,Q=12,K=13,A=1,Jok(?。?14,Jok(大)=15,大于15表示此牌不存在; int Pow;/牌的實際大??; int Type;/牌的類型,用0代表黑桃、1代表紅桃、2代表梅花、3代表方塊; Bool Click;/牌是否被選中,選中時true
40、,否則為false;從上面的函數(shù)聲明中看出,一張牌的大小、花色是由Num和Type決定(而大小王只需要Num),同時再按照Num和Type對應(yīng)的數(shù)字進行整理,就可以把54張牌集中起來。因為函數(shù)中定義的參數(shù)不多,而且也比較簡單,所以采用按順序排列的方式進行,而不是用矩陣的方式來排列。圖片加載后,再來看看如何讀取鼠標指針的坐標,對位置進行大致確定。而要完成位置的確定就需要確定鼠標位置的坐標,所以引入(point.x,point.y)來確定鼠標的坐標。而這又需要在CprogramView類中添加一個WM_MOUSEMOVE響應(yīng)。void CProgramView:OnMouseMove(UNIT n
41、Flags,CPoint point) /TODO:Add your message handler code here and/or call default/跟蹤光標坐標int mx=point.x;int my=point.y;CString st;CDC *pDc=GetDc();St.Format(”%d,%d”,point.x,point.y);pDc-TextOut(400,5,st);ReleaseDc(pDc);CView:OnMouseMove(nFlags,point);4.2 BUTTON控件實現(xiàn)利用CButton的初始化函數(shù)來創(chuàng)建Button:BOOL Create(
42、LPCTSTR lpszCaption,DWORD dwStyle,const RECT &rect,CWND*pParentWnd,UNIT nId)添加相關(guān)的消息響應(yīng)函數(shù):在游戲界面中需要有確定、取消、出牌、過牌四個按鈕來完成選地主、過牌等動作。BUTTON按鈕的創(chuàng)建只需要在旁邊的工具箱中進行簡單的拖曳就可以了。所以在程序里用BUTTON控件來制作按鈕,然后把按鈕和函數(shù)進行關(guān)聯(lián)就實現(xiàn)了上述四個不同的動作。下面分析四個按鈕具體代碼:確定按鈕:void CProgramView:OnOK() if(manager.Game_State!=-2)return;/判斷是否為主機if(!pContr
43、ol-m_Isseverse) pControl-SendGetReady();/如果不是主機則發(fā)送“準備的消息”else pControl-m_ready1=true;/如果是主機則準備完畢/如果三個玩家都準備完畢后if(pControl-m_ready0&pControl-m_ready1&pControl-m_ready2) pControl-m_ready0=false; pControl-m_ready1=false; pControl-m_ready2=false; manager.GameStart();/游戲開始 pControl-StartCards();/發(fā)牌CDC *pD
44、C=GetDC();ReleaseDC(pDC);取消按鈕:void CProgramView:OnCancel() Exit(0);/退出程序發(fā)牌按鈕:void CProgramView:OnSendCard() if(manager.DoMsg(15,4)/如果DoMsg為TRUE,則需要發(fā)生改變 PrintAll();/重繪 pControl-SendCards(manager.OutCards,4);/將玩家出牌信息發(fā)給其它玩家過牌按鈕void CProgramView:OnPass() if(manager.DoMsg(16,3)/如果DoMsg為TRUE,則需發(fā)生改變 PrintA
45、ll();/重繪 pControl-SendCards(NULL,3);/將玩家出的牌發(fā)送給其它玩家,此時發(fā)送的是空信息LBUTTONDOWN事件響應(yīng):if(mx=100&my=440&mx=455&my=575) CDC *pDC=GetDC(); for(i=0;manager.PlayCardsmanager.PlayAci.Num=15;i+);/判斷玩家手中還有多少牌 if(mx=100+(i-1)*15+71&my=100&my=440) i=SelectNum(i,mx,my);/判斷點中的是第幾張牌 if(manager.DoMsg(i,1)/判斷點中這張牌后是否需要改變 Pr
46、intAll(); ReleaseDC(pDC);對SelectNum函數(shù)做簡單解釋:SelectNum(int num,int mx,int my)三個變量分別表示當前玩家手中所剩牌的數(shù)量,光標的橫坐標,光標縱坐標。4.3 程序相關(guān)繪圖在繪制牌的時候可能遇到如下情況:1.在還沒發(fā)牌的時候,牌全部集中在中間。2.畫作為底牌的三張牌(當在叫地主的時候,牌只顯示背面;當確定地主后,作為底牌的三張牌將顯示給所有玩家)。3.畫出已被打出的牌。4.畫出當前玩家手中未出的牌。5.畫出從當前玩家視角看到的其它玩家所剩牌的數(shù)量。1.在還沒發(fā)牌的時候,牌全部集中在中間:void CProgramView:Car
47、dReady() CDC *pDC=GetDC(); for(int i=0;iBitBlt(300+i*2,220,72,97,&Mcard,142,384,SRCCOPY);/截取的是牌的背面ReleaseDC(pDC);2.畫剩下的三張底牌:void CProgramView:DrawLeft() CDC *pDC=GetDC(); int i;if(manager.Game_State=-1)/當還在選地主的時候for(i=0;iBitBlt(300+i*40,25,72,97,&Mcard,142,384,SRCCOPY);/畫的是牌的背面else if(manager.Game_S
48、tate=0&manager.Game_State=5)/當確定地主后 for(i=0;i3;i+) if(manager.Sendlefti.NumBitBlt(300+i*40,25,71,96,&Mcard,(maneger.Sendlefti.Num-1)*71,manager.Sendlefti.Type*96,SRCCOPY); else if(manager.SendLefti.NumBitBlt(300+i*40,25,71,96,&mCard,(manager.SendLefti.Num-14)*71,384,SRCCOPY);ReleaseDC(pDC);3.畫出已出的牌:
49、因程序比較長,所以只做思想介紹。用K來控制畫的類型,當K=0表示為左邊出牌,K=1時為當前玩家出牌,K=2時為右邊出牌,K=3時全部已出的牌都重畫。4.畫出當前玩家手中還沒出的牌:程序需要遍歷一遍當前玩家手中還沒出的牌,當牌被點起后,需要向上突起,用if(manager.PlayCardsmanager.PlayerAci.Click來實現(xiàn)上面被選中牌的效果。5.畫出從當前玩家視角看到的其它玩家手中剩的牌:for(i=0;i20&cardlefti.NumBitBlt(55,55+i*10,97,75,&Mcard,214,408,SRCCOPY);for(i=0;i20&cardrighti
50、.NumBitBlt(630,55+i*10,97,75,&Mcard,214,408,SRCCOPY);在發(fā)牌前把牌全部集中在中間是為了讓界面更加清晰,以免的發(fā)牌的時候因為玩家面前有牌,又有未發(fā)完的牌而產(chǎn)生發(fā)牌動作的不連續(xù)。在發(fā)牌結(jié)束后將未發(fā)的牌存放在Sendleft中以便于在選地主結(jié)束后能把剩下的三張牌直接發(fā)給地主。畫玩家手中未出的牌要遍歷所有手中未出的牌然后排序,是為了保持玩家手中牌排序的美觀。而遍歷和每隔一段時間更新數(shù)據(jù)在實際的編程中也經(jīng)常使用,比如進程守護中的兩個程序,要不停的遍歷進程運行表來獲得對方程序的運行狀態(tài)。4.4 動畫制作程序一共有3個地方需要發(fā)牌:1.3個玩家都點擊了準備
51、,主機發(fā)牌并在主機播放發(fā)牌動畫;2.客戶機收到發(fā)牌信息,在客戶機播放發(fā)牌動畫;3.最后一名玩家點擊確定后播放發(fā)牌動畫。發(fā)牌效果用Windows本身的定時器(Timer)和常用的游戲循環(huán)來實現(xiàn)。void CProgramView:OnTimer(UNIT nIDEvent) CDC *pDC=GetDC(); Static int i(1); int j; static int x,y; x=300+54*2,y=220;在程序中設(shè)置間隔為20ms、ID為1的定時器。制作這個定時器的目的是為了保證發(fā)牌動作的完整,連續(xù),不會在發(fā)牌的間隔停留不一樣的時間。靜態(tài)變量i用來記錄當前牌的步數(shù),設(shè)定為10步
52、,即一張牌需要經(jīng)過10步發(fā)到自己的位置。這樣做的目的是為了保證所發(fā)的牌不會胡亂排放在玩家面前,而使牌按一定的順序排列。j是一個循環(huán)控制變量。x和y用來記錄當前牌起飛的左上角的坐標,根據(jù)x和y的值可以計算出每一幀牌左上角的坐標。在發(fā)牌的時候要設(shè)定一個timer值。這個值的作用是保證每位玩家的牌不超過17張(在三張底牌揭開前)。timer值每加1便發(fā)一次牌,由于一副撲克牌總共有54張,而底牌有3張,所以每位玩家在發(fā)底牌前牌的張數(shù)不能超過17,所以設(shè)定timerBitBlt(0,0,800,600,&Background,0,0,SRCCOPY); if(manager.Game_State=-2)
53、 CardReady(); DrawLeft();DrawCardOut(3);DrawMyCard();DrawOtherCard();PrintState();/按鈕重繪m_ok.Invalidate(true);m_pass.Invalidate(true);m_cancel.Invalidate(true);m_sendcard.Invalidate(true);ReleaseDC(pDC);5算法實現(xiàn)5.1 游戲開始假設(shè)所有人都已經(jīng)點擊準備按鈕,服務(wù)器會運行GameStart()來初始化游戲,然后把游戲信息發(fā)送到每臺客戶機。void Managers:GameStart()int i
54、; if(MainComputer) Power=10; OutCards0.Num=16; PlayerMaininfo=0; SendCard(); for(i=0;i3;i+) SortCard(PlayCardsi); PlayerMain=rand()%3; Game_State=-1;游戲初始化后進入發(fā)牌階段,那么如何實現(xiàn)所發(fā)的牌是隨機的?這里用一個SendCard來實現(xiàn)隨機發(fā)牌。void Managers:SendCard() int i,j,k; bool Cards55=false; /對應(yīng)54張撲克,其中Cards54做初始化用,必須為true /其中051為4個113,5
55、2是小王,53是大王 Cards54=true; for(i=0;i3;i+)/每個人17張牌,每次發(fā)一張 for(i=0;i3;i+) Card &Ca=PlayCardsij; k=54; while(Cardsk) k=rand()%54;從053中隨機得到一個數(shù),如果這數(shù)已經(jīng)用過則產(chǎn)生新的隨機數(shù);如果沒有就把這個數(shù)對應(yīng)的牌發(fā)給PlayCardsij。用if(k=53|k=52)來判斷發(fā)的牌是不是王,如果不是則用Ca.Num=k%13+1來判斷得到牌的大小,用Ca.Type=k/13來判斷得到的牌是什么牌型。發(fā)完牌以后將剩下的三張牌存放在Sendleft中,等選出地主后把這三張牌發(fā)給地主
56、。等牌全部發(fā)完后,要整理玩家手中的牌序。那么如何來實現(xiàn)理牌這一操作呢?這里用SortCard(PlayCardsi)這函數(shù)來實現(xiàn)。void Managers:SortCard(Card ca) int i,j; Card temp; for(i=0;i20&caj.Num=15;i+) for(j=i+1;j20&caj.Numcaj.Pow) Temp=cai; Cai=caj; Caj=temp;牌發(fā)好了,那么如何來選地主呢?在區(qū)分是出牌還是接受地主、放棄地主、或者放棄出牌需要依靠Game_State,當GameStart()運行之后Game_State=-1,表示正在選地主;而在游戲中,
57、Game_State一直保持在03之間。選擇完地主后把原來剩下的3張牌發(fā)給地主,然后Game_State變成相應(yīng)的數(shù)字讓地主出牌。5.2 游戲進行牌發(fā)好了如何來比較是否能出牌呢?用函數(shù)CardsInfo來判斷。void Managers:CardsInfo(Card ca,int &num,int &min,int &type) int i,k,n; int same10=0; int nsame10=0;same用來記錄相同牌的pow;nsame用來記錄相同牌的數(shù)量;i記錄有多少種大小不同的牌;n記錄牌的數(shù)量。將n分為n=5、5n2、nm_pList.GetCount()DrawPlayna
58、me()來繪出玩家名字。在得到加入玩家的名字后,客戶機向主機發(fā)送已準備的消息,用SendGetReady()函數(shù)來概括準備信息。void NetControl:SendGetReady()char tem20;sprint(tem,”1818%c%c%c”,99,99,manager.PlayerAc);SendMsg(m_pSocket,tem);從上面的程序中看出,在”1818”后是兩個”99”,同樣不屬于Game_State+100和Action+100的范圍,表示它們不是游戲中的數(shù)據(jù)。這樣表示某個玩家已準備好,準備好的玩家是manager.PlayerAc。5.3.5 CSocket
59、的不足1.雖然CSocket解決了結(jié)束阻塞線程的方法,調(diào)用CancelBlockingCall,但是它并不適合多線程模式 。2.CSocket和CAsyncSocket利用Windows的消息模式將前臺的界面處理和后臺的網(wǎng)絡(luò)通信都整合到消息傳遞模型 但是,一旦后臺的網(wǎng)絡(luò)過于繁忙,則前臺的處理可能就無法顧及。6 系統(tǒng)測試和功能評價6.1 系統(tǒng)測試軟件測試就是在軟件交付用戶使用或投入運行前,對軟件需求規(guī)格說明、設(shè)計規(guī)格說明和編碼的最終復(fù)審,是軟件質(zhì)量保證的關(guān)鍵步驟。軟件測試是為了發(fā)現(xiàn)錯誤而執(zhí)行程序的過程。軟件測試在軟件生命周期中橫跨兩個階段:通常在編寫出每一個模塊之后就需要對它做必要的測試(稱為單
60、元測試)。編碼和單元測試屬于軟件生命周期中的同一個階段。在結(jié)束這個階段后對軟件系統(tǒng)還要進行各種綜合測試,如集成測試、系統(tǒng)測試、性能測試和配置測試等,這是軟件生命周期的另一個獨立階段,即測試階段。 1.軟件測試的目的: (1) 測試的最終目的是為了避免錯誤的發(fā)生,確保應(yīng)用程序能夠正常高效的運行;(2) 好的測試用例在于發(fā)現(xiàn)至今未發(fā)現(xiàn)的錯誤; (3) 成功的測試是發(fā)現(xiàn)了至今未發(fā)現(xiàn)的錯誤的測試; (4) 好的測試工程師應(yīng)該做到不僅發(fā)現(xiàn)問題,還能夠幫助開發(fā)人員分析問題; 2.軟件測試的原則:(1)應(yīng)把“盡早和不斷地進行軟件測試”作為軟件開發(fā)者的座右銘,實踐證明單元測試能夠盡早發(fā)現(xiàn)問題,減少后期測試的錯
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度企業(yè)員工股權(quán)代持與解綁服務(wù)合同
- 教師調(diào)動申請書理由
- 碳化硅材料項目評估報告范文模板
- 電車動力的教育價值與創(chuàng)新策略研究
- 項目-年產(chǎn)5000套注塑模具生產(chǎn)項目節(jié)能評估報告(節(jié)能專)
- 2025年度新媒體運營臨時工勞動合同細則
- 環(huán)境藝術(shù)設(shè)計與城市規(guī)劃的協(xié)同發(fā)展研究
- 2025年度事業(yè)單位與教育機構(gòu)合作聘用合同
- 2025年度借調(diào)合同范本:企業(yè)借調(diào)管理人員
- 河北省某能源裝備產(chǎn)業(yè)基地一期工程項目可行性研究報告
- 水土保持方案中沉沙池的布設(shè)技術(shù)
- 安全生產(chǎn)技術(shù)規(guī)范 第25部分:城鎮(zhèn)天然氣經(jīng)營企業(yè)DB50-T 867.25-2021
- 現(xiàn)代企業(yè)管理 (全套完整課件)
- 走進本土項目化設(shè)計-讀《PBL項目化學(xué)習(xí)設(shè)計》有感
- 《網(wǎng)店運營與管理》整本書電子教案全套教學(xué)教案
- 教師信息技術(shù)能力提升培訓(xùn)課件希沃的課件
- 高端公寓住宅項目營銷策劃方案(項目定位 發(fā)展建議)
- 執(zhí)業(yè)獸醫(yī)師聘用協(xié)議(合同)書
- 第1本書出體旅程journeys out of the body精教版2003版
- [英語考試]同等學(xué)力英語新大綱全部詞匯
- 2022年肝動脈化療栓塞術(shù)(TACE)
評論
0/150
提交評論