基于TCPIP協(xié)議的在線五子棋系統(tǒng)的設(shè)計與實現(xiàn)_第1頁
基于TCPIP協(xié)議的在線五子棋系統(tǒng)的設(shè)計與實現(xiàn)_第2頁
基于TCPIP協(xié)議的在線五子棋系統(tǒng)的設(shè)計與實現(xiàn)_第3頁
基于TCPIP協(xié)議的在線五子棋系統(tǒng)的設(shè)計與實現(xiàn)_第4頁
基于TCPIP協(xié)議的在線五子棋系統(tǒng)的設(shè)計與實現(xiàn)_第5頁
已閱讀5頁,還剩12頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、題目:基于TCP/IP協(xié)議的在線五子棋系統(tǒng)的設(shè)計與實現(xiàn)目 錄一 系統(tǒng)功能描述11.1 五子棋介紹11.2 功能簡介1二 系統(tǒng)的模塊劃分12.1 軟件的總體架構(gòu)如圖所示12.2 棋盤模塊12.2.1 主要成員變量說明22.2.2 主要成員函數(shù)說明22.3 游戲模塊42.3.1 主要成員變量說明42.3.2 主要成員函數(shù)說明42.4 客戶端模塊52.4.1 主要成員變量說明52.4.2 主要成員函數(shù)說明52.5 服務(wù)端模塊52.6 消息機制模塊62.6.1 消息機制的架構(gòu)62.6.2 各種消息說明6三 調(diào)試數(shù)據(jù)103.1 程序主界面103.2 建立游戲103.3 加入游戲103.4 連接成功后主界

2、面113.5 退出主界面113.6 勝利后主界面123.7 更改昵稱123.8 關(guān)于五子棋123.9 失敗后主界面13四 主要代碼134.1 判斷勝負(fù)134.2 初始化棋盤164.3 在指定棋盤坐標(biāo)處繪制指定顏色的棋子164.4 設(shè)置棋盤數(shù)據(jù),并繪制棋子184.5 清空棋盤18五 系統(tǒng)功能的優(yōu)缺點195.1 優(yōu)點195.2 不足195.3 如果自己有時間和能力,系統(tǒng)應(yīng)該實現(xiàn)如下功能19參考文獻(xiàn)19一 系統(tǒng)功能描述1.1 五子棋介紹五子棋是起源于中國古代的傳統(tǒng)黑白棋種之一?,F(xiàn)代五子棋日文稱之為“連珠” ,英譯為“Renju” ,英文稱之為“Gobang”或“FIR”(Five in a Row的

3、縮寫),亦有“連五子” 、“五子連” 、“串珠” 、“五目” 、“五目碰” 、“五格”等多種稱謂。五子棋不僅能增強思維能力,提高智力,而且富含哲理,有助于修身養(yǎng)性。五子棋既有現(xiàn)代休閑的明顯特征“短、平、快” ,又有古典哲學(xué)的高深學(xué)問“陰陽易理” ;它既有簡單易學(xué)的特性,為人民群眾所喜聞樂見,又有深奧的技巧和高水平的國際性比賽;它的棋文化源淵流長,具有東方的神秘和西方的直觀;既有“場”的概念,亦有“點”的連接。它是中西文化的交流點,是古今哲理的結(jié)晶。1.2 功能簡介使用Socket實現(xiàn)五子棋的簡單游戲規(guī)則,該系統(tǒng)集成了服務(wù)器端和客戶端功能,即可以做服務(wù)器端也可以做客戶端,實現(xiàn)功能如下:(1)五子

4、棋棋盤正確顯示(2)正確顯示雙方棋子,走棋數(shù)據(jù)的正確存儲與傳遞(3)能夠正確判斷勝負(fù)(4)能夠?qū)崿F(xiàn)認(rèn)輸、悔棋、和棋和重新開局(5)能夠?qū)崿F(xiàn)顯示玩家姓名和更改玩家姓名二 系統(tǒng)的模塊劃分2.1 軟件的總體架構(gòu)如圖所示主界面用戶棋盤類游戲類指針二人游戲類圖2.1 軟件架構(gòu)2.2 棋盤模塊整個架構(gòu)的核心部分,類名為CTable。封裝了棋盤的各種可能用到的功能,如保存棋盤數(shù)據(jù)、初始化、判斷勝負(fù)等。用戶操作主界面,主界面與CTable進(jìn)行交互來完成對游戲的操作。2.2.1 主要成員變量說明1. 網(wǎng)絡(luò)連接標(biāo)志m_bConnected用來表示當(dāng)前網(wǎng)絡(luò)連接的情況,在網(wǎng)絡(luò)對弈游戲下客戶端連接服務(wù)器的時候用來判斷是

5、否連接成功。2. 棋盤等待標(biāo)志m_bWait與m_bOldWait由于在玩家落子后需要等待對方落子,m_bWait標(biāo)志就用來標(biāo)識棋盤的等待狀態(tài)。當(dāng)m_bWait為TRUE時,是不允許玩家落子的。在網(wǎng)絡(luò)對弈游戲下,玩家之間需要互相發(fā)送諸如悔棋、和棋這一類的請求消息,在發(fā)送請求后等待對方回應(yīng)時,也是不允許落子的,所以需要將m_bWait標(biāo)志置為TRUE。在收到對方回應(yīng)后,需要恢復(fù)原有的棋盤等待狀態(tài),所以需要另外一個變量在發(fā)送請求之前保存棋盤的等待狀態(tài)做恢復(fù)之用,也就是m_bOldWait。等待標(biāo)志的設(shè)置,由成員函數(shù)SetWait()和RestoreWait()完成。3. 網(wǎng)絡(luò)套接字m_sock和m

6、_conn在網(wǎng)絡(luò)對弈游戲下,需要用到這兩個套接字對象。其中m_sock對象用于做服務(wù)器時的監(jiān)聽之用,m_conn用于網(wǎng)絡(luò)連接的傳輸。4. 棋盤數(shù)據(jù)m_data這是一個15*15的二維數(shù)組,用來保存當(dāng)前棋盤的落子數(shù)據(jù)。其中對于每個成員來說,0表示落黑子,1表示落白子,-1表示無子。5. 游戲模式指針m_pGame這個CGame類的對象指針是CTable類的核心內(nèi)容,它所指向的對象實體決定了CTable在執(zhí)行一件事情時候的行為。2.2.2 主要成員函數(shù)說明1. 套接字的回調(diào)處理Accept()、Connect()、Receive()本程序的套接字派生自MFC的CAsyncSocket類,CTabl

7、e的這三個成員函數(shù)就分別提供了對套接字回調(diào)事件OnAccept、OnConnect、OnReceive的實際處理,其中尤以Receive成員函數(shù)重要,它之中包含了對所有網(wǎng)絡(luò)消息(參見“消息機制”一節(jié))的分發(fā)處理。2. 清空棋盤Clear()在每一局游戲開始的時候都需要調(diào)用這個函數(shù)將棋盤清空,也就是棋盤的初始化工作。在這個函數(shù)中,主要發(fā)生了這么幾件事情:l 將m_data中每一個落子位都置為無子狀態(tài)(-1)。l 按照傳入的參數(shù)設(shè)置棋盤等待標(biāo)志m_bWait,以供先、后手的不同情況之用。l 使用delete將m_pGame指針?biāo)赶虻脑杏螒蚰J綄ο髲亩焉蟿h除。3. 繪制棋子Draw()這無疑是很

8、重要的一個函數(shù),它根據(jù)參數(shù)給定的坐標(biāo)和顏色繪制棋子。繪制的詳細(xì)過程如下:l 將給定的棋盤坐標(biāo)換算為繪圖的像素坐標(biāo)。l 根據(jù)坐標(biāo)繪制棋子位圖。l 如果先前曾下過棋子,則利用R2_NOTXORPEN將上一個繪制棋子上的最后落子指示矩形擦除。l 在剛繪制完成的棋子四周繪制最后落子指示矩形。4. 左鍵消息OnLButtonUp()作為棋盤唯一響應(yīng)的左鍵消息,也需要做不少的工作:l 如果棋盤等待標(biāo)志m_bWait為TRUE,則直接發(fā)出警告聲音并返回,即禁止落子。l 如果點擊時的鼠標(biāo)坐標(biāo)在合法坐標(biāo)(0, 0)(14, 14)之外,亦禁止落子。l 如果走的步數(shù)大于1步,方才允許悔棋。l 如未勝利,則向?qū)Ψ桨l(fā)

9、送已經(jīng)落子的消息。l 落子完畢,將m_bWait標(biāo)志置為TRUE,開始等待對方回應(yīng)。5. 繪制棋盤OnPaint()每當(dāng)WM_PAINT消息觸發(fā)時,都需要對棋盤進(jìn)行重繪。OnPaint作為響應(yīng)繪制消息的消息處理函數(shù)使用了雙緩沖技術(shù),減少了多次繪圖可能導(dǎo)致的圖像閃爍問題。這個函數(shù)主要完成了以下工作:l 裝載棋盤位圖并進(jìn)行繪制。l 根據(jù)棋盤數(shù)據(jù)繪制棋子。l 繪制最后落子指示矩形。6. 對方落子完畢Over()在對方落子之后,仍然需要做一些判斷工作,這些工作與OnLButtonUp中的類似,在此不再贅述。7. 設(shè)置游戲模式SetGameMode()這個函數(shù)通過傳入的游戲模式參數(shù)對m_pGame指針進(jìn)

10、行了初始化,代碼如下:void CTable:SetGameMode( int nGameMode ) m_pGame = new CTwoGame( this ); m_pGame-Init();8. 勝負(fù)的判斷Win()這是游戲中一個極其重要的算法,用來判斷當(dāng)前棋盤的形勢是哪一方獲勝。2.3 游戲模塊用來管理網(wǎng)絡(luò)對弈,類名為CGame。CGame是一個抽象類,經(jīng)由它派生出二人游戲類CTwoGame。這樣,CTable類就可以通過一個CGame類的指針,在游戲初始化的時候?qū)嵗疌TwoGame類的對象;然后利用多態(tài)性,使用CGame類提供的公有接口就可以完成不同功能了。2.3.1 主要成員變

11、量說明1. 棋盤指針m_pTable由于在游戲中需要對棋盤以及棋盤的父窗口主對話框進(jìn)行操作及UI狀態(tài)設(shè)置,故為CGame類設(shè)置了這個成員。當(dāng)對主對話框進(jìn)行操作時,可以使用m_pTable-GetParent()得到它的窗口指針。2. 落子步驟m_StepList一個好的棋類程序必須要考慮到的功能就是它的悔棋功能,所以需要為游戲類設(shè)置一個落子步驟的列表。由于網(wǎng)絡(luò)對弈中需要這個功能,故將這個成員直接設(shè)置到基類CGame中。另外,考慮到使用的簡便性,這個成員使用了C+標(biāo)準(zhǔn)模板庫(Standard Template Library,STL)中的std:list,而不是MFC的CList。2.3.2 主

12、要成員函數(shù)說明1悔棋操作Back()悔棋的過程為:首先由玩家向?qū)Ψ桨l(fā)送悔棋請求(悔棋消息),然后由對方?jīng)Q定是否允許玩家悔棋,在玩家得到對方的響應(yīng)消息(允許或者拒絕)之后,才進(jìn)行悔棋與否的操作。2初始化操作Init()網(wǎng)絡(luò)對弈的初始化工作暫為空,以供以后擴展之用。3接收來自對方的消息ReceiveMsg()這個成員函數(shù)由CTable棋盤類的Receive成員函數(shù)調(diào)用,用于接收來自對方的消息,這個成員函數(shù)則負(fù)責(zé)從套接字讀取對方發(fā)過來的數(shù)據(jù),然后將這些數(shù)據(jù)解釋為自定義的消息結(jié)構(gòu),并回到CTable:Receive來進(jìn)行處理。4發(fā)送落子消息SendStep()在玩家落子結(jié)束后,要向?qū)Ψ桨l(fā)送自己落子的消

13、息,將把落子消息發(fā)送給套接字,并由套接字轉(zhuǎn)發(fā)給對方。5勝利后的處理Win()在玩家贏得棋局后,這個函數(shù)仍然會調(diào)用SendStep將玩家所下的制勝落子步驟發(fā)送給對方玩家,然后對方的游戲端經(jīng)由CTable:Win來判定自己失敗。2.4 客戶端模塊利用類向?qū)傻腃ClientDlg類,用來連接服務(wù)器端進(jìn)行網(wǎng)絡(luò)對弈。2.4.1 主要成員變量說明超時時間m_nTimer,與服務(wù)器連接時判斷是否連接成功,當(dāng)0 = m_nTimer時提示連接失敗。2.4.2 主要成員函數(shù)說明1初始化對話框OnInitDialog()自動獲得主機IP地址,設(shè)置IDC_EDIT_HOST的內(nèi)容。2連接服務(wù)器OnBtnConn

14、ect() 根據(jù)IDC_EDIT_HOST的內(nèi)容獲取主機名稱,創(chuàng)建套接字并連接,設(shè)定時鐘SetTimer()。3計時響應(yīng)OnTimer(UINT nIDEvent)響應(yīng)用SetTimer()函數(shù)設(shè)定的時鐘發(fā)送的時鐘消息,當(dāng)0 = m_nTimer時提示連接失敗。2.5 服務(wù)端模塊利用類向?qū)傻腃ServerDlg類,用來建立服務(wù)器端進(jìn)行網(wǎng)絡(luò)對弈。主要成員函數(shù)說明:1初始化對話框OnInitDialog()自動獲取主機名及IP地址,設(shè)置IDC_EDIT_HOST和IDC_EDIT_IP的內(nèi)容。2. 監(jiān)聽客戶端連接OnBtnListen() 調(diào)用Socket的Create()和Listen()進(jìn)

15、行創(chuàng)建Socket和監(jiān)聽請求。2.6 消息機制模塊2.6.1 消息機制的架構(gòu)當(dāng)繼承自MFC中CAsyncSocket的Scoket類CFiv收到消息時,會觸發(fā)CFiveSocket:OnReceive事件,在這個事件中調(diào)用CTableeSocket:Receive,CTable:Receive開始按照自定義的消息格式接收套接字發(fā)送的數(shù)據(jù),并對不同的消息類型進(jìn)行分發(fā)處理。網(wǎng)絡(luò)數(shù)據(jù)CFiveSocketCTable:Receive分發(fā)處理CFiveSocket:OnReceiveCFiveSocket:Receive調(diào)用 圖2.6.1 自定義的消息機制如圖2.6.1所示,當(dāng)CTable獲得了來自網(wǎng)

16、絡(luò)的消息之后,就可以使用一個switch結(jié)構(gòu)來進(jìn)行消息的分發(fā)了。2.6.2 各種消息說明網(wǎng)絡(luò)間傳遞的消息,都遵循以下一個結(jié)構(gòu)體的形式:/ 摘自Messages.htypedef struct _tagMsgStruct / 消息ID UINT uMsg; / 落子信息 int x; int y; int color; / 消息內(nèi)容 TCHAR szMsg128; MSGSTRUCT;uMsg表示消息ID,x、y表示落子的坐標(biāo),color表示落子的顏色,szMsg隨著uMsg的不同而有不同的含義。1落子消息MSG_PUTSTEP表明對方落下了一個棋子,其中x、y和color成員有效,szMsg成

17、員無效。2悔棋消息MSG_BACK表明對方請求悔棋,除uMsg成員外其余成員皆無效。接到這個消息后,會彈出MessageBox詢問是否接受對方的請求(如圖2.6.2所示),并根據(jù)玩家的選擇回返MSG_AGREEBACK或MSG_REFUSEBACK消息。另外,在發(fā)送這個消息之后,主界面上的某些元素將不再響應(yīng)用戶的操作。圖2.6.2 請求悔棋3同意悔棋消息MSG_AGREEBACK表明對方接受了玩家的悔棋請求,除uMsg成員外其余成員皆無效。接到這個消息后,將進(jìn)行正常的悔棋操作。4拒絕悔棋消息MSG_REFUSEBACK表明對方拒絕了玩家的悔棋請求(如圖2.6.3所示),除uMsg成員外其余成員

18、皆無效。接到這個消息后,整個界面將恢復(fù)發(fā)送悔棋請求前的狀態(tài)。圖2.6.3 拒絕悔棋5和棋消息MSG_DRAW表明對方請求和棋,除uMsg成員外其余成員皆無效。接到這個消息后,會彈出MessageBox詢問是否接受對方的請求(如圖2.6.4所示),并根據(jù)玩家的選擇回返MSG_AGREEDRAW或MSG_REFUSEDRAW消息。另外,在發(fā)送這個消息之后,主界面上的某些元素將不再響應(yīng)用戶的操作。圖2.6.4 請求和棋6同意和棋消息MSG_AGREEDRAW表明對方接受了玩家的和棋請求(如圖2.6.5所示),除uMsg成員外其余成員皆無效。接到這個消息后,雙方和棋。圖2.6.5 同意和棋7拒絕和棋消

19、息MSG_REFUSEDRAW表明對方拒絕了玩家的和棋請求(如圖2.6.6所示),除uMsg成員外其余成員皆無效。接到這個消息后,整個界面將恢復(fù)發(fā)送和棋請求前的狀態(tài)。圖2.6.6 拒絕和棋8認(rèn)輸消息MSG_GIVEUP表明對方已經(jīng)投子認(rèn)輸(如圖2.6.7所示),除uMsg成員外其余成員皆無效。接到這個消息后,整個界面將轉(zhuǎn)換為勝利后的狀態(tài)。圖2.6.7 認(rèn)輸9對方信息消息MSG_INFORMATION用來獲取對方玩家的姓名,szMsg表示對方的姓名,其余成員無效。在開始游戲的時候,由客戶端向服務(wù)端發(fā)送這條消息,服務(wù)端接到后設(shè)置對方的姓名,并將自己的姓名同樣用這條消息回發(fā)給客戶端。10再次開局消息

20、MSG_PLAYAGAIN表明對方希望開始一局新的棋局,除uMsg成員外其余成員皆無效。接到這個消息后,會彈出MessageBox詢問是否接受對方的請求(如圖2.6.8所示),并根據(jù)玩家的選擇回返MSG_AGREEAGAIN消息或直接斷開網(wǎng)絡(luò)。圖2.6.8 再次開局11同意再次開局消息MSG_AGREEAGAIN表明對方同意了再次開局的請求,除uMsg成員外其余成員皆無效。接到這個消息后,將開啟一局新游戲。三 主要代碼4.1 判斷勝負(fù)五子棋的勝負(fù),在于判斷棋盤上是否有一個點,從這個點開始的右、下、右下、左下四個方向是否有連續(xù)的五個同色棋子出現(xiàn),如圖4.1:圖4.1 判斷勝負(fù)方向這個算法也就是C

21、Table的Win成員函數(shù)。從設(shè)計的思想上,需要它接受一個棋子顏色的參數(shù),然后返回一個布爾值,這個值來指示是否勝利,代碼如下:BOOL CTable:Win( int color ) const int x, y; / 判斷橫向 for ( y = 0; y 15; y+ ) for ( x = 0; x 11; x+ ) if ( color = m_dataxy &color = m_datax + 1y & color = m_datax + 2y &color = m_datax + 3y & color = m_datax + 4y ) return TRUE; / 判斷縱向 for

22、 ( y = 0; y 11; y+ ) for ( x = 0; x 15; x+ ) if ( color = m_dataxy &color = m_dataxy + 1 & color = m_dataxy + 2 &color = m_dataxy + 3 & color = m_dataxy + 4 ) return TRUE; / 判斷“”方向 for ( y = 0; y 11; y+ ) for ( x = 0; x 11; x+ ) if ( color = m_dataxy &color = m_datax + 1y + 1 & color = m_datax + 2y

23、+ 2 &color = m_datax + 3y + 3 & color = m_datax + 4y + 4 ) return TRUE; / 判斷“/”方向 for ( y = 0; y 11; y+ ) for ( x = 4; x m_szIni ); m_strMe = str; / 初始化圖像列表 m_iml.Create( 24, 24, ILC_COLOR24 | ILC_MASK, 0, 2 ); / 載入黑、白棋子掩碼位圖 CBitmap bmpBlack, bmpWhite; bmpBlack.LoadBitmap( IDB_BMP_BLACK ); m_iml.Add

24、( &bmpBlack, 0xff00ff ); bmpWhite.LoadBitmap( IDB_BMP_WHITE ); m_iml.Add( &bmpWhite, 0xff00ff ); / 初始化游戲模式 m_pGame = NULL;4.3 在指定棋盤坐標(biāo)處繪制指定顏色的棋子void CTable:Draw( int x, int y, int color ) POINT pt; pt.x = 12 + 25 * x; pt.y = 84 + 25 * y; CDC *pDC = GetDC(); CPen pen; pen.CreatePen( PS_SOLID, 1, 0xff

25、); pDC-SelectObject( &pen ); pDC-SetROP2( R2_NOTXORPEN ); m_iml.Draw( pDC, color, pt, ILD_TRANSPARENT ); STEP step; / 利用R2_NOTXORPEN擦除先前畫出的矩形 if ( !m_pGame-m_StepList.empty() ) / 獲取最后一個點 step = *( m_pGame-m_StepList.begin() ); pDC-MoveTo( 11 + 25 * step.x, 83 + 25 * step.y ); pDC-LineTo( 36 + 25 * s

26、tep.x, 83 + 25 * step.y ); pDC-LineTo( 36 + 25 * step.x, 108 + 25 * step.y ); pDC-LineTo( 11 + 25 * step.x, 108 + 25 * step.y ); pDC-LineTo( 11 + 25 * step.x, 83 + 25 * step.y ); / 更新最后落子坐標(biāo)數(shù)據(jù),畫新的矩形 step.color = color; step.x = x; step.y = y; m_pGame-m_StepList.push_front( step ); pDC-MoveTo( 11 + 25 * step.x, 83 + 25 * step.y ); pDC-LineTo( 36 + 25 * step.x, 83 + 25 * step.y ); pDC-LineTo( 36 + 25 * step.x, 108 + 25 * step.y ); pDC-LineTo( 11 + 25 * step.x, 108 + 25 * st

溫馨提示

  • 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論