千萬建筑資料下載 →
五子棋游戲(網絡版)的設計與開發(fā)
摘要
網絡游戲的出現(xiàn)代表了一種全新娛樂方式的誕生。目前網絡游戲正以其獨特的魅力吸引著眾多的玩家。隨著游戲產業(yè)的蓬勃發(fā)展,將需要越來越多的人加入到游戲開發(fā)中來。
本畢業(yè)設計所完成的五子棋游戲(網絡版)是在WindowsXP下使用MicrosoftVisualC++6.0開發(fā)的C/S系統(tǒng),可以實現(xiàn)網絡間的雙人對戰(zhàn),并且可以提供多媒體播放功能。系統(tǒng)的多媒體播放功能可以播放MP3、WMA等主流格式的音樂。
本論文從基本網絡套節(jié)字開始入手,介紹了一些本系統(tǒng)相關的理論知識,隨后詳細介紹了五子棋游戲(網絡版)的開發(fā)過程。包括服務器端、客戶端的socket編程,五子棋服務器和客戶端通信的實現(xiàn),五子棋判斷算法的實現(xiàn),主界面視圖,多媒體播放以及定時器等附加功能的實現(xiàn)。最后對系統(tǒng)進行測試并對所做工作進行總結。
關鍵詞:網絡游戲;五子棋;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網絡游戲背景.......................................................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技術........................................................3
2.5.1
2.5.2
2.5.3
2.5.4Winsock編程流程簡介...........................3CAsyncSocket類介紹.............................4CSocket類介紹........................................5多媒體MCI接口介紹..............................6
3五子棋游戲(網絡版)研究方法...................................7
3.1
3.2五子棋游戲(網絡版)需求分析......................7五子棋游戲(網絡版)研究思路......................8
4五子棋游戲(網絡版)設計...........................................9
4.1
4.2五子棋游戲(網絡版)流程..............................9五子棋游戲(網絡版)功能設計方案..............9
4.2.1
4.2.2
4.3主要類介紹...............................................9主要類的工作示意圖............................10五子棋游戲實現(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網絡信息——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
結定時器以及其他響應測試...........................................................................................25論...........................................................................................................................................25
參考文獻...........................................................................................................................................25致
聲謝...........................................................................................................錯誤!未定義書簽。明...........................................................................................................錯誤!未定義書簽。
1引言
1.1網絡游戲背景
中國民族原創(chuàng)網絡游戲為中國網絡游戲產業(yè)所做出了巨大貢獻,民族原創(chuàng)網絡游戲已經成為產業(yè)發(fā)展的主導力量。同樣在中國自主研發(fā)的民族原創(chuàng)網絡游戲已經真正成為中國游戲市場的主導力量。
網絡游戲是通過信息網絡傳播和實現(xiàn)的互動娛樂形式,是一種網絡與文化相結合的產業(yè)。近年來,網絡文化市場發(fā)展很快,隨著互聯(lián)網的迅速普及、寬帶的接入社區(qū)和家庭,我國網絡游戲市場發(fā)展迅速并進入了一個高速增長期,并已經創(chuàng)造了較大的產值,帶動了相關產業(yè)的發(fā)展,對促進我國網絡經濟和娛樂業(yè)的發(fā)展、豐富互聯(lián)網時代人民群眾的文化娛樂生活起到了積極作用。
1.2五子棋游戲現(xiàn)狀及研究意義
如今網絡上的提供免費五子棋游戲,大多數(shù)是單機版的,界面單一,功能單
一。本系統(tǒng)將實現(xiàn)在網絡上對戰(zhàn)的五子棋功能;同時還整合多媒體功能;還對在下棋界面美化,以及下棋中可能出現(xiàn)的意外進行了處理。這樣五子棋休閑游戲將不在是一個功能單一界面枯燥的無聲游戲,而是一個較完善的休閑游戲。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)境下最主要的應用開發(fā)系統(tǒng)之一。VisualC++不僅是C++語言的集成開發(fā)環(huán)境,而且與Win32緊密相連,所以,利用VisualC++可以完成各種各樣的應用程序的開發(fā),從底層軟件直到上層直接面向用戶的軟件。而且,VisualC++強大的調試功能的為大型復雜軟件的開發(fā)提供了有效的排錯手段。
進入90年代以來,隨著多媒體技術和圖形圖像技術的不斷發(fā)展,可視化(Visual)技術得到廣泛的重視,越來越多計算機專業(yè)人員和非專業(yè)人員都開始研究并應用可視化技術。所謂可視化技術,一般是指軟件開發(fā)階段的可視化和計算機圖形技術和方法的應用。可視化編程就是軟件開發(fā)階段的可視化。VisualC++6.0是一個很好的可視化編程工具,使用VisualC++6.0環(huán)境來開發(fā)Windows應用程序大大縮短了開發(fā)時間,而且它的界面更友好,便于程序員操作。
開發(fā)環(huán)境是程序員同VisualC++的交互界面,通過它程序員可以訪問C++源代碼編輯器、資源編輯器,使用內部調試器,并且可以創(chuàng)建工程文件。
第1頁共27頁
五子棋游戲(網絡版)的設計與開發(fā).doc下載2.3OSI模型介紹
OSI是OpenSystemInterconnect的縮寫,意為開放式系統(tǒng)互聯(lián)。國際標準組織(國際標準化組織)制定了OSI模型。這個模型把網絡通信的工作分為7層,分別是物理層,數(shù)據(jù)鏈路層,網絡層,傳輸層,會話層,表示層和應用層。1至4層被認為是低層,這些層與數(shù)據(jù)移動密切相關。5至7層是高層,包含應用程序級的數(shù)據(jù)。每一層負責一項具體的工作,然后把數(shù)據(jù)傳送到下一層。
如圖
1-1:
圖1-1OSI模型圖
2.4TCP/IP模型介紹
TCP/IP是TransmissionControlProtocol/InternetProtocol(傳輸控制協(xié)議/互聯(lián)網協(xié)議)的縮寫。TCP/IP協(xié)議使用范圍極廣,許多廠商的計算機操作系統(tǒng)和網絡操作系統(tǒng)產品都采用或含有TCP/IP協(xié)議。TCP/IP協(xié)議已成為目前事實上的國際標準和工業(yè)標準。
TCP/IP也是一個分層的網絡協(xié)議,不過它與OSI模型所分的層次有所不同。TCP/IP從底至頂分為鏈路層、網絡層、傳輸層、應用層等4個層次。TCP/IP的分層情況如圖1-2
所示。
圖1-2TCP/IP模型圖
第2頁共27頁
2.5Winsock技術
Winsock編程流程簡介2.5.1
下面介紹一下Win32平臺的Winsock編程方法。通訊則必須有服務器端和客戶端。簡單介紹tcp服務器端的大體流程。
intWSAStarup(WORDwVersionRequested,LPWSADATAlpWsAData)SOCKETsocket(intaf,inttype,intprotocol);
當調用了socket()接口函數(shù)創(chuàng)建了一個套接字后,必須把套接字與需要進行通訊的地址建立聯(lián)系。
intbind(SOCKETs,conststructsockaddrFAR*name,intnamelen);structsockaddr_in
{
short
u_short
structin_addr
char
}
就包含了需要建立連接的本地的地址,包括地址族,ip和端口信息;WinsockAPI提供了幾個函數(shù),把主機字節(jié)轉化成網絡字節(jié)的函數(shù);
u_longhtonl(u_longhostlong);
u_shorthtons(u_shorthostshort);
把網絡字節(jié)轉化成主機字節(jié)的函數(shù);
u_longntohl(u_longnetlong);
u_shortntohs(u_shortnetshort);
當綁定完成之后,服務器端必須建立一個監(jiān)聽的隊列來接收客戶端的連接請求。
intlisten(SOCKETs,intbacklog);
如果客戶端有了連接請求,還必須使用intaccept(SOCKETs,structsockaddrFAR*addr,intFAR*addrlen)來接受客戶端的請求。
現(xiàn)在基本上已經完成了一個服務器的建立,而客戶端的建立的流程則是初始化WinSock,然后創(chuàng)建socket套接字,再使用intconnect(SOCKETs,conststructsockaddrFAR*name,intnamelen)來連接服務端。
當服務器端和客戶端建立連接以后,無論是客戶端,還是服務器端都可以使用:
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連接是雙向的。
當要關閉通訊連結的時候,任何一方都可以調用intshutdown(SOCKETs,inthow)來關閉套接字的指定功能。再調用intclosesocket(SOCKETs)來關閉套接字句柄。這樣一個通訊過程就算完成了。
2.5.2CAsyncSocket類介紹
微軟的MFC把復雜的WinSockAPI函數(shù)封裝到類里,這使得編寫網絡應用程序更容易。CAsyncSocket類逐個封裝了WinSockAPI,為高級網絡程序員提供了更加有力而靈活的方法。這個類基于程序員了解網絡通訊的假設,目的是為了在MFC中使用WinSock,程序員有責任處理諸如阻塞、字節(jié)順序和在Unicode與MBCS間轉換字符的任務。
CAsyncSocket類編程模型
在一個MFC應用程序中,要想輕松處理多個網絡協(xié)議,而又不犧牲靈活性時,可以考慮使用CAsyncSocket類,它的效率比CSocket類要高。CAsyncSocket類針對字節(jié)流型套接字的編程模型簡述如下:
1、構造一個CAsyncSocket對象,并用這個對象的Create成員函數(shù)產生一個Socket句柄?梢园慈缦聝煞N方法構造:
CAsyncSocketsock;//使用默認參數(shù)產生一個字節(jié)流套接字
Sock.Create();
或在指定端口號產生一個數(shù)據(jù)報套接字
CAsyncSocket*pSocket=newCAsyncSocket;
intnPort=27;
pSocket->Create(nPort,SOCK-DGRAM);
第一種方法在棧上產生一個CAsyncSocket對象,而第二種方法在堆上產生CAsyncSocket對象;第一種方法中Create()成員函數(shù)用缺省參數(shù)產生一個字節(jié)流套接字,第二種方法中用Create()成員函數(shù)在指定的端口產生一個數(shù)字報套接字。Create()函數(shù)的原型為:
BOOLCreate(UINTnSocketPort=0,intnSocketType=SOCK_STREAM,LPCTSTRlpszSocketAddress=NULL);
該函數(shù)的參數(shù)有:
1)端口,UINT類型。注意:如果是服務方,則使用一個眾所周知的端口供服務方連接;如果是客戶方,典型做法是接受默認參數(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ù)連接到服務方;如是服務方程序,用CAsyncSocket∷Listen()成員函數(shù)開始監(jiān)聽,一旦收到連接請求,則調用CAsyncSocket∷Accept()成員函數(shù)開始接收。注意:CAsyncSocket∷Accept()成員函數(shù)要用一個新的并且是空的CAsyncSocket對象作為它的參數(shù),這里所說的"空的"指的是這個新對象還沒有調用Create()成員函數(shù)。
3、調用其他的CAsyncSocket類的Receive()、ReceiveFrom()、Send()和SendTo()等成員函數(shù)進行數(shù)據(jù)通信。
4、通訊結束后,銷毀CAsyncSocket對象。如果是在棧上產生的CAsyncSocket對象,則對象超出定義的范圍時自動被析構;如果是在堆上產生,也就是用了new這個操作符,則必須使用delete操作符銷毀CAsyncSocket對象。
2.5.3CSocket類介紹
為了給程序員提供更方便的接口以自動處理這些任務,MFC給出了CSocket類,這個類是由CAsyncSocket類繼承下來的,它提供了比CAsyncSocket更高層的WinSockAPI接口。Csocket類和CsocketFile類可以與Carchive類一起合作來管理發(fā)送和接收的數(shù)據(jù),這使管理數(shù)據(jù)收發(fā)更加便利。CSocket對象提供阻塞模式,這對于Carchive的同步操作是至關重要的。阻塞函數(shù)(如Receive()、Send()、ReceiveFrom()、SendTo()和Accept())直到操作完成后才返回控制權,因此如果需要低層控制和高效率,就使用CasyncSock類;如果需要方便,則可使用Csocket類。
一個CSocket對象代表了一個比CAsyncSocket對象更高層次的WindowsSocket的抽象,CSocket類與CSocketFile類和CArchive類一起工作來發(fā)送和接收數(shù)據(jù),因此使用它更加容易使用。CSocket對象提供阻塞模式,因為阻塞功能對于CArchive的同步操作是至關重要的。在這里有必要對阻塞的概念作一解釋:一個socket可以處于“阻塞模式”或“非阻塞模式”,當一個套接字處于阻塞模式(即同步操作)時,它的阻塞函數(shù)直到操作完成才會返回控制權,之所以稱為阻塞是因為此套接字的阻塞函數(shù)在完成操作返回之前什么也不能做。如果一個socket處于非阻塞模式(即異步操作),則會被調用函數(shù)立即返回。在CAsyncSocket類中可以用GetLastError成員函數(shù)查詢最后的錯誤,如果錯誤是WSAEWOULDBLOCK則說明有阻塞,而CSocket絕不會返回WSAEWOULDBLOCK,因為它自己管理阻塞。但在CSocket類中,為了利用CArchive處理通訊中的許多問題和簡化編程,它的一些成員函數(shù)總是具有阻塞性質的,這是因為CArchive類
第5頁共27頁
需要同步的操作。
CSocket類編程模型
使用CSocket對象涉及CArchive和CSocketFile類對象。以下介紹的針對字節(jié)流型套接字的操作步驟中,只有第3步對于客戶方和服務方操作是不同的,其他步驟都相同。
1、構造一個CSocket對象。
2、使用這個對象的Create()成員函數(shù)產生一個socket對象。在客戶方程序中,除非需要數(shù)據(jù)報套接字,Create()函數(shù)一般情況下應該使用默認參數(shù)。而對于服務方程序,必須在調用Create時指定一個端口。需要注意的是,Carchive類對象不能與數(shù)據(jù)報(UDP)套接字一起工作,因此對于數(shù)據(jù)報套接字,CAsyncSocket和CSocket的使用方法是一樣的。
3、如果是客戶方套接字,則調用CAsyncSocket∷Connect()函數(shù)與服務方套接字連接;如果是服務方套接字,則調用CAsyncSocket∷Listen()開始監(jiān)聽來自客戶方的連接請求,收到連接請求后,調用CAsyncSocket∷Accept()函數(shù)接受請求,建立連接。請注意Accept()成員函數(shù)需要一個新的并且為空的CSocket對象作為它的參數(shù),解釋同上。
4、產生一個CSocketFile對象,并把它與CSocket對象關聯(lián)起來。
5、為接收和發(fā)送數(shù)據(jù)各產生一個CArchive對象,把它們與CSocketFile對象關聯(lián)起來。切記CArchive是不能和數(shù)據(jù)報套接字一起工作的。
6、使用CArchive對象的Read()、Write()等函數(shù)在客戶與服務方傳送數(shù)據(jù)。
7、通訊完畢后,銷毀CArchive、CSocketFile和CSocket對象
2.5.4多媒體MCI接口介紹
多媒體控制接口MCI是MicroSoftWindows定義的多媒體接口標準。MCI向Windows提供高層次的,獨立于設備的,控制各種多媒體設備的命令。MCI可以在C語言中直接調用函數(shù)庫。
對MCI的訪問可以通過兩種方式:一種是使用消息命令接口函數(shù);另一種是使用字符串接口函數(shù)。它們的不同之處在于有著不用的命令結構和發(fā)送消息到多媒體設備的不同原理。但是任何一種方式都可以達到同樣的效果。
基于字符串多媒體控制接口的編程方式,通過向設備發(fā)送字符串實現(xiàn)對多媒體設備的控制。這種方式主要有兩個函數(shù)MciSendString和MciGetErrorString。
基于消息命令接口函數(shù)的編程方式,也就是游戲設計中采用的方式。一條基于消息的MCI命令包括四部分:MCI設備標記、控制消息參數(shù)、消息標記、消息數(shù)據(jù)結構指針。這種方式有三個核心函數(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標準控件文件路
徑
mciSendCommand(NULL,MCI_OPEN,MCI_OPEN_ELEMENT,(DWORD)(LPVOID)&mciOpen);//打開文件
m_wDeviceID=mciOpen.wDeviceID;//取得播放設備
mciSendCommand(m_wDeviceID,MCI_PLAY,0,(DWORD)(LPVOID)&mciPlay);//播放音樂
mciSendCommand(m_wDeviceID,MCI_STOP,0,NULL);//停止播放音樂
3五子棋游戲(網絡版)研究方法
3.1
?五子棋游戲(網絡版)需求分析五子棋游戲基本功能
該功能為程序設計的最基本的功能,程序有服務器端和客戶端。當服務器端運行時會自動偵察是否有客戶端運行,并自動接入開始游戲。當用戶五子連成一線時即贏。
?音樂播放
現(xiàn)在游戲中已經很難找到是無聲游戲的,多媒體就成了一個游戲不可缺少的一部分。該功能是多媒體播放功能,在用戶游戲時候能隨意播放自己喜歡的音樂。聲音是提高游戲娛樂性中不可缺少的一環(huán)。
?擴展功能
在游戲中當下棋位置不對或者還沒有輪到本機下棋能提示用戶相應信息。當游戲中用戶長時間沒有下棋會提示用戶該下棋,當對方長時間沒有下棋會提示用
第7頁共27頁
第11 / 29頁
戶是否繼續(xù)。
設想如下圖
3-1:
圖3-1五子棋設想圖
3.2五子棋游戲(網絡版)研究思路
本畢業(yè)設計是利用VC6.0這一集成開發(fā)工具,在Windows環(huán)境下開發(fā)一款休閑網絡游戲。本畢業(yè)設計通過策劃、實現(xiàn)、測試等游戲開發(fā)的一般流程。游戲設計是按如下功能模塊的設計思路來安排的:
?
據(jù)。
客戶端模塊:負責連接到服務器并處理和服務器的會話。
游戲規(guī)則模塊:負責游戲的控制和結果的判斷,使游戲按規(guī)則進行。
視圖控制模塊:負責控制整個程序的操作,負責處理用戶的輸入和游戲的界面繪制。
?多媒體功能設計模塊:
音頻播放模塊:負責播放MP3,WMA等格式的音樂。
效果如圖3-2:五子棋游戲設計可以分成如下幾個模塊:服務器模塊:負責建立游戲服務器并接受客戶端的連接和處理客戶端的數(shù)
第8頁共27頁
圖3-2五子棋游戲(網絡版)效果圖
4五子棋游戲(網絡版)設計
4.1
五子棋游戲(網絡版)流程
圖4-1五子棋游戲(網絡版)流程圖
4.2
4.2.1五子棋游戲(網絡版)功能設計方案主要類介紹
CServerSocket類:是一個專門用來監(jiān)聽客戶端連接的Socket類。當游戲運行,選擇了開啟服務器之后,即調用本類來初始一個Socket對象。這個Socket對象將負責監(jiān)聽網絡上有沒有客戶端連接到來。
CClientSocket類:是一個專門用做會話類,它負責數(shù)據(jù)的發(fā)送和接受。當游戲運行,選擇了連接服務器之后,即調用本類來初始一個Socket對象。這個
第9頁共27
頁
對象是用來連接服務器,它連接上以后,就可以通過他進行數(shù)據(jù)的交換。
CMessg類:是一個數(shù)據(jù)類,它發(fā)揮串行化數(shù)據(jù)的作用。它就是用來在網絡上傳輸?shù)男畔ⅰ?/p>
Match類:是一個規(guī)則類,它負責游戲規(guī)則的處理。在游戲運行中,它保存著一個二維數(shù)組記錄當前棋盤的信息,它還負責判斷能否在某個位置下棋,是否有人贏棋。
CFiveChessView類:是游戲的主視圖類。在游戲中它負責在主窗口中繪制盤和棋子。以及鼠標消息的處理。
CClientDlg類:是游戲中客戶端設置的對話框類。在游戲中,選擇打開連接服務器時,彈出來的連接服務器對話框。
CServerDlg類:是游戲中服務器端設置的對話框類。在游戲中,選擇打開開啟服務器時,彈出的開啟服務器對話框。
CSoundThread類:是游戲中負責多媒體播放的線程類,主要負責音樂播放。當然了它實現(xiàn)了播放和關閉,也就是線程的開啟和終止。
4.2.2
主要類的工作示意圖
圖4-2主要類工作示意圖
4.3五子棋游戲實現(xiàn)
游戲連接——CServerSocket類的實現(xiàn)4.3.1
這是一個專門用來監(jiān)聽客戶端連接的Socket類,它繼承于CSocket,響應OnAccept消息。所需要的參數(shù)從對話框中取得,如圖4-3:
第10頁共27頁
圖4-3服務器端設置圖
CServerSocket類需要聲明一個主視圖指針,為接受連接函數(shù)服務。并且在類成員函數(shù)Init(UINTport,CFiveChessView*dlg)中負責監(jiān)聽SOCKET和創(chuàng)建SOCKET。當用戶選擇“開啟服務器”功能時,程序就會工作在服務器端模式,并且不停的監(jiān)聽是否有客戶端的連接。當有監(jiān)聽客戶端的連接消息時,OnAccept函數(shù)響應。
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
頁
第15 / 29頁
{
CSocket::OnAccept(nErrorCode);
m_view->ProcessPendingAccept();//調用視圖類中連接處理函數(shù)
}
4.3.2游戲連接——CClientSocket類的實現(xiàn)
這是一個專門用做會話類,它負責數(shù)據(jù)的發(fā)送和接受。她繼承于CSocket,負責響應OnReceive和OnClose消息。另外,作為CSocket類的繼承類,當然采用了串行化方式來處理網絡數(shù)據(jù)。網絡數(shù)據(jù)由CMessg對象構成。連接服務器所需參數(shù)通過對話框獲得,如圖
4-4:
圖4-4客戶端設置圖
CClientSocket類中需要數(shù)據(jù)串行化網絡數(shù)據(jù)。類初始化成員Init函數(shù)負責Socket和串行化相關的初始化;成員函數(shù)GetIpAddress用于獲得本地IP;成員函數(shù)GetLocalHostName用于獲得本地計算機名稱;當連接上服務器以后,使用SendMessage(CMessg*msg)發(fā)送消息,或者使用OnReceive(intnErrorCode)接收對方發(fā)送過來的數(shù)據(jù),并對數(shù)據(jù)進行處理。當關閉客戶端Socket是使用成員函數(shù)CloseSocket關閉。
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
{
//對方關閉了連接
m_bClose=true;
CloseSocket();
returnFALSE;
}
}
第13頁共27頁
4.3.3網絡信息——CMessg類的實現(xiàn)
這是一個數(shù)據(jù)類,繼承于CObject.它主要負責串行化數(shù)據(jù)的作用。CMessg類主要的成員變量:
int
int
intm_turn;m_x;m_y;
其中m_turn表示輪到誰走棋;m_x表示落子的水平位置;m_y表示落子的豎直位置。這3個數(shù)據(jù)就是網絡要傳的數(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ī)則類,它負責規(guī)則的處理。在Match中保存著一個當前的棋盤,用的一個chessboard[LW][LW]。如果數(shù)組元素為0,則表示沒有棋子;如果為1,則表示有黑子,如果為2,則為白子。Match負責是否能下子,是否有人贏棋。
Match中類LW定為19,表示有19行19列。既然Match中保存著一個當前棋盤,那就需要有一個判斷的成員函數(shù),只有chessboard為0時才能落子,類中使用成員函數(shù)CanDown(intx,inty,intwho)判斷能否落子。并且有一個判斷是否贏的成員函數(shù)IsWin(intwho,intpos[5][2]);其中pos[5][2]為記錄贏的關鍵棋子。最后還有一個清除棋盤也就是把所有的chessboard全部設置為0的函數(shù)Clear。算法執(zhí)行出來的結果,如圖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
頁
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類也是本程序中相當重要的一個類。它實現(xiàn)了棋盤、棋子的繪制之外,程序界面的美化,還有鼠標消息的處理等。顯示主界面,如圖4-6:
第16頁共27頁
圖4-6主界面圖
首先游戲初始化當然包括Winsock的初始化,獲得本機的IP地址,以及相關的狀態(tài)變量的初始化。其中狀態(tài)變量包括m_bIsClient表示是否客戶端、m_bIsInit表示是否已經初試化、m_bWinm_bOver表示是否結束、m_turn表示輪到誰走棋等。這是因為初始只需要調用一次。
開始游戲時有作為客戶端運行的“連接服務器”或者作為服務器端“開啟服務器”兩個選項。
?當選擇作為服務器端“開啟服務器”時,游戲創(chuàng)建一個CServerDlg類對話框,并由對話框獲得輸入的端口號信息,由于在游戲初始化時Winsock已經初始化。這里直接調用CServerSocket類創(chuàng)建一個socket監(jiān)聽端口。程序功能實現(xiàn)如下:
voidCFiveChessView::OnSetserver()
{
CServerDlgdlg;
//服務器端口設置對話框
if(dlg.DoModal()==IDOK)
{
m_bIsClient=FALSE;//作為服務器
m_bIsInit=TRUE;//已經初試化
m_port=dlg.m_iPort;//得到輸入端口號
m_ListenSocket.Init(m_port,this);//開始監(jiān)聽端口
}
第17頁共27
頁
}
服務器端當監(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;//服務器端用黑子
m_ClientSocket.Init(this);//初試化會話SOCKET
AfxMessageBox("嘿嘿,有人進來挑戰(zhàn)了");
}
}
?當選擇作為客戶端“連接服務器”時,游戲創(chuàng)建一個CClientDlg類對話框,并由對話框獲得輸入的IP信息、端口號信息,由ClientSocket.Create()創(chuàng)建會話socket,并連接服務器。游戲設計中具體響應函數(shù)OnSetclient如下:
voidCFiveChessView::OnSetclient()
{
//TODO:Addyourcommandhandlercodehere
CClientDlgdlg;
intret=dlg.DoModal();//設置服務器IP和端口
if(ret==2000)//用戶確定
{
m_bIsClient=TRUE;//作為客戶端
m_bIsInit=TRUE;
m_port=dlg.m_iPort;//得到用戶輸入的端口號
for(inti=0;i<4;i++)//得到輸入的服務器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頁
久久建筑網brightonrobinsfc.com提供大量:建筑圖紙、施工方案、工程書籍、建筑論文、合同表格、標準規(guī)范、CAD圖紙等內容。