freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

五子棋游戲的設(shè)計與開發(fā)—免費(fèi)計算機(jī)-在線瀏覽

2025-02-09 10:07本頁面
  

【正文】 應(yīng)用層。 5 至 7層是高層,包含應(yīng)用程序級的數(shù)據(jù)。 如圖 11: 圖 11 OSI模型圖 TCP/IP模型介紹 TCP/IP 是 Transmission Control Protocol/Inter Protocol(傳輸控制協(xié)議/互聯(lián)網(wǎng) 協(xié)議)的縮寫。 TCP/IP 協(xié)議已成為目前事實(shí)上的國際標(biāo)準(zhǔn)和工業(yè)標(biāo)準(zhǔn)。TCP/IP 從底至頂分為鏈路層、網(wǎng)絡(luò)層、傳輸層、應(yīng)用層等 4 個層次。 圖 12 TCP/IP模型圖 Winsock技術(shù) Winsock 編程流程簡介 下面介紹一下 Win32 平臺的 Winsock 編程方法。簡單介紹 tcp 服務(wù)器端的大體流程。 int bind(SOCKET s , const struct sockaddr FAR* name , int namelen ) 。 u_short sin_prot 。 char sin_sero[8] 。 u_short htons( u_short hostshort )。 u_short ntohs( u_short short ) 。 int listen( SOCKET s ,int backlog )。 現(xiàn)在基本上已經(jīng)完成了一個服務(wù)器的建立,而客戶端的建立的流程則是初始化 WinSock ,然后創(chuàng)建 socket 套接字,再使用 int connect( SOCKET s , const struct sockaddr FAR* name , int namelen ) 來連接服務(wù)端。 int recv( SOCKET s , char FAR* buf , int len , int flags )。 當(dāng)要關(guān)閉通訊連結(jié)的時候,任何一方都可以調(diào)用 int shutdown( SOCKET s , int how ) 來關(guān)閉套接字的指定功能。這樣一個通訊過程就算完成了。 CAsyncSocket 類逐個封裝了 WinSock API,為高級網(wǎng)絡(luò)程序員提供了更加有力而靈活的方法。 CAsyncSocket 類編程模型 在一個 MFC 應(yīng)用程序中,要想輕松處理多個網(wǎng)絡(luò)協(xié)議,而又不犧牲靈活性時,可以考慮使用 CAsyncSocket 類,它的效率比 CSocket 類要高。可以按如下兩種方法構(gòu)造: CAsyncSocket sock。 或在指定端口號產(chǎn)生一個數(shù)據(jù)報套接字 CAsyncSocket*pSocket=newCAsyncSocket。 pSocketCreate(nPort,SOCKDGRAM)。 Create()函數(shù)的原型為: BOOL Create( UINT nSocketPort = 0, int nSocketType = SOCK_STREAM, LPCTSTR lpszSocketAddress = NULL )。注意:如果是服務(wù)方,則使用一個眾所 周知的端口供服務(wù)方連接;如果是客戶方,典型做法是接受默認(rèn)參數(shù),使套接字可以自主選擇一個可用端口。 3) socket 的地址,例如 或 。注意:CAsyncSocket ∷ Accept()成員函數(shù)要用一個新的并且是空的 CAsyncSocket對象作為它的參數(shù),這里所說的 空的 指的是這個新對象還沒有調(diào)用 Create()成員函數(shù)。 通訊結(jié)束后,銷毀 CAsyncSocket對象。 CSocket 類介紹 為了給程序員提供更方便的接口以自動處理這些任務(wù), MFC 給出了 CSocket類,這個類是由 CAsyncSocket 類繼承下來的,它提供了比 CAsyncSocket 更高層的 WinSock API 接口。 CSocket 對象提供阻塞模式,這對于 Carchive的同步操作是至關(guān)重要的。 一個 CSocket 對象代表了一個比 CAsyncSocket 對象更高層次的 Windows Socket 的抽象, CSocket 類與 CSocketFile 類和 CArchive 類一起工作來發(fā)送和接收數(shù)據(jù),因此使用它更加容易使用。在這里有必要對阻塞的概念作一解釋:一個 socket 可以處于“阻塞模式”或“非阻塞模式”,當(dāng)一個套接字處于阻塞模式(即同步操作)時,它的阻塞函數(shù)直到操作完成才會返回控制權(quán),之所以稱為阻塞是因?yàn)榇颂捉幼值淖枞瘮?shù)在完成操作返回之前什么也不能做。在CAsyncSocket 類中可以用 GetLastError 成員函數(shù)查詢最后的錯誤,如果錯誤是WSAEWOULDBLOCK 則說明 有阻塞,而 CSocket 絕不會返回 WSAEWOULDBLOCK,因?yàn)樗约汗芾碜枞? CSocket 類編程模型 使用 CSocket 對象涉及 CArchive 和 CSocketFile 類對象。 構(gòu)造一個 CSocket 對象。在客戶方程序中,除非需要數(shù)據(jù)報套接字, Create()函數(shù)一般情況下應(yīng)該使用默認(rèn)參數(shù)。需要注意的是,Carchive 類對象不能與數(shù)據(jù)報( UDP)套接字一起工作,因此對于數(shù)據(jù)報套接字,CAsyncSocket 和 CSocket 的使用方法是一樣的。請注意 Accept()成員函數(shù)需要一個新的并且為空的 CSocket 對象作為它的參數(shù),解釋同上。 為接收和發(fā)送數(shù)據(jù)各產(chǎn)生一個 CArchive 對象,把它們與 CSocketFile對象關(guān)聯(lián)起來。 使用 CArchive 對象的 Read()、 Write()等函 數(shù)在客戶與服務(wù)方傳送數(shù)據(jù)。 MCI向Windows 提供高層次的,獨(dú)立于設(shè)備的,控制各種多媒體設(shè)備的命令。 對 MCI 的訪問可以通過兩種方式:一種是使用消息命令接口函數(shù);另一種是使用字符串接口函數(shù)。但是任何一種方式都可以達(dá)到同樣 的效果。這種方式主要有兩個函數(shù) MciSendString和 MciGetErrorString。一條基于消息的 MCI 命令包括四部分: MCI設(shè)備標(biāo)記、控制消息參數(shù)、消息標(biāo)記、消息數(shù)據(jù)結(jié)構(gòu)指針。 就 MCI 的使用五子棋游戲中,使用基于消息命令接口函數(shù)的編程方 式, MCI編程具體實(shí)現(xiàn)如下: //音樂文件選擇對話框 CString strFileName。 CFileDialog file(TRUE,OFN_FILEMUSTEXIST,(LPCTSTR)sFilter)。//變量取得文件路徑 } = (())。mciOpen)。//取得播放設(shè)備 mciSendCommand(m_wDeviceID,MCI_PLAY,0,(DWORD)(LPVOID)amp。// 播放音樂 mciSendCommand(m_wDeviceID,MCI_STOP,0,NULL)。當(dāng)服務(wù)器端運(yùn)行時會自動偵察是否有客戶端運(yùn)行,并自動接入開始游戲。 ? 音樂播放 現(xiàn)在游戲中已經(jīng)很難找到是無聲游戲的,多媒體就成了一個游戲 不可缺少的一部分。聲音是提高游戲娛樂性中不可缺少的一環(huán)。當(dāng)游戲中用戶長時間沒有下棋會提示用戶該下棋,當(dāng)對方長時間沒有下棋會提示用戶是否繼續(xù)。本畢業(yè)設(shè)計通過策劃、實(shí)現(xiàn)、測試等游戲開發(fā)的一般流程。 客戶端模塊:負(fù)責(zé)連接到服務(wù)器并處理和服務(wù)器的會話。 視圖控制模塊:負(fù)責(zé)控制整個程序的操作,負(fù)責(zé)處理用戶的輸入和游戲的界面繪制。 效果如圖 32: 圖 32 五子棋游戲(網(wǎng)絡(luò)版)效果圖 4 五子棋游戲(網(wǎng)絡(luò)版)設(shè)計 五子棋游戲( 網(wǎng)絡(luò)版)流程 圖 41 五子棋游戲(網(wǎng)絡(luò)版)流程圖 五子棋游戲(網(wǎng)絡(luò)版)功能設(shè)計方案 主要類介紹 CServerSocket 類:是一個專門用來監(jiān)聽客戶端連接的 Socket 類。這個 Socket對象將負(fù)責(zé)監(jiān)聽網(wǎng)絡(luò)上有沒有客戶端連接到來。當(dāng)游戲運(yùn)行,選擇了連接服務(wù)器之后,即調(diào)用本類來初始一個 Socket 對象。 CMessg 類:是一個數(shù)據(jù)類,它發(fā)揮串行化數(shù)據(jù)的作用。 Match 類:是一個規(guī)則類,它負(fù)責(zé)游戲規(guī)則的處理。 CFiveChessView 類:是游戲的主視圖類。以及鼠標(biāo)消息的處理。在游戲中,選擇打開連接服務(wù)器時,彈出來的連接服務(wù)器對話框。在游戲中,選擇打開開啟服務(wù)器時,彈出的開啟服務(wù)器對話框。當(dāng)然了它實(shí)現(xiàn)了播放和關(guān)閉,也就是線程的開啟和終止。所需要的參數(shù)從對話框中取得,如圖 43: 圖 43 服務(wù)器端設(shè)置圖 CServerSocket 類需要聲明一個主視圖指針,為接受連接函數(shù)服務(wù)。當(dāng)用戶選擇“開啟服務(wù)器”功能時,程序就會工作在服務(wù)器端模式,并且不停的監(jiān)聽是否有客戶端的連接。 BOOL CServerSocket::Init(UINT port, CFiveChessView* view) { m_uPort=port。 if(Create(m_uPort)==FALSE) //創(chuàng)建 SOCKET {AfxMessageBox(Server Socket Create Error)。 } if(thisListen()==FALSE) //監(jiān)聽 SOCKET { AfxMessageBox(Server Listen Error)。 } return TRUE。 m_viewProcessPendingAccept()。她繼承于 CSocket,負(fù)責(zé)響應(yīng) OnReceive 和 OnClose 消息。網(wǎng)絡(luò)數(shù)據(jù)由 CMessg 對象構(gòu)成。類初始化成員 Init 函數(shù)負(fù)責(zé) Socket 和串行化相關(guān)的初始化;成員函數(shù) GetIpAddress 用于獲得本地 IP;成員函數(shù) GetLocalHostName 用于獲得本地計算機(jī)名稱;當(dāng)連接上服務(wù)器以后,使用 SendMessage(CMessg * msg) 發(fā)送消 息, 或者 使用 OnReceive(int nErrorCode)接收對方發(fā)送過來的數(shù)據(jù),并對數(shù)據(jù)進(jìn)行處理。 void CClientSocket::OnReceive(int nErrorCode) { CSocket::OnReceive(nErrorCode)。 (*m_aSessionIn)。//輪到我下 m_viewInvalidate(FALSE)。//對方贏 m_viewm_bOver=TRUE。 AfxMessageBox(SORRY,你輸了 )。 } BOOL CClientSocket::SendMessage(CMessg * msg) { if (m_aSessionOut != NULL) { msgSerialize(*m_aSessionOut)。//直接發(fā)送 return TRUE。 CloseSocket()。 } } 網(wǎng)絡(luò)信息 —— CMessg 類的實(shí)現(xiàn) 這是一個數(shù)據(jù)類,繼承于 。 int m_x。 其中 m_turn 表示輪到誰走棋; m_x 表示落子的水平位置; m_y 表示落子的豎直位置。 其中數(shù)據(jù)串行化實(shí)現(xiàn)如下: void CMessg::Serialize(CArchiveamp。 ar m_x。 } else { ar m_turn。 ar m_y。在 Match 中保存著一個當(dāng)前的棋盤,用的一個 chessboard[LW][LW]。 Match負(fù)責(zé)是否能下子,是否有人贏棋。既然 Match 中保存著一個當(dāng)前棋盤,那就需要有一個判斷的成員函數(shù),只有 chessboard 為 0 時才能落子,類中使用成員函數(shù) CanDown(int x,int y,int who)判斷能否落子。最后還有一個清除棋盤也就是把所有的 chessboard 全部設(shè)置為 0的函數(shù) Clear。amp。amp。amp。amp。amp。amp。amp。amp。amp。amp。amp。amp。 for(i=0。i++) for(j=0。j++) { if(chessboard[i][j]==who) { if(j+4LW)//水平 { if(chessboard[i][j+1]==whoamp。chessboard[i][j+2]==whoamp。chessboard[i][j+3]==whoamp。chessboard[i][j+4]==who) { for(int k=0。k++) { pos[k][0]=i。 } return TRUE。 } 主界面 —— CFiveChessView 類的實(shí)現(xiàn) CFiveChessView 是程序的主視圖類。它實(shí)現(xiàn)了棋盤、棋子的繪制之外,程序界面的美化,還有鼠標(biāo)消息的處理等。其中狀態(tài)變量包括 m_bIsClient 表示是否客戶端、m_bIsInit 表示是否已經(jīng)初試化、 m_bWin m_bOver 表示是否結(jié)束、 m_turn 表示輪到誰走棋等。 開始游 戲時有作為客戶端運(yùn)行的 “連接服務(wù)器”或者作為服務(wù)器端“開啟服務(wù)器”兩個選項。這里直接調(diào)用 CServerSocket 類創(chuàng)建一個 socket 監(jiān)聽端口。 //服務(wù)器端口設(shè)置對話框 if(()==IDOK) { m_bIsClient=FALSE。//已經(jīng)初試化 m_port=。//開始監(jiān)聽端口 } } 服
點(diǎn)擊復(fù)制文檔內(nèi)容
研究報告相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖鄂ICP備17016276號-1