五子棋游戲(網(wǎng)絡(luò)版)的設(shè)計與開發(fā)

 

五子棋游戲(網(wǎng)絡(luò)版)的設(shè)計與開發(fā)

摘要

網(wǎng)絡(luò)游戲的出現(xiàn)代表了一種全新娛樂方式的誕生。目前網(wǎng)絡(luò)游戲正以其獨特的魅力吸引著眾多的玩家。隨著游戲產(chǎn)業(yè)的蓬勃發(fā)展,將需要越來越多的人加入到游戲開發(fā)中來。

本畢業(yè)設(shè)計所完成的五子棋游戲(網(wǎng)絡(luò)版)是在WindowsXP下使用MicrosoftVisualC++6.0開發(fā)的C/S系統(tǒng),可以實現(xiàn)網(wǎng)絡(luò)間的雙人對戰(zhàn),并且可以提供多媒體播放功能。系統(tǒng)的多媒體播放功能可以播放MP3、WMA等主流格式的音樂。

本論文從基本網(wǎng)絡(luò)套節(jié)字開始入手,介紹了一些本系統(tǒng)相關(guān)的理論知識,隨后詳細介紹了五子棋游戲(網(wǎng)絡(luò)版)的開發(fā)過程。包括服務(wù)器端、客戶端的socket編程,五子棋服務(wù)器和客戶端通信的實現(xiàn),五子棋判斷算法的實現(xiàn),主界面視圖,多媒體播放以及定時器等附加功能的實現(xiàn)。最后對系統(tǒng)進行測試并對所做工作進行總結(jié)。

關(guān)鍵詞:網(wǎng)絡(luò)游戲;五子棋;VC;WinSocket;MCI

TheDesignandDevelopmentoftheon-lineBlack&WhiteGameAbstract

On-linegamesbringtoanewformofentertainment.Untilnow,on-linegamesischarmingmoreandmoreplayers.Asthedevelopmentofgameindustry,therewillbemoreandmoredevelopersjoininthegamedevelopmentteam.

Theon-lineBlack&WhitegamewasdevelopedbyMicrosoftVisualC++6.0onWindowsXPplatform.Inthisgame,twopeoplecanplaythegameonline,andthegamealsoprovidesmultimediaplayerfunction.

Thethesisstartwithintroductionofnetworksocketprogramming,thedevelopmentprocessingoftheon-lineBlack&Whitegameareintroducedindetailasfollowed.Thethesishaveafulltouchonserverandclientsocketprogramming,thecommunicationbetweenserverandclientwasimplemented,thealgorithmofthefive-in-a-rowgame,themultimediaplaybackfunctions.

Keywords:On-linegames;Black&Whitegame;VC;WinSocket;MCI

1錄論文總頁數(shù):27頁引言.........................1

1.1

1.2網(wǎng)絡(luò)游戲背景.......................................................1五子棋游戲現(xiàn)狀及研究意義..............................1

2游戲開發(fā)環(huán)境介紹...........................................................1

2.1

2.2

2.3

2.4

2.5環(huán)境介紹...............................................................1VisualC++6.0介紹............................................1OSI模型介紹........................................................2TCP/IP模型介紹..................................................2Winsock技術(shù)........................................................3

2.5.1

2.5.2

2.5.3

2.5.4Winsock編程流程簡介...........................3CAsyncSocket類介紹.............................4CSocket類介紹........................................5多媒體MCI接口介紹..............................6

3五子棋游戲(網(wǎng)絡(luò)版)研究方法...................................7

3.1

3.2五子棋游戲(網(wǎng)絡(luò)版)需求分析......................7五子棋游戲(網(wǎng)絡(luò)版)研究思路......................8

4五子棋游戲(網(wǎng)絡(luò)版)設(shè)計...........................................9

4.1

4.2五子棋游戲(網(wǎng)絡(luò)版)流程..............................9五子棋游戲(網(wǎng)絡(luò)版)功能設(shè)計方案..............9

4.2.1

4.2.2

4.3主要類介紹...............................................9主要類的工作示意圖............................10五子棋游戲?qū)崿F(xiàn).................................................10

4.3.1

4.3.2

4.3.3

4.3.4

4.3.5

4.3.6

4.3.7游戲連接——CServerSocket類的實現(xiàn).......................................................10游戲連接——CClientSocket類的實現(xiàn).......................................................12網(wǎng)絡(luò)信息——CMessg類的實現(xiàn)...........14下棋算法——Match類的實現(xiàn).............14主界面——CFiveChessView類的實現(xiàn).........................................................16多媒體——CSoundThread類的實現(xiàn).............................................................22定時器的實現(xiàn).........................................23

5游戲測試.........................................................................24

5.1

5.2五子棋下棋功能測試.........................................24音樂播放測試.....................................................24

5.3

結(jié)定時器以及其他響應(yīng)測試...........................................................................................25論...........................................................................................................................................25

參考文獻...........................................................................................................................................25致

聲謝...........................................................................................................錯誤!未定義書簽。明...........................................................................................................錯誤!未定義書簽。

1引言

1.1網(wǎng)絡(luò)游戲背景

中國民族原創(chuàng)網(wǎng)絡(luò)游戲為中國網(wǎng)絡(luò)游戲產(chǎn)業(yè)所做出了巨大貢獻,民族原創(chuàng)網(wǎng)絡(luò)游戲已經(jīng)成為產(chǎn)業(yè)發(fā)展的主導(dǎo)力量。同樣在中國自主研發(fā)的民族原創(chuàng)網(wǎng)絡(luò)游戲已經(jīng)真正成為中國游戲市場的主導(dǎo)力量。

網(wǎng)絡(luò)游戲是通過信息網(wǎng)絡(luò)傳播和實現(xiàn)的互動娛樂形式,是一種網(wǎng)絡(luò)與文化相結(jié)合的產(chǎn)業(yè)。近年來,網(wǎng)絡(luò)文化市場發(fā)展很快,隨著互聯(lián)網(wǎng)的迅速普及、寬帶的接入社區(qū)和家庭,我國網(wǎng)絡(luò)游戲市場發(fā)展迅速并進入了一個高速增長期,并已經(jīng)創(chuàng)造了較大的產(chǎn)值,帶動了相關(guān)產(chǎn)業(yè)的發(fā)展,對促進我國網(wǎng)絡(luò)經(jīng)濟和娛樂業(yè)的發(fā)展、豐富互聯(lián)網(wǎng)時代人民群眾的文化娛樂生活起到了積極作用。

1.2五子棋游戲現(xiàn)狀及研究意義

如今網(wǎng)絡(luò)上的提供免費五子棋游戲,大多數(shù)是單機版的,界面單一,功能單

一。本系統(tǒng)將實現(xiàn)在網(wǎng)絡(luò)上對戰(zhàn)的五子棋功能;同時還整合多媒體功能;還對在下棋界面美化,以及下棋中可能出現(xiàn)的意外進行了處理。這樣五子棋休閑游戲?qū)⒉辉谑且粋功能單一界面枯燥的無聲游戲,而是一個較完善的休閑游戲。2游戲開發(fā)環(huán)境介紹

2.1環(huán)境介紹

操作系統(tǒng):MicrosoftWindowsXP

程序語言:C++

開發(fā)工具:VisualC++6.0

2.2VisualC++6.0介紹

VisualC++6.0自誕生以來,一直是Windows環(huán)境下最主要的應(yīng)用開發(fā)系統(tǒng)之一。VisualC++不僅是C++語言的集成開發(fā)環(huán)境,而且與Win32緊密相連,所以,利用VisualC++可以完成各種各樣的應(yīng)用程序的開發(fā),從底層軟件直到上層直接面向用戶的軟件。而且,VisualC++強大的調(diào)試功能的為大型復(fù)雜軟件的開發(fā)提供了有效的排錯手段。

進入90年代以來,隨著多媒體技術(shù)和圖形圖像技術(shù)的不斷發(fā)展,可視化(Visual)技術(shù)得到廣泛的重視,越來越多計算機專業(yè)人員和非專業(yè)人員都開始研究并應(yīng)用可視化技術(shù)。所謂可視化技術(shù),一般是指軟件開發(fā)階段的可視化和計算機圖形技術(shù)和方法的應(yīng)用?梢暬幊叹褪擒浖_發(fā)階段的可視化。VisualC++6.0是一個很好的可視化編程工具,使用VisualC++6.0環(huán)境來開發(fā)Windows應(yīng)用程序大大縮短了開發(fā)時間,而且它的界面更友好,便于程序員操作。

開發(fā)環(huán)境是程序員同VisualC++的交互界面,通過它程序員可以訪問C++源代碼編輯器、資源編輯器,使用內(nèi)部調(diào)試器,并且可以創(chuàng)建工程文件。

第1頁共27頁

五子棋游戲(網(wǎng)絡(luò)版)的設(shè)計與開發(fā).doc下載

2.3OSI模型介紹

OSI是OpenSystemInterconnect的縮寫,意為開放式系統(tǒng)互聯(lián)。國際標(biāo)準(zhǔn)組織(國際標(biāo)準(zhǔn)化組織)制定了OSI模型。這個模型把網(wǎng)絡(luò)通信的工作分為7層,分別是物理層,數(shù)據(jù)鏈路層,網(wǎng)絡(luò)層,傳輸層,會話層,表示層和應(yīng)用層。1至4層被認為是低層,這些層與數(shù)據(jù)移動密切相關(guān)。5至7層是高層,包含應(yīng)用程序級的數(shù)據(jù)。每一層負責(zé)一項具體的工作,然后把數(shù)據(jù)傳送到下一層。

如圖

五子棋游戲(網(wǎng)絡(luò)版)的設(shè)計與開發(fā)

1-1:

圖1-1OSI模型圖

2.4TCP/IP模型介紹

TCP/IP是TransmissionControlProtocol/InternetProtocol(傳輸控制協(xié)議/互聯(lián)網(wǎng)協(xié)議)的縮寫。TCP/IP協(xié)議使用范圍極廣,許多廠商的計算機操作系統(tǒng)和網(wǎng)絡(luò)操作系統(tǒng)產(chǎn)品都采用或含有TCP/IP協(xié)議。TCP/IP協(xié)議已成為目前事實上的國際標(biāo)準(zhǔn)和工業(yè)標(biāo)準(zhǔn)。

TCP/IP也是一個分層的網(wǎng)絡(luò)協(xié)議,不過它與OSI模型所分的層次有所不同。TCP/IP從底至頂分為鏈路層、網(wǎng)絡(luò)層、傳輸層、應(yīng)用層等4個層次。TCP/IP的分層情況如圖1-2

五子棋游戲(網(wǎng)絡(luò)版)的設(shè)計與開發(fā)

所示。

圖1-2TCP/IP模型圖

第2頁共27頁

2.5Winsock技術(shù)

Winsock編程流程簡介2.5.1

下面介紹一下Win32平臺的Winsock編程方法。通訊則必須有服務(wù)器端和客戶端。簡單介紹tcp服務(wù)器端的大體流程。

intWSAStarup(WORDwVersionRequested,LPWSADATAlpWsAData)SOCKETsocket(intaf,inttype,intprotocol);

當(dāng)調(diào)用了socket()接口函數(shù)創(chuàng)建了一個套接字后,必須把套接字與需要進行通訊的地址建立聯(lián)系。

intbind(SOCKETs,conststructsockaddrFAR*name,intnamelen);structsockaddr_in

{

short

u_short

structin_addr

char

}

就包含了需要建立連接的本地的地址,包括地址族,ip和端口信息;WinsockAPI提供了幾個函數(shù),把主機字節(jié)轉(zhuǎn)化成網(wǎng)絡(luò)字節(jié)的函數(shù);

u_longhtonl(u_longhostlong);

u_shorthtons(u_shorthostshort);

把網(wǎng)絡(luò)字節(jié)轉(zhuǎn)化成主機字節(jié)的函數(shù);

u_longntohl(u_longnetlong);

u_shortntohs(u_shortnetshort);

當(dāng)綁定完成之后,服務(wù)器端必須建立一個監(jiān)聽的隊列來接收客戶端的連接請求。

intlisten(SOCKETs,intbacklog);

如果客戶端有了連接請求,還必須使用intaccept(SOCKETs,structsockaddrFAR*addr,intFAR*addrlen)來接受客戶端的請求。

現(xiàn)在基本上已經(jīng)完成了一個服務(wù)器的建立,而客戶端的建立的流程則是初始化WinSock,然后創(chuàng)建socket套接字,再使用intconnect(SOCKETs,conststructsockaddrFAR*name,intnamelen)來連接服務(wù)端。

當(dāng)服務(wù)器端和客戶端建立連接以后,無論是客戶端,還是服務(wù)器端都可以使用:

intsend(SOCKETs,constcharFAR*buf,intlen,intflags);sin_family;sin_prot;sin_addr;sin_sero[8];

第3頁共27頁

intrecv(SOCKETs,charFAR*buf,intlen,intflags);

函數(shù)來接收和發(fā)送數(shù)據(jù),因為,TCP連接是雙向的。

當(dāng)要關(guān)閉通訊連結(jié)的時候,任何一方都可以調(diào)用intshutdown(SOCKETs,inthow)來關(guān)閉套接字的指定功能。再調(diào)用intclosesocket(SOCKETs)來關(guān)閉套接字句柄。這樣一個通訊過程就算完成了。

2.5.2CAsyncSocket類介紹

微軟的MFC把復(fù)雜的WinSockAPI函數(shù)封裝到類里,這使得編寫網(wǎng)絡(luò)應(yīng)用程序更容易。CAsyncSocket類逐個封裝了WinSockAPI,為高級網(wǎng)絡(luò)程序員提供了更加有力而靈活的方法。這個類基于程序員了解網(wǎng)絡(luò)通訊的假設(shè),目的是為了在MFC中使用WinSock,程序員有責(zé)任處理諸如阻塞、字節(jié)順序和在Unicode與MBCS間轉(zhuǎn)換字符的任務(wù)。

CAsyncSocket類編程模型

在一個MFC應(yīng)用程序中,要想輕松處理多個網(wǎng)絡(luò)協(xié)議,而又不犧牲靈活性時,可以考慮使用CAsyncSocket類,它的效率比CSocket類要高。CAsyncSocket類針對字節(jié)流型套接字的編程模型簡述如下:

1、構(gòu)造一個CAsyncSocket對象,并用這個對象的Create成員函數(shù)產(chǎn)生一個Socket句柄。可以按如下兩種方法構(gòu)造:

CAsyncSocketsock;//使用默認參數(shù)產(chǎn)生一個字節(jié)流套接字

Sock.Create();

或在指定端口號產(chǎn)生一個數(shù)據(jù)報套接字

CAsyncSocket*pSocket=newCAsyncSocket;

intnPort=27;

pSocket->Create(nPort,SOCK-DGRAM);

第一種方法在棧上產(chǎn)生一個CAsyncSocket對象,而第二種方法在堆上產(chǎn)生CAsyncSocket對象;第一種方法中Create()成員函數(shù)用缺省參數(shù)產(chǎn)生一個字節(jié)流套接字,第二種方法中用Create()成員函數(shù)在指定的端口產(chǎn)生一個數(shù)字報套接字。Create()函數(shù)的原型為:

BOOLCreate(UINTnSocketPort=0,intnSocketType=SOCK_STREAM,LPCTSTRlpszSocketAddress=NULL);

該函數(shù)的參數(shù)有:

1)端口,UINT類型。注意:如果是服務(wù)方,則使用一個眾所周知的端口供服務(wù)方連接;如果是客戶方,典型做法是接受默認參數(shù),使套接字可以自主選擇一個可用端口。

2)socket類型,可以是SOCK-STREAM(默認值,字節(jié)流)或SOCK-DGRAM

第4頁共27頁

(數(shù)據(jù)報)。

3)socket的地址,例如"ftp.gliet.edu.cn"或"202.193.64.33"。

2、如是客戶方程序,用CAsyncSocket∷Connect()成員函數(shù)連接到服務(wù)方;如是服務(wù)方程序,用CAsyncSocket∷Listen()成員函數(shù)開始監(jiān)聽,一旦收到連接請求,則調(diào)用CAsyncSocket∷Accept()成員函數(shù)開始接收。注意:CAsyncSocket∷Accept()成員函數(shù)要用一個新的并且是空的CAsyncSocket對象作為它的參數(shù),這里所說的"空的"指的是這個新對象還沒有調(diào)用Create()成員函數(shù)。

3、調(diào)用其他的CAsyncSocket類的Receive()、ReceiveFrom()、Send()和SendTo()等成員函數(shù)進行數(shù)據(jù)通信。

4、通訊結(jié)束后,銷毀CAsyncSocket對象。如果是在棧上產(chǎn)生的CAsyncSocket對象,則對象超出定義的范圍時自動被析構(gòu);如果是在堆上產(chǎn)生,也就是用了new這個操作符,則必須使用delete操作符銷毀CAsyncSocket對象。

2.5.3CSocket類介紹

為了給程序員提供更方便的接口以自動處理這些任務(wù),MFC給出了CSocket類,這個類是由CAsyncSocket類繼承下來的,它提供了比CAsyncSocket更高層的WinSockAPI接口。Csocket類和CsocketFile類可以與Carchive類一起合作來管理發(fā)送和接收的數(shù)據(jù),這使管理數(shù)據(jù)收發(fā)更加便利。CSocket對象提供阻塞模式,這對于Carchive的同步操作是至關(guān)重要的。阻塞函數(shù)(如Receive()、Send()、ReceiveFrom()、SendTo()和Accept())直到操作完成后才返回控制權(quán),因此如果需要低層控制和高效率,就使用CasyncSock類;如果需要方便,則可使用Csocket類。

一個CSocket對象代表了一個比CAsyncSocket對象更高層次的WindowsSocket的抽象,CSocket類與CSocketFile類和CArchive類一起工作來發(fā)送和接收數(shù)據(jù),因此使用它更加容易使用。CSocket對象提供阻塞模式,因為阻塞功能對于CArchive的同步操作是至關(guān)重要的。在這里有必要對阻塞的概念作一解釋:一個socket可以處于“阻塞模式”或“非阻塞模式”,當(dāng)一個套接字處于阻塞模式(即同步操作)時,它的阻塞函數(shù)直到操作完成才會返回控制權(quán),之所以稱為阻塞是因為此套接字的阻塞函數(shù)在完成操作返回之前什么也不能做。如果一個socket處于非阻塞模式(即異步操作),則會被調(diào)用函數(shù)立即返回。在CAsyncSocket類中可以用GetLastError成員函數(shù)查詢最后的錯誤,如果錯誤是WSAEWOULDBLOCK則說明有阻塞,而CSocket絕不會返回WSAEWOULDBLOCK,因為它自己管理阻塞。但在CSocket類中,為了利用CArchive處理通訊中的許多問題和簡化編程,它的一些成員函數(shù)總是具有阻塞性質(zhì)的,這是因為CArchive類

第5頁共27頁

需要同步的操作。

CSocket類編程模型

使用CSocket對象涉及CArchive和CSocketFile類對象。以下介紹的針對字節(jié)流型套接字的操作步驟中,只有第3步對于客戶方和服務(wù)方操作是不同的,其他步驟都相同。

1、構(gòu)造一個CSocket對象。

2、使用這個對象的Create()成員函數(shù)產(chǎn)生一個socket對象。在客戶方程序中,除非需要數(shù)據(jù)報套接字,Create()函數(shù)一般情況下應(yīng)該使用默認參數(shù)。而對于服務(wù)方程序,必須在調(diào)用Create時指定一個端口。需要注意的是,Carchive類對象不能與數(shù)據(jù)報(UDP)套接字一起工作,因此對于數(shù)據(jù)報套接字,CAsyncSocket和CSocket的使用方法是一樣的。

3、如果是客戶方套接字,則調(diào)用CAsyncSocket∷Connect()函數(shù)與服務(wù)方套接字連接;如果是服務(wù)方套接字,則調(diào)用CAsyncSocket∷Listen()開始監(jiān)聽來自客戶方的連接請求,收到連接請求后,調(diào)用CAsyncSocket∷Accept()函數(shù)接受請求,建立連接。請注意Accept()成員函數(shù)需要一個新的并且為空的CSocket對象作為它的參數(shù),解釋同上。

4、產(chǎn)生一個CSocketFile對象,并把它與CSocket對象關(guān)聯(lián)起來。

5、為接收和發(fā)送數(shù)據(jù)各產(chǎn)生一個CArchive對象,把它們與CSocketFile對象關(guān)聯(lián)起來。切記CArchive是不能和數(shù)據(jù)報套接字一起工作的。

6、使用CArchive對象的Read()、Write()等函數(shù)在客戶與服務(wù)方傳送數(shù)據(jù)。

7、通訊完畢后,銷毀CArchive、CSocketFile和CSocket對象

2.5.4多媒體MCI接口介紹

多媒體控制接口MCI是MicroSoftWindows定義的多媒體接口標(biāo)準(zhǔn)。MCI向Windows提供高層次的,獨立于設(shè)備的,控制各種多媒體設(shè)備的命令。MCI可以在C語言中直接調(diào)用函數(shù)庫。

對MCI的訪問可以通過兩種方式:一種是使用消息命令接口函數(shù);另一種是使用字符串接口函數(shù)。它們的不同之處在于有著不用的命令結(jié)構(gòu)和發(fā)送消息到多媒體設(shè)備的不同原理。但是任何一種方式都可以達到同樣的效果。

基于字符串多媒體控制接口的編程方式,通過向設(shè)備發(fā)送字符串實現(xiàn)對多媒體設(shè)備的控制。這種方式主要有兩個函數(shù)MciSendString和MciGetErrorString。

基于消息命令接口函數(shù)的編程方式,也就是游戲設(shè)計中采用的方式。一條基于消息的MCI命令包括四部分:MCI設(shè)備標(biāo)記、控制消息參數(shù)、消息標(biāo)記、消息數(shù)據(jù)結(jié)構(gòu)指針。這種方式有三個核心函數(shù)MciSendCommand、MciGetDeviceID、

第6頁共27頁

MciGetErrorString。

就MCI的使用五子棋游戲中,使用基于消息命令接口函數(shù)的編程方式,MCI編程具體實現(xiàn)如下:

//音樂文件選擇對話框

CStringstrFileName;

CStringsFilter="MP3文件(*.mp3)|*.mp3|Wav文件(*.wav)|*.wav|WMA文件(*.wma)|*.wma||";

CFileDialogfile(TRUE,"","",OFN_FILEMUSTEXIST,(LPCTSTR)sFilter);

if(file.DoModal()==IDOK)//打開對話框

{

strFileName=file.GetPathName();//變量取得文件路徑

}

mciOpen.lpstrElementName=

strFileName.GetBuffer(strFileName.GetLength());//傳遞給MCI標(biāo)準(zhǔn)控件文件路

mciSendCommand(NULL,MCI_OPEN,MCI_OPEN_ELEMENT,(DWORD)(LPVOID)&mciOpen);//打開文件

m_wDeviceID=mciOpen.wDeviceID;//取得播放設(shè)備

mciSendCommand(m_wDeviceID,MCI_PLAY,0,(DWORD)(LPVOID)&mciPlay);//播放音樂

mciSendCommand(m_wDeviceID,MCI_STOP,0,NULL);//停止播放音樂

3五子棋游戲(網(wǎng)絡(luò)版)研究方法

3.1

?五子棋游戲(網(wǎng)絡(luò)版)需求分析五子棋游戲基本功能

該功能為程序設(shè)計的最基本的功能,程序有服務(wù)器端和客戶端。當(dāng)服務(wù)器端運行時會自動偵察是否有客戶端運行,并自動接入開始游戲。當(dāng)用戶五子連成一線時即贏。

?音樂播放

現(xiàn)在游戲中已經(jīng)很難找到是無聲游戲的,多媒體就成了一個游戲不可缺少的一部分。該功能是多媒體播放功能,在用戶游戲時候能隨意播放自己喜歡的音樂。聲音是提高游戲娛樂性中不可缺少的一環(huán)。

?擴展功能

在游戲中當(dāng)下棋位置不對或者還沒有輪到本機下棋能提示用戶相應(yīng)信息。當(dāng)游戲中用戶長時間沒有下棋會提示用戶該下棋,當(dāng)對方長時間沒有下棋會提示用

第7頁共27頁

第11 / 29頁

戶是否繼續(xù)。

設(shè)想如下圖

五子棋游戲(網(wǎng)絡(luò)版)的設(shè)計與開發(fā)

3-1:

圖3-1五子棋設(shè)想圖

3.2五子棋游戲(網(wǎng)絡(luò)版)研究思路

本畢業(yè)設(shè)計是利用VC6.0這一集成開發(fā)工具,在Windows環(huán)境下開發(fā)一款休閑網(wǎng)絡(luò)游戲。本畢業(yè)設(shè)計通過策劃、實現(xiàn)、測試等游戲開發(fā)的一般流程。游戲設(shè)計是按如下功能模塊的設(shè)計思路來安排的:

?

據(jù)。

客戶端模塊:負責(zé)連接到服務(wù)器并處理和服務(wù)器的會話。

游戲規(guī)則模塊:負責(zé)游戲的控制和結(jié)果的判斷,使游戲按規(guī)則進行。

視圖控制模塊:負責(zé)控制整個程序的操作,負責(zé)處理用戶的輸入和游戲的界面繪制。

?多媒體功能設(shè)計模塊:

音頻播放模塊:負責(zé)播放MP3,WMA等格式的音樂。

效果如圖3-2:五子棋游戲設(shè)計可以分成如下幾個模塊:服務(wù)器模塊:負責(zé)建立游戲服務(wù)器并接受客戶端的連接和處理客戶端的數(shù)

第8頁共27頁

圖3-2五子棋游戲(網(wǎng)絡(luò)版)效果圖

4五子棋游戲(網(wǎng)絡(luò)版)設(shè)計

4.1

五子棋游戲(網(wǎng)絡(luò)版)的設(shè)計與開發(fā)

五子棋游戲(網(wǎng)絡(luò)版)流程

圖4-1五子棋游戲(網(wǎng)絡(luò)版)流程圖

4.2

4.2.1五子棋游戲(網(wǎng)絡(luò)版)功能設(shè)計方案主要類介紹

CServerSocket類:是一個專門用來監(jiān)聽客戶端連接的Socket類。當(dāng)游戲運行,選擇了開啟服務(wù)器之后,即調(diào)用本類來初始一個Socket對象。這個Socket對象將負責(zé)監(jiān)聽網(wǎng)絡(luò)上有沒有客戶端連接到來。

CClientSocket類:是一個專門用做會話類,它負責(zé)數(shù)據(jù)的發(fā)送和接受。當(dāng)游戲運行,選擇了連接服務(wù)器之后,即調(diào)用本類來初始一個Socket對象。這個

第9頁共27

五子棋游戲(網(wǎng)絡(luò)版)的設(shè)計與開發(fā)

對象是用來連接服務(wù)器,它連接上以后,就可以通過他進行數(shù)據(jù)的交換。

CMessg類:是一個數(shù)據(jù)類,它發(fā)揮串行化數(shù)據(jù)的作用。它就是用來在網(wǎng)絡(luò)上傳輸?shù)男畔ⅰ?/p>

Match類:是一個規(guī)則類,它負責(zé)游戲規(guī)則的處理。在游戲運行中,它保存著一個二維數(shù)組記錄當(dāng)前棋盤的信息,它還負責(zé)判斷能否在某個位置下棋,是否有人贏棋。

CFiveChessView類:是游戲的主視圖類。在游戲中它負責(zé)在主窗口中繪制盤和棋子。以及鼠標(biāo)消息的處理。

CClientDlg類:是游戲中客戶端設(shè)置的對話框類。在游戲中,選擇打開連接服務(wù)器時,彈出來的連接服務(wù)器對話框。

CServerDlg類:是游戲中服務(wù)器端設(shè)置的對話框類。在游戲中,選擇打開開啟服務(wù)器時,彈出的開啟服務(wù)器對話框。

CSoundThread類:是游戲中負責(zé)多媒體播放的線程類,主要負責(zé)音樂播放。當(dāng)然了它實現(xiàn)了播放和關(guān)閉,也就是線程的開啟和終止。

4.2.2

五子棋游戲(網(wǎng)絡(luò)版)的設(shè)計與開發(fā)

主要類的工作示意圖

圖4-2主要類工作示意圖

4.3五子棋游戲?qū)崿F(xiàn)

游戲連接——CServerSocket類的實現(xiàn)4.3.1

這是一個專門用來監(jiān)聽客戶端連接的Socket類,它繼承于CSocket,響應(yīng)OnAccept消息。所需要的參數(shù)從對話框中取得,如圖4-3:

第10頁共27頁

圖4-3服務(wù)器端設(shè)置圖

CServerSocket類需要聲明一個主視圖指針,為接受連接函數(shù)服務(wù)。并且在類成員函數(shù)Init(UINTport,CFiveChessView*dlg)中負責(zé)監(jiān)聽SOCKET和創(chuàng)建SOCKET。當(dāng)用戶選擇“開啟服務(wù)器”功能時,程序就會工作在服務(wù)器端模式,并且不停的監(jiān)聽是否有客戶端的連接。當(dāng)有監(jiān)聽客戶端的連接消息時,OnAccept函數(shù)響應(yīng)。

BOOLCServerSocket::Init(UINTport,CFiveChessView*view)

{m_uPort=port;

m_view=view;

if(Create(m_uPort)==FALSE)//創(chuàng)建SOCKET

{AfxMessageBox("ServerSocketCreateError");

returnFALSE;

}

if(this->Listen()==FALSE)//監(jiān)聽SOCKET

{

AfxMessageBox("ServerListenError");

returnFALSE;

}

returnTRUE;

}

voidCServerSocket::OnAccept(intnErrorCode)//授受客戶端請求

第11頁共27

五子棋游戲(網(wǎng)絡(luò)版)的設(shè)計與開發(fā)

第15 / 29頁

{

CSocket::OnAccept(nErrorCode);

m_view->ProcessPendingAccept();//調(diào)用視圖類中連接處理函數(shù)

}

4.3.2游戲連接——CClientSocket類的實現(xiàn)

這是一個專門用做會話類,它負責(zé)數(shù)據(jù)的發(fā)送和接受。她繼承于CSocket,負責(zé)響應(yīng)OnReceive和OnClose消息。另外,作為CSocket類的繼承類,當(dāng)然采用了串行化方式來處理網(wǎng)絡(luò)數(shù)據(jù)。網(wǎng)絡(luò)數(shù)據(jù)由CMessg對象構(gòu)成。連接服務(wù)器所需參數(shù)通過對話框獲得,如圖

五子棋游戲(網(wǎng)絡(luò)版)的設(shè)計與開發(fā)

4-4:

圖4-4客戶端設(shè)置圖

CClientSocket類中需要數(shù)據(jù)串行化網(wǎng)絡(luò)數(shù)據(jù)。類初始化成員Init函數(shù)負責(zé)Socket和串行化相關(guān)的初始化;成員函數(shù)GetIpAddress用于獲得本地IP;成員函數(shù)GetLocalHostName用于獲得本地計算機名稱;當(dāng)連接上服務(wù)器以后,使用SendMessage(CMessg*msg)發(fā)送消息,或者使用OnReceive(intnErrorCode)接收對方發(fā)送過來的數(shù)據(jù),并對數(shù)據(jù)進行處理。當(dāng)關(guān)閉客戶端Socket是使用成員函數(shù)CloseSocket關(guān)閉。

voidCClientSocket::OnReceive(intnErrorCode)

{

CSocket::OnReceive(nErrorCode);

do

{

CMessgtemp;

第12頁共27頁

temp.Serialize(*m_aSessionIn);//輸入數(shù)據(jù)串行化

//判斷對方發(fā)送過來的數(shù)據(jù)是否是落子的位置

if(m_view->m_match.CanDown(temp.m_x,temp.m_y,m_view->m_who%2+1))

{//是對方落子的信息

m_view->m_turn=temp.m_turn;//輪到我下

m_view->Invalidate(FALSE);//刷新視圖,顯示對方的走子位置

if(m_view->m_match.IsWin(m_view->m_who%2+1,m_view->m_winpos))

{

m_view->m_bWin=TRUE;//對方贏

m_view->m_bOver=TRUE;

m_view->Invalidate(FALSE);

AfxMessageBox("SORRY,你輸了");

}

}

}

while(!m_aSessionIn->IsBufferEmpty());

}

BOOLCClientSocket::SendMessage(CMessg*msg)

{

if(m_aSessionOut!=NULL)

{

msg->Serialize(*m_aSessionOut);//輸出串行化

m_aSessionOut->Flush();//直接發(fā)送

returnTRUE;

}

else

{

//對方關(guān)閉了連接

m_bClose=true;

CloseSocket();

returnFALSE;

}

}

第13頁共27頁

4.3.3網(wǎng)絡(luò)信息——CMessg類的實現(xiàn)

這是一個數(shù)據(jù)類,繼承于CObject.它主要負責(zé)串行化數(shù)據(jù)的作用。CMessg類主要的成員變量:

int

int

intm_turn;m_x;m_y;

其中m_turn表示輪到誰走棋;m_x表示落子的水平位置;m_y表示落子的豎直位置。這3個數(shù)據(jù)就是網(wǎng)絡(luò)要傳的數(shù)據(jù)。

其中數(shù)據(jù)串行化實現(xiàn)如下:

voidCMessg::Serialize(CArchive&ar)

{

if(ar.IsStoring())

{

ar<<m_turn;

ar<<m_x;

ar<<m_y;

}

else

{

ar>>m_turn;

ar>>m_x;

ar>>m_y;

}

}

4.3.4下棋算法——Match類的實現(xiàn)

這是一個規(guī)則類,它負責(zé)規(guī)則的處理。在Match中保存著一個當(dāng)前的棋盤,用的一個chessboard[LW][LW]。如果數(shù)組元素為0,則表示沒有棋子;如果為1,則表示有黑子,如果為2,則為白子。Match負責(zé)是否能下子,是否有人贏棋。

Match中類LW定為19,表示有19行19列。既然Match中保存著一個當(dāng)前棋盤,那就需要有一個判斷的成員函數(shù),只有chessboard為0時才能落子,類中使用成員函數(shù)CanDown(intx,inty,intwho)判斷能否落子。并且有一個判斷是否贏的成員函數(shù)IsWin(intwho,intpos[5][2]);其中pos[5][2]為記錄贏的關(guān)鍵棋子。最后還有一個清除棋盤也就是把所有的chessboard全部設(shè)置為0的函數(shù)Clear。算法執(zhí)行出來的結(jié)果,如圖4-5:

第14頁共27頁

圖4-5贏棋圖

五子棋的核心算法IsWin主要是判斷了水平、垂直、東南、東北四個方向是否有五子相連;它們判定條件可以表示為;

水平:

chessboard[i][j+1]==who&&chessboard[i][j+2]==who&&chessboard[i][j+3]==who&&chessboard[i][j+4]==who

垂直:

chessboard[i+1][j]==who&&chessboard[i+2][j]==who&&chessboard[i+3][j]==who&&chessboard[i+4][j]==who

東南:

chessboard[i+1][j+1]==who&&chessboard[i+2][j+2]==who&&chessboard[i+3][j+3]==who&&chessboard[i+4][j+4]==who

東北:

chessboard[i-1][j+1]==who&&chessboard[i-2][j+2]==who&&chessboard[i-3][j+3]==who&&chessboard[i-4][j+4]==who

作為說明,以水平方向判定為例子;

BOOLMatch::IsWin(intwho,intpos[5][2])

{inti,j;

for(i=0;i<LW;i++)

for(j=0;j<LW;j++)

{

if(chessboard[i][j]==who)

{

第15頁共27

五子棋游戲(網(wǎng)絡(luò)版)的設(shè)計與開發(fā)

if(j+4<LW)//水平

{

if(chessboard[i][j+1]==who&&chessboard[i][j+2]==who&&chessboard[i][j+3]==who&&chessboard[i][j+4]==who)

{

for(intk=0;k<5;k++)

{

pos[k][0]=i;

pos[k][1]=j+k;

}

returnTRUE;

}

}

//垂直,像水平方向那樣添加條件即可

//東南,像水平方向那樣添加條件即可

//東北,像水平方向那樣添加條件即可

}

}

returnfalse;

}

4.3.5主界面——CFiveChessView類的實現(xiàn)

CFiveChessView是程序的主視圖類。CFiveChessView類也是本程序中相當(dāng)重要的一個類。它實現(xiàn)了棋盤、棋子的繪制之外,程序界面的美化,還有鼠標(biāo)消息的處理等。顯示主界面,如圖4-6:

第16頁共27頁

圖4-6主界面圖

首先游戲初始化當(dāng)然包括Winsock的初始化,獲得本機的IP地址,以及相關(guān)的狀態(tài)變量的初始化。其中狀態(tài)變量包括m_bIsClient表示是否客戶端、m_bIsInit表示是否已經(jīng)初試化、m_bWinm_bOver表示是否結(jié)束、m_turn表示輪到誰走棋等。這是因為初始只需要調(diào)用一次。

開始游戲時有作為客戶端運行的“連接服務(wù)器”或者作為服務(wù)器端“開啟服務(wù)器”兩個選項。

?當(dāng)選擇作為服務(wù)器端“開啟服務(wù)器”時,游戲創(chuàng)建一個CServerDlg類對話框,并由對話框獲得輸入的端口號信息,由于在游戲初始化時Winsock已經(jīng)初始化。這里直接調(diào)用CServerSocket類創(chuàng)建一個socket監(jiān)聽端口。程序功能實現(xiàn)如下:

voidCFiveChessView::OnSetserver()

{

CServerDlgdlg;

//服務(wù)器端口設(shè)置對話框

if(dlg.DoModal()==IDOK)

{

m_bIsClient=FALSE;//作為服務(wù)器

m_bIsInit=TRUE;//已經(jīng)初試化

m_port=dlg.m_iPort;//得到輸入端口號

m_ListenSocket.Init(m_port,this);//開始監(jiān)聽端口

}

第17頁共27

五子棋游戲(網(wǎng)絡(luò)版)的設(shè)計與開發(fā)

}

服務(wù)器端當(dāng)監(jiān)聽到有客戶端需要連接時,有成員函數(shù)ProcessPendingAccept接受客戶端的連接處理。ProcessPendingAccept函數(shù)實現(xiàn)如下:

voidCFiveChessView::ProcessPendingAccept()

{

if(m_ListenSocket.Accept(m_ClientSocket)==FALSE)//分配一個會話SOCKET

{

AfxMessageBox("ServerListenSocketError");

return;

}

else

{

m_who=1;//服務(wù)器端用黑子

m_ClientSocket.Init(this);//初試化會話SOCKET

AfxMessageBox("嘿嘿,有人進來挑戰(zhàn)了");

}

}

?當(dāng)選擇作為客戶端“連接服務(wù)器”時,游戲創(chuàng)建一個CClientDlg類對話框,并由對話框獲得輸入的IP信息、端口號信息,由ClientSocket.Create()創(chuàng)建會話socket,并連接服務(wù)器。游戲設(shè)計中具體響應(yīng)函數(shù)OnSetclient如下:

voidCFiveChessView::OnSetclient()

{

//TODO:Addyourcommandhandlercodehere

CClientDlgdlg;

intret=dlg.DoModal();//設(shè)置服務(wù)器IP和端口

if(ret==2000)//用戶確定

{

m_bIsClient=TRUE;//作為客戶端

m_bIsInit=TRUE;

m_port=dlg.m_iPort;//得到用戶輸入的端口號

for(inti=0;i<4;i++)//得到輸入的服務(wù)器IP地址

m_bIP[i]=dlg.m_bIP[i];

m_ip.Format("%d.%d.%d.%d",dlg.m_bIP[0],dlg.m_bIP[1],dlg.m_bIP[2],dlg.m_bIP[3]);

m_ClientSocket.Create();//創(chuàng)建會話SOCKET

第18頁共27頁

久久建筑網(wǎng)i5h4u.cn提供大量:建筑圖紙、施工方案、工程書籍、建筑論文、合同表格、標(biāo)準(zhǔn)規(guī)范、CAD圖紙等內(nèi)容。


TOP最近更新內(nèi)容

    語言學(xué)概論筆記 郭碩鴻 電動力學(xué) 富士康科技公司基礎(chǔ)IE培訓(xùn)--現(xiàn)場改善.ppt PS技術(shù) 在學(xué)校里 學(xué)三年 也學(xué)不到這么多x 德隆的資本運作與行業(yè)整合 梁凱恩 ——《福布斯導(dǎo)師商學(xué)院》精華 DLT 1080.4-2010 電力企業(yè)應(yīng)用集成 配電管 南京理工大學(xué)考研計算機復(fù)試上機題目 2013 3月二級c無紙化題庫 系統(tǒng)防雷方案 山東省威海市2011屆高三模擬考試(數(shù)學(xué)文) 刑法的二十個鉆石考點 【阮齊林】 ANSYS工程結(jié)構(gòu)數(shù)值分析命令查詢表 建筑裝飾裝修工程施工質(zhì)量驗收規(guī)范(GB5021 宋鴻兵語錄