版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
小型網(wǎng)絡(luò)游戲?qū)嵗W(wǎng)絡(luò)五子棋前面介紹了Socket網(wǎng)絡(luò)開發(fā)基礎(chǔ),下面通過一個網(wǎng)絡(luò)五子棋的例子來介紹小型網(wǎng)絡(luò)游戲的制作方法和流程。1.1主程序結(jié)構(gòu)和流程對于一般的小型網(wǎng)絡(luò)游戲設(shè)計來說,可以分成如下的幾個模塊。_服務(wù)器模塊:負責(zé)建立游戲服務(wù)器并接受客戶端的連接和處理客戶端的數(shù)據(jù)。_客戶端模塊:負責(zé)連接到服務(wù)器并處理和服務(wù)器的會話。_游戲規(guī)則模塊:負責(zé)游戲的控制和結(jié)果的判斷,使游戲按規(guī)則進行。_視圖控制模塊:負責(zé)控制整個程序的操作,負責(zé)處理用戶的輸入和游戲的界面繪制。本節(jié)的網(wǎng)絡(luò)五子棋游戲就是按照以上的設(shè)計思路來安排的。第4章網(wǎng)絡(luò)游戲開發(fā)2071.2實例演示實例運行時的界面如圖4.7所示。實現(xiàn)的主要功能有:雙人對下五子棋,聊天。208VisualC++游戲開發(fā)技術(shù)與實例圖4.7網(wǎng)絡(luò)五子棋的運行界面1.3實例設(shè)計利用Win32AppWizard建立一個單文檔工程,工程名稱為FiveChess。工程主要包括以下的一些文件。其中窗體/視圖/文檔文件包括如下文件。_MainFrm.h/MainFrm.cpp:主窗體框架。_FiveChessView.h/FiveChessView.cpp:棋盤界面的顯示,鼠標消息的處理和發(fā)送網(wǎng)絡(luò)數(shù)據(jù)(聊天和下棋)。_FiveChessDoc.h/FiveChessDoc.cpp:文檔部分。網(wǎng)絡(luò)控制部分包括如下文件。_ServerSocket.h/ServerSocket.cpp:服務(wù)器端用來監(jiān)聽的socket,它繼承自CSocket。它負責(zé)響應(yīng)客戶端連接消息。_ClientSocket.h/ClientSocket.cpp:用來會話的socket,它也繼承于CSocket。它負責(zé)響應(yīng)Receive的消息。服務(wù)器端和客戶端都用這個socket發(fā)送和接受數(shù)據(jù)。_CMessg.h/CMessg.cpp:發(fā)送和接受的數(shù)據(jù)的定義。它采用串行化的方式對網(wǎng)絡(luò)數(shù)據(jù)進行處理。五子棋規(guī)則部分包括如下文件。_Match.h/Match.cpp:Match類中保存著當前的棋盤,它還負責(zé)判斷是否能夠在指定的位置落子,是否出現(xiàn)輸贏局面。1.4代碼詳細分析下面將分析網(wǎng)絡(luò)五子棋游戲中的網(wǎng)絡(luò)控制、五子棋規(guī)則和視圖控制部分的相關(guān)代碼。_網(wǎng)絡(luò)控制部分:CServerSocket、CClientSocket和CMessg。第4章網(wǎng)絡(luò)游戲開發(fā)209CServerSocket類是一個專門用來監(jiān)聽客戶端連接的Socket類,它繼承于CSocket,響應(yīng)OnAccept消息。CServerSocket類聲明如下:classCServerSocket:publicCSocket{public:CFiveChessView*m_view;//主視圖的指針,為接受連接函數(shù)服務(wù)UINTm_uPort;//需要監(jiān)聽的端口BOOLInit(UINTport,CFiveChessView*dlg);//socket的初始化public:virtualvoidOnAccept(intnErrorCode);//接受連接消息處理函數(shù)};在ServerSocket.cpp中的核心代碼如下,其中成員函數(shù)Init負責(zé)初始化ServerSocket,而OnAccept函數(shù)負責(zé)接收客戶端連接。BOOLCServerSocket::Init(UINTport,CFiveChessView*view){m_uPort=port;m_view=view;//創(chuàng)建socketif(Create(m_uPort)==FALSE){AfxMessageBox("ServerSocketCreateError");returnFALSE;}//監(jiān)聽socketif(Listen()==FALSE){AfxMessageBox("ServerListenError");returnFALSE;}returnTRUE;}voidCServerSocket::OnAccept(intnErrorCode)//接受客戶端連接{CSocket::OnAccept(nErrorCode);//調(diào)用視圖類中的連接處理函數(shù)m_view->ProcessPendingAccept();}CClientSocket類是一個專門用做會話的類,它負責(zé)數(shù)據(jù)的發(fā)送和接收。它繼承自CSocket,負責(zé)響應(yīng)OnReceive和OnClose消息。另外,作為CSocket類的繼承類,理所當然的采用了串行化的方式來處理網(wǎng)絡(luò)數(shù)據(jù)。網(wǎng)絡(luò)數(shù)據(jù)是由CMessg的對象構(gòu)成的。另外,在CClientSocket類中還定義了幾個靜態(tài)函數(shù),它們用來得到本機的名字和本機的IP地址。CClientSocket類聲明如下:classCClientSocket:publicCSocket{public:210VisualC++游戲開發(fā)技術(shù)與實例CArchive*m_aSessionIn;//輸入數(shù)據(jù)的串行化CArchive*m_aSessionOut;//輸出數(shù)據(jù)的串行化CSocketFile*m_sfSocketFile;//Socket關(guān)聯(lián)文件指針CFiveChessView*m_view;//視圖指針boolm_bInit;//是否初始化boolm_bClose;//連接是否已關(guān)閉public:voidInit(CFiveChessView*view);//socket和串行化相關(guān)的初始化BOOLSendMessage(CMessg*msg);//發(fā)送消息的函數(shù)voidCloseSocket();//關(guān)閉socket函數(shù)public://幾個靜態(tài)函數(shù),用來得到主機名和主機IP地址staticintGetLocalHostName(CString&sHostName);//獲得本地計算機名稱staticintGetIpAddress(constCString&sHostName,CString&sIpAddress);//獲得本地IPstaticintGetIpAddress(constCString&sHostName,BYTE&f0,BYTE&f1,BYTE&f2,BYTE&f3);//獲得本地IP//這個靜態(tài)函數(shù)根據(jù)GetLastError()返回的tag找到網(wǎng)絡(luò)失敗的原因staticCStringErrorReason(inttag);public:virtualvoidOnReceive(intnErrorCode);//數(shù)據(jù)接受消息的處理函數(shù)virtualvoidOnClose(intnErrorCode);//socket關(guān)閉的消息處理函數(shù)};ClientSocket.cpp中的核心代碼如下(構(gòu)造函數(shù)負責(zé)部分初始化工作):CClientSocket::CClientSocket(){m_aSessionIn=NULL;m_aSessionOut=NULL;m_sfSocketFile=NULL;m_bInit=false;m_bClose=false;}析構(gòu)函數(shù)負責(zé)清除內(nèi)存。CClientSocket::~CClientSocket(){if(m_aSessionIn)deletem_aSessionIn;if(m_aSessionOut)deletem_aSessionOut;if(m_sfSocketFile)deletem_sfSocketFile;}OnReceive函數(shù)負責(zé)接收對方發(fā)送過來的數(shù)據(jù),并對數(shù)據(jù)進行相應(yīng)的處理。這是一個消息響應(yīng)函數(shù):voidCClientSocket::OnReceive(intnErrorCode){CSocket::OnReceive(nErrorCode);do{第4章網(wǎng)絡(luò)游戲開發(fā)211CMessgtemp;temp.Serialize(*m_aSessionIn);//輸入數(shù)據(jù)的串行化m_view->m_sMsgList+=temp.m_strText;//加入新的對話內(nèi)容//把新的對話內(nèi)容顯示在主視圖窗口的一個Edit控件中m_view->m_outputedit.SetWindowText(m_view->m_sMsgList);//把Edit窗口中顯示的內(nèi)容滾動到當前的位置m_view->m_iLineCurrentPos=m_view->m_outputedit.GetLineCount();m_view->m_outputedit.LineScroll(m_view->m_iLineCurrentPos);//判斷對方發(fā)送過來的數(shù)據(jù)是否是落子的位置if(m_view->m_match.CanDown(temp.m_x,temp.m_y,m_view->m_who%2+1)){//是對方發(fā)送的落子信息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("你輸了");//顯示輸棋的對話框m_view->m_sMsgList+="你輸了";m_view->m_outputedit.SetWindowText(m_view->m_sMsgList);m_view->m_iLineCurrentPos=m_view->m_outputedit.GetLineCount();m_view->m_outputedit.LineScroll(m_view->m_iLineCurrentPos);}}}while(!m_aSessionIn->IsBufferEmpty());}Init函數(shù)負責(zé)初始化串行化socket:voidCClientSocket::Init(CFiveChessView*view){m_sfSocketFile=newCSocketFile(this);m_aSessionIn=newCArchive(m_sfSocketFile,CArchive::load);m_aSessionOut=newCArchive(m_sfSocketFile,CArchive::store);m_bClose=false;this->m_view=view;}SendMessage函數(shù)負責(zé)串行化數(shù)據(jù)到對方socket:BOOLCClientSocket::SendMessage(CMessg*msg){if(m_aSessionOut!=NULL){msg->Serialize(*m_aSessionOut);//輸出串行化m_aSessionOut->Flush();//直接發(fā)送returnTRUE;}212VisualC++游戲開發(fā)技術(shù)與實例else{//對方關(guān)閉了連接m_bClose=true;CloseSocket();returnFALSE;}}關(guān)閉Socket、清除串行化數(shù)據(jù)的工作由函數(shù)CloseSocket完成:voidCClientSocket::CloseSocket(){if(m_aSessionIn){deletem_aSessionIn;m_aSessionIn=NULL;}if(m_aSessionOut){deletem_aSessionOut;m_aSessionOut=NULL;}if(m_sfSocketFile){deletem_aSessionOut;m_sfSocketFile=NULL;}Close();m_bInit=false;m_bClose=true;}對方關(guān)閉了Socket的消息響應(yīng)處理函數(shù)OnClose:voidCClientSocket::OnClose(intnErrorCode){m_bClose=true;CloseSocket();CSocket::OnClose(nErrorCode);}GetLocalHostName函數(shù)負責(zé)獲得本地計算機名稱:intCClientSocket::GetLocalHostName(CString&sHostName){charszHostName[256];intnRetCode;nRetCode=gethostname(szHostName,sizeof(szHostName));if(nRetCode!=0){//產(chǎn)生錯誤sHostName=_T("沒有取得");returnGetLastError();第4章網(wǎng)絡(luò)游戲開發(fā)213}sHostName=szHostName;return0;}GetIpAddress函數(shù)負責(zé)獲得本地IP地址:intCClientSocket::GetIpAddress(constCString&sHostName,CString&sIpAddress){structhostentFAR*lpHostEnt=gethostbyname(sHostName);if(lpHostEnt==NULL){//產(chǎn)生錯誤sIpAddress=_T("");returnGetLastError();}//獲取IPLPSTRlpAddr=lpHostEnt->h_addr_list[0];if(lpAddr){structin_addrinAddr;memmove(&inAddr,lpAddr,4);//轉(zhuǎn)換為標準格式sIpAddress=inet_ntoa(inAddr);if(sIpAddress.IsEmpty())sIpAddress=_T("沒有取得");}return0;}GetIpAddress的一個重載:intCClientSocket::GetIpAddress(constCString&sHostName,BYTE&f0,BYTE&f1,BYTE&f2,BYTE&f3){structhostentFAR*lpHostEnt=gethostbyname(sHostName);if(lpHostEnt==NULL){//產(chǎn)生錯誤f0=f1=f2=f3=0;returnGetLastError();}//獲取IPLPSTRlpAddr=lpHostEnt->h_addr_list[0];if(lpAddr){structin_addrinAddr;memmove(&inAddr,lpAddr,4);f0=inAddr.S_un.S_un_b.s_b1;f1=inAddr.S_un.S_un_b.s_b2;f2=inAddr.S_un.S_un_b.s_b3;f3=inAddr.S_un.S_un_b.s_b4;}return0;214VisualC++游戲開發(fā)技術(shù)與實例}CMessg類是一個數(shù)據(jù)類,它繼承于CObject。在這個程序中,讓CMessg類發(fā)揮串行化數(shù)據(jù)的作用。CMessg類中包括了幾個主要的成員變量:CStringm_strText;intm_turn;intm_x;intm_y;其中m_strText表示聊天的字符串;m_turn表示輪到誰走棋;m_x表示落子的水平方向的位置;m_y表示落子的豎直方向的位置。這4個數(shù)據(jù)構(gòu)成了網(wǎng)絡(luò)傳輸數(shù)據(jù)的全部信息。事實上,在發(fā)送具體的CMessg數(shù)據(jù)的時候并不需要用到所有這4個成員變量。例如,用戶只是聊天的時候,只需要填充m_strText就可以了,m_turn、m_x和m_y會被初始填充為–1,表示沒有子落下。而當用戶落子的時候,m_strText會被初始填充成NULL,m_turn、m_x和m_y會被填充成具體的落子位置和輪換信息。CMessg.h中的核心代碼如下:classCMessg:publicCObject{protected:DECLARE_DYNCREATE(CMessg)public:CStringm_strText;//聊天的內(nèi)容intm_turn;//輪到誰落子intm_x;//落子的水平位置intm_y;//落子的豎直位置public:voidInit();//初始化public:virtualvoidSerialize(CArchive&ar);//串行化數(shù)據(jù)類};CMessg.cpp中的核心代碼如下:IMPLEMENT_DYNCREATE(CMessg,CObject)voidCMessg::Init()//初始化{m_strText=_T("");m_x=-1;m_y=-1;m_turn=-1;}voidCMessg::Serialize(CArchive&ar)//數(shù)據(jù)串行化{if(ar.IsStoring()){ar<<m_strText;ar<<m_turn;ar<<m_x;ar<<m_y;}else第4章網(wǎng)絡(luò)游戲開發(fā)215{ar>>m_strText;ar>>m_turn;ar>>m_x;ar>>m_y;}}_Match類(五子棋規(guī)則)正如前面所說的,每一種游戲都有一定的規(guī)則,Match類正是五子棋的規(guī)則處理類。在Match類中保存著一個當前的棋盤,它是一個二維的數(shù)組intchessboard[LW][LW]。如果chessboard[x][y]為0,則表示(x,y)的位置上沒有棋子;如果chessboard[x][y]為1表示該位置上有黑子;如果chessboard[x][y]為2,則表示該位置上有白子。Match類還負責(zé)判斷是否能在某個位置落子,是否有人贏棋。Cmatch類聲明如下:#defineLW19//棋盤的水平豎直方向的格數(shù)classMatch{public:Match();virtual~Match();public:intchessboard[LW][LW];//0表示沒有子落下;1表示黑子落下;2表示白子落下public:BOOLCanDown(intx,inty,intwho);//是否能在x,y的位置落子BOOLIsWin(intwho,intpos[5][2]);//判斷是否贏棋voidClear();//清除棋盤內(nèi)容};Match.cpp中的核心代碼如下(在構(gòu)造函數(shù)里初始化棋盤):Match::Match(){for(inti=0;i<LW;i++)for(intj=0;j<LW;j++){chessboard[i][j]=0;}}Clear函數(shù)負責(zé)清除棋盤內(nèi)容:voidMatch::Clear(){for(inti=0;i<LW;i++)for(intj=0;j<LW;j++){chessboard[i][j]=0;}}CanDown函數(shù)負責(zé)判斷在點(x,y)位置是否能落子:216VisualC++游戲開發(fā)技術(shù)與實例BOOLMatch::CanDown(intx,inty,intwho){if(x<0||x>=LW||y<0||y>=LW)returnFALSE;if(chessboard[x][y]!=0)returnFALSE;chessboard[x][y]=who;returnTRUE;}判斷玩家是否贏棋,如果贏棋則標注五子連珠的位置。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){//水平方向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){//贏棋//標注贏棋的關(guān)鍵子的位置for(intk=0;k<5;k++){pos[k][0]=i;pos[k][1]=j+k;}returnTRUE;}}//垂直if(i+4<LW){if(chessboard[i+1][j]==who&&chessboard[i+2][j]==who&&chessboard[i+3][j]==who&&chessboard[i+4][j]==who){//贏棋//標注贏棋的關(guān)鍵子的位置for(intk=0;k<5;k++){pos[k][0]=i+k;pos[k][1]=j;}returnTRUE;}}if(i+4<LW&&j+4<LW)//東南向{第4章網(wǎng)絡(luò)游戲開發(fā)217if(chessboard[i+1][j+1]==who&&chessboard[i+2][j+2]==who&&chessboard[i+3][j+3]==who&&chessboard[i+4][j+4]==who){//贏棋for(intk=0;k<5;k++)//標注贏棋的關(guān)鍵子的位置{pos[k][0]=i+k;pos[k][1]=j+k;}returnTRUE;}}//東北if(i-4>0&&j+4<LW){if(chessboard[i-1][j+1]==who&&chessboard[i-2][j+2]==who&&chessboard[i-3][j+3]==who&&chessboard[i-4][j+4]==who){//贏棋for(intk=0;k<5;k++)//標注贏棋的關(guān)鍵子的位置{pos[k][0]=i-k;pos[k][1]=j+k;}returnTRUE;}}}}returnfalse;}_主視圖FiveChessView類FiveChessView是程序的主視圖類。它負責(zé)在主窗口中繪制棋盤和棋子,顯示聊天的內(nèi)容,負責(zé)對鼠標消息進行處理等。FiveChessView.h中的核心代碼如下:#include"ServerSocket.h"#include"ClientSocket.h"#include"Match.h"classCFiveChessDoc;classCFiveChessView:publicCView{public:CStringm_sMsgList;//記錄聊天的內(nèi)容CServerSocketm_ListenSocket;//做服務(wù)器時的監(jiān)聽socketCClientSocketm_ClientSocket;//會話socketBOOLm_bIsClient;//是否是客戶端BOOLm_bIsInit;//是否已經(jīng)初始化intm_port;//socket端口號CStringm_ip;//本機的IP地址,字符串BYTEm_bIP[4];//本機的IP地址,字節(jié)218VisualC++游戲開發(fā)技術(shù)與實例CStringm_sLocalName;//本機的名字CEditm_inputedit;//聊天的輸入框CEditm_outputedit;//聊天的顯示框intm_iLineCurrentPos;//當前的顯示框中的行數(shù)public:Matchm_match;//五子棋的規(guī)則類intm_who;//黑棋或者白棋,黑棋先行intm_turn;//輪誰走棋intm_POS[2];//落子的位置intm_winpos[5][2];//如果贏棋,則記錄關(guān)鍵子的位置BOOLm_bWin;//是否贏棋BOOLm_bOver;//結(jié)束public:voidProcessPendingAccept();//作為服務(wù)器端時,接受socket連接的處理函數(shù)voidGetLocalIP();//得到本機的IP地址public:virtualvoidOnDraw(CDC*pDC);//繪制棋盤和棋子virtualvoidOnInitialUpdate();//初始化處理protected:afx_msgvoidOnLButtonDown(UINTnFlags,CPointpoint);//鼠標左鍵按下的消息處理函數(shù)afx_msgvoidINPUTMESSAGE();//聊天輸入框的消息處理afx_msgvoidOnSetclient();//菜單項"連接服務(wù)器"的消息處理afx_msgvoidOnSetserver();//菜單項"開啟服務(wù)器"的消息處理};FiveChessView.cpp中的核心代碼如下(構(gòu)造函數(shù)負責(zé)部分初始化工作):CFiveChessView::CFiveChessView(){m_bIsClient=FALSE;m_bIsInit=FALSE;m_bOver=FALSE;m_bWin=FALSE;m_turn=1;//服務(wù)器先走,黑棋}OnInitialUpdate函數(shù)負責(zé)主要的初始化工作:voidCFiveChessView::OnInitialUpdate(){CView::OnInitialUpdate();staticbooloninitialupdatehaving=false;//只需要初始化調(diào)用一次if(oninitialupdatehaving==false){if(::AfxSocketInit()==FALSE)//winsock初始化{AfxMessageBox("socketiniterror");}GetLocalIP();//得到本機的IP地址CRectrect;this->GetWindowRect(rect);第4章網(wǎng)絡(luò)游戲開發(fā)219//創(chuàng)建兩個動態(tài)的CEdit控件,作為輸入對話框和顯示對話框。m_outputedit.Create(ES_MULTILINE|WS_CHILD|WS_VISIBLE|WS_TABSTOP|WS_BORDER|ES_READONLY,CRect(10,rect.bottom-200,rect.right-10,rect.bottom-140),this,1);m_inputedit.Create(ES_MULTILINE|WS_CHILD|WS_VISIBLE|WS_TABSTOP|WS_BORDER|ES_AUTOVSCROLL,CRect(10,rect.bottom-140,rect.right-10,rect.bottom-100),this,2);}}OnDraw函數(shù)負責(zé)繪制視圖:voidCFiveChessView::OnDraw(CDC*pDC){CFiveChessDoc*pDoc=GetDocument();ASSERT_VALID(pDoc);CBrushback(RGB(125,125,20));//繪制棋盤的刷子pDC->SelectObject((CBrush*)&back);CRectrect;rect.left=LEFTDIS;rect.right=LEFTDIS+(LW-1)*30;rect.top=TOPDIS;rect.bottom=TOPDIS+(LW-1)*30;pDC->FillRect(&rect,&back);//繪制棋盤CPenpen(PS_SOLID,2,RGB(25,25,255));//繪制網(wǎng)格線的筆pDC->SelectObject((CPen*)&pen);inti,j;CPointpos;for(i=0;i<LW;i++)//豎直的線{pos.x=LEFTDIS+30*i;pos.y=TOPDIS;pDC->MoveTo(pos);pos.y=TOPDIS+(LW-1)*30;pDC->LineTo(pos);}for(i=0;i<LW;i++)//水平的線{pos.x=LEFTDIS;pos.y=TOPDIS+30*i;pDC->MoveTo(pos);pos.x=LEFTDIS+(LW-1)*30;pDC->LineTo(pos);}CBrushwhitebrush(RGB(255,255,255));//繪制黑棋的刷子CBrushblackbrush(RGB(0,0,0));//繪制白棋的刷子for(i=0;i<LW;i++)//掃描整個棋盤for(j=0;j<LW;j++){if(m_match.chessboard[i][j]==1)//黑棋{pDC->SelectObject((CBrush*)&blackbrush);pDC->Ellipse(j*30+LEFTDIS-15,i*30+TOPDIS-15,j*30+LEFTDIS+15,i*30+TOPDIS+15);}220VisualC++游戲開發(fā)技術(shù)與實例elseif(m_match.chessboard[i][j]==2)//白棋{pDC->SelectObject((CBrush*)&whitebrush);pDC->Ellipse(j*30+LEFTDIS-15,i*30+TOPDIS-15,j*30+LEFTDIS+15,i*30+TOPDIS+15);}}//繪制4個星位和一個天元CBrushstarbrush(RGB(0,0,0));pDC->SelectObject((CBrush*)&starbrush);j=4;i=4;if(m_match.chessboard[i][j]==0)pDC->Ellipse(j*30+LEFTDIS-8,i*30+TOPDIS-8,j*30+LEFTDIS+8,i*30+TOPDIS+8);j=4;i=14;if(m_match.chessboard[i][j]==0)pDC->Ellipse(j*30+LEFTDIS-8,i*30+TOPDIS-8,j*30+LEFTDIS+8,i*30+TOPDIS+8);j=9;i=9;if(m_match.chessboard[i][j]==0)pDC->Ellipse(j*30+LEFTDIS-8,i*30+TOPDIS-8,j*30+LEFTDIS+8,i*30+TOPDIS+8);j=14;i=4;if(m_match.chessboard[i][j]==0)pDC->Ellipse(j*30+LEFTDIS-8,i*30+TOPDIS-8,j*30+LEFTDIS+8,i*30+TOPDIS+8);j=14;i=14;if(m_match.chessboard[i][j]==0)pDC->Ellipse(j*30+LEFTDIS-8,i*30+TOPDIS-8,j*30+LEFTDIS+8,i*30+TOPDIS+8);//比賽已經(jīng)結(jié)束,或贏或輸if(m_bOver==TRUE){CBrushredbrush(RGB(255,0,0));//用紅色的刷子顯示關(guān)鍵的5個棋子pDC->SelectObject((CBrush*)&redbrush);for(intk=0;k<5;k++){i=m_winpos[k][0];j=m_winpos[k][1];pDC->Ellipse(j*30+LEFTDIS-15,i*30+TOPDIS-15,j*30+LEFTDIS+15,i*30+TOPDIS+15);}}}菜單項“開啟服務(wù)器”的消息處理函數(shù)如下:voidCFiveChessView::OnSetserver(){CServerDlgdlg;第4章網(wǎng)絡(luò)游戲開發(fā)221if(dlg.DoModal()==IDOK)//服務(wù)器端口設(shè)置對話框{m_bIsClient=FALSE;//作為游戲的服務(wù)器端m_bIsInit=TRUE;//已經(jīng)初始化m_port=dlg.m_iPort;//得到輸入的端口號m_ListenSocket.Init(m_port,this);//開始監(jiān)聽端口}}菜單項“連接服務(wù)器”的消息處理函數(shù)如下:voidCFiveChessView::OnSetclient(){CClientDlgdlg;intret=dlg.DoModal();//設(shè)置服務(wù)器的IP和端口if(ret==2000)//用戶點擊了"確定"{m_bIsClient=TRUE;//作為游戲的客戶端m_bIsInit=TRUE;//已經(jīng)初始化m_port=dlg.m_iPort;//得到用戶輸入的服務(wù)器端的端口for(inti=0;i<4;i++)m_bIP[i]=dlg.m_bIP[i];//得到用戶輸入的服務(wù)器端的IP地址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)建會話socketif(m_ClientSocket.Connect(LPCSTR(m_ip),m_port))//連接到服務(wù)器端{m_ClientSocket.Init(this);//初始化會話socketm_who=2;//客戶端用白子。AfxMessageBox("成功的連接到了服務(wù)器,可以開始游戲了");}else{m_ClientSocket.Close();//連接失敗AfxMessageBox("clientconnectionfailed");}}}ProcessPendingAccept是處理客戶端socket連接的函數(shù):voidCFiveChessView::ProcessPendingAccept(){if(m_ListenSocket.Accept(m_ClientSocket)==FALSE)//分配一個會話socket{AfxMessageBox("ServerListenSocketError");return;}else{m_who=1;//服務(wù)器端用黑棋,黑棋先行m_ClientSocket.Init(this);//初始化會話socketm_outputedit.SetWindowText("有人進來了");AfxMessageBox("有人進來了");222VisualC++游戲開發(fā)技術(shù)與實例}}INPUTMESSAGE函數(shù)用來處理在聊天輸入框中
溫馨提示
- 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年上教版必修1地理上冊階段測試試卷含答案
- 2025年蘇教新版選修5歷史上冊月考試卷
- 2025年外研版三年級起點選修五歷史上冊月考試卷
- 2025年新世紀版選擇性必修3化學(xué)上冊階段測試試卷含答案
- 2025年統(tǒng)編版2024選修2地理下冊階段測試試卷含答案
- 2025年蘇教版必修1歷史上冊月考試卷
- 2025年華東師大版必修三語文下冊階段測試試卷
- 2025年度體育場館場地租賃及賽事運營服務(wù)合同范本3篇
- 鄉(xiāng)村旅游合作社經(jīng)營合同2024
- 二零二五年度大型活動策劃與派遣公司臨時員工派遣合同4篇
- 風(fēng)電場事故案例分析
- 護理飲食指導(dǎo)整改措施及方案
- 項目工地春節(jié)放假安排及安全措施
- 印染廠安全培訓(xùn)課件
- 紅色主題研學(xué)課程設(shè)計
- 胸外科手術(shù)圍手術(shù)期處理
- 裝置自動控制的先進性說明
- 《企業(yè)管理課件:團隊管理知識點詳解PPT》
- 移動商務(wù)內(nèi)容運營(吳洪貴)任務(wù)二 軟文的寫作
- 英語詞匯教學(xué)中落實英語學(xué)科核心素養(yǎng)
- 《插畫設(shè)計》課程標準
評論
0/150
提交評論