毕业设计(论文)-基于WEB的五子棋游戏设计.doc_第1页
毕业设计(论文)-基于WEB的五子棋游戏设计.doc_第2页
毕业设计(论文)-基于WEB的五子棋游戏设计.doc_第3页
毕业设计(论文)-基于WEB的五子棋游戏设计.doc_第4页
毕业设计(论文)-基于WEB的五子棋游戏设计.doc_第5页
已阅读5页,还剩24页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

基于WEB的五子棋游戏设计摘 要网络游戏的出现代表了一种全新娱乐方式的诞生。目前网络游戏正以其独特的魅力吸引着众多的玩家。随着游戏产业的蓬勃发展,将需要越来越多的人加入到游戏开发中来。本毕业设计所完成的五子棋游戏(网络版)是在Windows XP下使用Microsoft Visual C+6.0开发的C/S系统,可以实现网络间的双人对战,并且可以提供多媒体播放功能。系统的多媒体播放功能可以播放MP3、WMA等主流格式的音乐。本论文从基本网络套节字开始入手,介绍了一些本系统相关的理论知识,随后详细介绍了五子棋游戏(网络版)的开发过程。包括服务器端、客户端的socket编程,五子棋服务器和客户端通信的实现,五子棋判断算法的实现,主界面视图,多媒体播放以及定时器等附加功能的实现。最后对系统进行测试并对所做工作进行总结。关键词:网络游戏;五子棋;VC;WinSocket;MCI The Design and Development of the on -line Black&White GameAbstractOn-line games bring to a new form of entertainment. Until now, on-line games is charming more and more players. As the development of game industry, there will be more and more developers join in the game development team.The on -line Black&White game was developed by Microsoft Visual C+6.0 on Windows XP platform. In this game, two people can play the game on line, and the game also provides multimedia player function.The thesis start with introduction of network socket programming, the development processing of the on -line Black&White game are introduced in detail as followed. The thesis have a full touch on server and client socket programming, the communication between server and client was implemented, the algorithm of the five-in-a-row game, the multimedia playback functions.Key words: On-line games; Black&White game; VC; WinSocket; MCI目 录论文总页数:27页1引言11.1网络游戏背景11.2五子棋游戏现状及研究意义12游戏开发环境介绍12.1环境介绍12.2Visual C+6.0介绍12.3OSI模型介绍22.4TCP/IP模型介绍22.5Winsock技术32.5.1Winsock编程流程简介32.5.2CAsyncSocket类介绍42.5.3CSocket类介绍52.5.4多媒体MCI接口介绍63五子棋游戏(网络版)研究方法73.1五子棋游戏(网络版)需求分析73.2五子棋游戏(网络版)研究思路84五子棋游戏(网络版)设计94.1五子棋游戏(网络版)流程94.2五子棋游戏(网络版)功能设计方案94.2.1主要类介绍94.2.2主要类的工作示意图104.3五子棋游戏实现104.3.1游戏连接CServerSocket类的实现104.3.2游戏连接CClientSocket类的实现124.3.3网络信息CMessg类的实现144.3.4下棋算法Match类的实现144.3.5主界面CFiveChessView类的实现164.3.6多媒体CSoundThread类的实现224.3.7定时器的实现235游戏测试245.1五子棋下棋功能测试245.2音乐播放测试245.3定时器以及其他响应测试25结 论25参考文献25致 谢26声 明271 引言1.1 网络游戏背景中国民族原创网络游戏为中国网络游戏产业所做出了巨大贡献,民族原创网络游戏已经成为产业发展的主导力量。同样在中国自主研发的民族原创网络游戏已经真正成为中国游戏市场的主导力量。网络游戏是通过信息网络传播和实现的互动娱乐形式,是一种网络与文化相结合的产业。近年来,网络文化市场发展很快,随着互联网的迅速普及、宽带的接入社区和家庭,我国网络游戏市场发展迅速并进入了一个高速增长期,并已经创造了较大的产值,带动了相关产业的发展,对促进我国网络经济和娱乐业的发展、丰富互联网时代人民群众的文化娱乐生活起到了积极作用。1.2 五子棋游戏现状及研究意义如今网络上的提供免费五子棋游戏,大多数是单机版的,界面单一,功能单一。本系统将实现在网络上对战的五子棋功能;同时还整合多媒体功能;还对在下棋界面美化,以及下棋中可能出现的意外进行了处理。这样五子棋休闲游戏将不在是一个功能单一界面枯燥的无声游戏,而是一个较完善的休闲游戏。2 游戏开发环境介绍2.1 环境介绍 操作系统:Microsoft Windows XP程序语言:C+开发工具:Visual C+6.02.2 Visual C+6.0介绍Visual C+6.0自诞生以来,一直是Windows环境下最主要的应用开发系统之一。Visual C+不仅是C+语言的集成开发环境,而且与Win32紧密相连,所以,利用Visual C+可以完成各种各样的应用程序的开发,从底层软件直到上层直接面向用户的软件。而且,Visual C+强大的调试功能的为大型复杂软件的开发提供了有效的排错手段。进入90年代以来,随着多媒体技术和图形图像技术的不断发展,可视化(Visual)技术得到广泛的重视,越来越多计算机专业人员和非专业人员都开始研究并应用可视化技术。所谓可视化技术,一般是指软件开发阶段的可视化和计算机图形技术和方法的应用。可视化编程就是软件开发阶段的可视化。Visual C+6.0是一个很好的可视化编程工具,使用Visual C+6.0环境来开发Windows应用程序大大缩短了开发时间,而且它的界面更友好,便于程序员操作。开发环境是程序员同Visual C+的交互界面,通过它程序员可以访问C+源代码编辑器、资源编辑器,使用内部调试器,并且可以创建工程文件。2.3 OSI模型介绍OSI是Open System Interconnect的缩写,意为开放式系统互联。国际标准组织(国际标准化组织)制定了OSI模型。这个模型把网络通信的工作分为7层,分别是物理层,数据链路层,网络层,传输层,会话层,表示层和应用层。1至4层被认为是低层,这些层与数据移动密切相关。5至7层是高层,包含应用程序级的数据。每一层负责一项具体的工作,然后把数据传送到下一层。如图1-1:图1-1 OSI模型图2.4 TCP/IP模型介绍TCP/IP是Transmission Control Protocol/Internet Protocol(传输控制协议互联网协议)的缩写。TCP/IP协议使用范围极广,许多厂商的计算机操作系统和网络操作系统产品都采用或含有TCP/IP协议。TCP/IP协议已成为目前事实上的国际标准和工业标准。TCP/IP也是一个分层的网络协议,不过它与OSI模型所分的层次有所不同。TCP/IP从底至顶分为链路层、网络层、传输层、应用层等4个层次。TCP/IP的分层情况如图1-2所示。图1-2 TCP/IP模型图2.5 Winsock技术 2.5.1 Winsock编程流程简介下面介绍一下Win32平台的Winsock编程方法。通讯则必须有服务器端和客户端。简单介绍tcp服务器端的大体流程。 int WSAStarup( WORD wVersionRequested , LPWSADATA lpWsAData )SOCKET socket( int af , int type , int protocol );当调用了socket()接口函数创建了一个套接字后,必须把套接字与需要进行通讯的地址建立联系。int bind(SOCKET s , const struct sockaddr FAR* name , int namelen ) ;struct sockaddr_inshort sin_family ;u_short sin_prot ;struct in_addr sin_addr ;char sin_sero8 ;就包含了需要建立连接的本地的地址,包括地址族,ip和端口信息;Winsock API提供了几个函数,把主机字节转化成网络字节的函数;u_long htonl( u_long hostlong );u_short htons( u_short hostshort );把网络字节转化成主机字节的函数;u_long ntohl( u_long netlong ) ;u_short ntohs( u_short netshort ) ;当绑定完成之后,服务器端必须建立一个监听的队列来接收客户端的连接请求。int listen( SOCKET s ,int backlog );如果客户端有了连接请求,还必须使用int accept( SOCKET s , struct sockaddr FAR* addr , int FAR* addrlen )来接受客户端的请求。现在基本上已经完成了一个服务器的建立,而客户端的建立的流程则是初始化WinSock ,然后创建socket套接字,再使用int connect( SOCKET s , const struct sockaddr FAR* name , int namelen ) 来连接服务端。当服务器端和客户端建立连接以后,无论是客户端,还是服务器端都可以使用:int send( SOCKET s , const char FAR* buf , int len , int flags );int recv( SOCKET s , char FAR* buf , int len , int flags );函数来接收和发送数据,因为,TCP连接是双向的。当要关闭通讯连结的时候,任何一方都可以调用int shutdown( SOCKET s , int how ) 来关闭套接字的指定功能。再调用int closesocket( SOCKET s) 来关闭套接字句柄。这样一个通讯过程就算完成了。2.5.2 CAsyncSocket类介绍微软的MFC把复杂的WinSock API函数封装到类里,这使得编写网络应用程序更容易。CAsyncSocket类逐个封装了WinSock API,为高级网络程序员提供了更加有力而灵活的方法。这个类基于程序员了解网络通讯的假设,目的是为了在MFC中使用WinSock,程序员有责任处理诸如阻塞、字节顺序和在Unicode与MBCS 间转换字符的任务。CAsyncSocket类编程模型在一个MFC应用程序中,要想轻松处理多个网络协议,而又不牺牲灵活性时,可以考虑使用CAsyncSocket类,它的效率比CSocket 类要高。CAsyncSocket类针对字节流型套接字的编程模型简述如下:1、构造一个CAsyncSocket对象,并用这个对象的Create成员函数产生一个Socket句柄。可以按如下两种方法构造: CAsyncSocket sock; /使用默认参数产生一个字节流套接字Sock.Create(); 或在指定端口号产生一个数据报套接字CAsyncSocket*pSocket=newCAsyncSocket;int nPort=27;pSocket-Create(nPort,SOCK-DGRAM);第一种方法在栈上产生一个CAsyncSocket对象,而第二种方法在堆上产生CAsyncSocket对象;第一种方法中Create()成员函数用缺省参数产生一个字节流套接字,第二种方法中用Create()成员函数在指定的端口产生一个数字报套接字。Create()函数的原型为:BOOL Create( UINT nSocketPort = 0, int nSocketType = SOCK_STREAM,LPCTSTR lpszSocketAddress = NULL );该函数的参数有:1)端口,UINT类型。注意:如果是服务方,则使用一个众所周知的端口供服务方连接;如果是客户方,典型做法是接受默认参数,使套接字可以自主选择一个可用端口。2)socket 类型,可以是SOCK-STREAM(默认值,字节流)或SOCK-DGRAM(数据报)。 3)socket的地址,例如或3。 2、如是客户方程序,用CAsyncSocketConnect()成员函数连接到服务方;如是服务方程序,用CAsyncSocketListen()成员函数开始监听,一旦收到连接请求,则调用CAsyncSocketAccept()成员函数开始接收。注意:CAsyncSocket Accept()成员函数要用一个新的并且是空的CAsyncSocket对象作为它的参数,这里所说的空的指的是这个新对象还没有调用Create()成员函数。 3、调用其他的CAsyncSocket类的Receive()、ReceiveFrom()、Send()和SendTo()等成员函数进行数据通信。 4、通讯结束后,销毁CAsyncSocket对象。如果是在栈上产生的CAsyncSocket对象,则对象超出定义的范围时自动被析构;如果是在堆上产生,也就是用了new这个操作符,则必须使用delete操作符销毁CAsyncSocket 对象。2.5.3 CSocket类介绍为了给程序员提供更方便的接口以自动处理这些任务,MFC给出了CSocket类,这个类是由CAsyncSocket类继承下来的,它提供了比CAsyncSocket更高层的WinSock API接口。Csocket类和CsocketFile类可以与Carchive类一起合作来管理发送和接收的数据,这使管理数据收发更加便利。CSocket对象提供阻塞模式,这对于Carchive的同步操作是至关重要的。阻塞函数(如Receive()、Send()、ReceiveFrom()、SendTo() 和Accept())直到操作完成后才返回控制权,因此如果需要低层控制和高效率,就使用CasyncSock类;如果需要方便,则可使用Csocket类。一个CSocket对象代表了一个比CAsyncSocket对象更高层次的Windows Socket的抽象,CSocket类与CSocketFile类和CArchive类一起工作来发送和接收数据,因此使用它更加容易使用。CSocket对象提供阻塞模式,因为阻塞功能对于CArchive的同步操作是至关重要的。在这里有必要对阻塞的概念作一解释:一个socket可以处于“阻塞模式”或“非阻塞模式”,当一个套接字处于阻塞模式(即同步操作)时,它的阻塞函数直到操作完成才会返回控制权,之所以称为阻塞是因为此套接字的阻塞函数在完成操作返回之前什么也不能做。如果一个socket处于非阻塞模式(即异步操作),则会被调用函数立即返回。在CAsyncSocket类中可以用GetLastError 成员函数查询最后的错误,如果错误是WSAEWOULDBLOCK则说明有阻塞,而CSocket绝不会返回WSAEWOULDBLOCK,因为它自己管理阻塞。但在CSocket类中,为了利用CArchive 处理通讯中的许多问题和简化编程,它的一些成员函数总是具有阻塞性质的,这是因为CArchive类需要同步的操作。CSocket类编程模型使用CSocket对象涉及CArchive和CSocketFile 类对象。以下介绍的针对字节流型套接字的操作步骤中,只有第3步对于客户方和服务方操作是不同的,其他步骤都相同。 1、构造一个CSocket对象。 2、使用这个对象的Create()成员函数产生一个socket对象。在客户方程序中,除非需要数据报套接字,Create()函数一般情况下应该使用默认参数。而对于服务方程序,必须在调用Create时指定一个端口。需要注意的是,Carchive类对象不能与数据报(UDP)套接字一起工作,因此对于数据报套接字,CAsyncSocket和CSocket 的使用方法是一样的。 3、如果是客户方套接字,则调用CAsyncSocket Connect()函数与服务方套接字连接;如果是服务方套接字,则调用CAsyncSocketListen()开始监听来自客户方的连接请求,收到连接请求后,调用CAsyncSocketAccept()函数接受请求,建立连接。请注意Accept()成员函数需要一个新的并且为空的CSocket对象作为它的参数,解释同上。4、产生一个CSocketFile对象,并把它与CSocket 对象关联起来。5、为接收和发送数据各产生一个CArchive 对象,把它们与CSocketFile对象关联起来。切记CArchive是不能和数据报套接字一起工作的。 6、使用CArchive对象的Read()、Write()等函数在客户与服务方传送数据。7、通讯完毕后,销毁CArchive、CSocketFile和CSocket对象2.5.4 多媒体MCI接口介绍多媒体控制接口MCI是MicroSoft Windows定义的多媒体接口标准。MCI向Windows提供高层次的,独立于设备的,控制各种多媒体设备的命令。MCI可以在C语言中直接调用函数库。对MCI的访问可以通过两种方式:一种是使用消息命令接口函数;另一种是使用字符串接口函数。它们的不同之处在于有着不用的命令结构和发送消息到多媒体设备的不同原理。但是任何一种方式都可以达到同样的效果。基于字符串多媒体控制接口的编程方式,通过向设备发送字符串实现对多媒体设备的控制。这种方式主要有两个函数MciSendString和MciGetErrorString。基于消息命令接口函数的编程方式,也就是游戏设计中采用的方式。一条基于消息的MCI命令包括四部分:MCI设备标记、控制消息参数、消息标记、消息数据结构指针。这种方式有三个核心函数MciSendCommand、MciGetDeviceID、MciGetErrorString。就MCI的使用五子棋游戏中,使用基于消息命令接口函数的编程方式,MCI编程具体实现如下:/音乐文件选择对话框CString strFileName;CString sFilter=MP3文件(*.mp3)|*.mp3|Wav 文件(*.wav)|*.wav|WMA文件(*.wma)|*.wma|;CFileDialog file(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 五子棋游戏(网络版)需求分析l 五子棋游戏基本功能该功能为程序设计的最基本的功能,程序有服务器端和客户端。当服务器端运行时会自动侦察是否有客户端运行,并自动接入开始游戏。当用户五子连成一线时即赢。l 音乐播放现在游戏中已经很难找到是无声游戏的,多媒体就成了一个游戏不可缺少的一部分。该功能是多媒体播放功能,在用户游戏时候能随意播放自己喜欢的音乐。声音是提高游戏娱乐性中不可缺少的一环。l 扩展功能在游戏中当下棋位置不对或者还没有轮到本机下棋能提示用户相应信息。当游戏中用户长时间没有下棋会提示用户该下棋,当对方长时间没有下棋会提示用户是否继续。设想如下图3-1:图3-1 五子棋设想图3.2 五子棋游戏(网络版)研究思路本毕业设计是利用VC 6.0这一集成开发工具,在Windows环境下开发一款休闲网络游戏。本毕业设计通过策划、实现、测试等游戏开发的一般流程。游戏设计是按如下功能模块的设计思路来安排的:l 五子棋游戏设计可以分成如下几个模块:服务器模块:负责建立游戏服务器并接受客户端的连接和处理客户端的数据。客户端模块:负责连接到服务器并处理和服务器的会话。游戏规则模块:负责游戏的控制和结果的判断,使游戏按规则进行。视图控制模块:负责控制整个程序的操作,负责处理用户的输入和游戏的界面绘制。l 多媒体功能设计模块:音频播放模块:负责播放MP3,WMA等格式的音乐。效果如图3-2:图3-2 五子棋游戏(网络版)效果图4 五子棋游戏(网络版)设计4.1 五子棋游戏(网络版)流程图4-1 五子棋游戏(网络版)流程图4.2 五子棋游戏(网络版)功能设计方案4.3 五子棋游戏实现4.3.1 游戏连接CServerSocket类的实现这是一个专门用来监听客户端连接的Socket类,它继承于CSocket,响应OnAccept消息。所需要的参数从对话框中取得,如图4-3:图4-3 服务器端设置图CServerSocket类需要声明一个主视图指针,为接受连接函数服务。并且在类成员函数Init(UINT port, CFiveChessView* dlg)中负责监听SOCKET和创建SOCKET。当用户选择“开启服务器”功能时,程序就会工作在服务器端模式,并且不停的监听是否有客户端的连接。当有监听客户端的连接消息时,OnAccept函数响应。BOOL CServerSocket:Init(UINT port, CFiveChessView* view)m_uPort=port;m_view=view;if(Create(m_uPort)=FALSE) /创建SOCKETAfxMessageBox(Server Socket Create Error);return FALSE;if(this-Listen()=FALSE) /监听SOCKETAfxMessageBox(Server Listen Error);return FALSE;return TRUE;void CServerSocket:OnAccept(int nErrorCode) /授受客户端请求CSocket:OnAccept(nErrorCode);m_view-ProcessPendingAccept();/调用视图类中连接处理函数4.3.2 游戏连接CClientSocket类的实现这是一个专门用做会话类,它负责数据的发送和接受。她继承于CSocket,负责响应OnReceive和OnClose消息。另外,作为CSocket类的继承类,当然采用了串行化方式来处理网络数据。网络数据由CMessg对象构成。连接服务器所需参数通过对话框获得,如图4-4:图4-4 客户端设置图CClientSocket类中需要数据串行化网络数据。类初始化成员Init函数负责Socket和串行化相关的初始化;成员函数GetIpAddress用于获得本地IP;成员函数GetLocalHostName用于获得本地计算机名称;当连接上服务器以后,使用SendMessage(CMessg * msg) 发送消息,或者使用OnReceive(int nErrorCode)接收对方发送过来的数据,并对数据进行处理。当关闭客户端Socket是使用成员函数CloseSocket关闭。void CClientSocket:OnReceive(int nErrorCode) CSocket:OnReceive(nErrorCode);doCMessg temp;temp.Serialize(*m_aSessionIn);/输入数据串行化/判断对方发送过来的数据是否是落子的位置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();BOOL CClientSocket:SendMessage(CMessg * msg)if (m_aSessionOut != NULL)msg-Serialize(*m_aSessionOut);/输出串行化m_aSessionOut-Flush();/直接发送return TRUE;else/对方关闭了连接m_bClose=true;CloseSocket();return FALSE;4.3.3 网络信息CMessg类的实现这是一个数据类,继承于CObject.它主要负责串行化数据的作用。CMessg类主要的成员变量:intm_turn;intm_x;intm_y;其中m_turn表示轮到谁走棋;m_x 表示落子的水平位置;m_y表示落子的竖直位置。这3个数据就是网络要传的数据。其中数据串行化实现如下:void CMessg:Serialize(CArchive& ar)if (ar.IsStoring()ar m_turn;ar m_x;ar m_turn;ar m_x;ar m_y;4.3.4 下棋算法Match类的实现这是一个规则类,它负责规则的处理。在Match中保存着一个当前的棋盘,用的一个chessboardLWLW。如果数组元素为0,则表示没有棋子;如果为1,则表示有黑子,如果为2,则为白子。Match负责是否能下子,是否有人赢棋。Match中类LW定为19,表示有19行19列。既然Match中保存着一个当前棋盘,那就需要有一个判断的成员函数,只有chessboard为0时才能落子,类中使用成员函数CanDown(int x,int y,int who)判断能否落子。并且有一个判断是否赢的成员函数IsWin(int who,int pos52);其中pos52为记录赢的关键棋子。最后还有一个清除棋盘也就是把所有的chessboard全部设置为0的函数Clear。算法执行出来的结果,如图4-5:图4-5 赢棋图五子棋的核心算法IsWin主要是判断了水平、垂直、东南、东北四个方向是否有五子相连;它们判定条件可以表示为;水平:chessboardij+1=who&chessboardij+2=who&chessboardij+3=who&chessboardij+4=who垂直:chessboardi+1j=who&chessboardi+2j=who&chessboardi+3j=who&chessboardi+4j=who东南:chessboardi+1j+1=who&chessboardi+2j+2=who&chessboardi+3j+3=who&chessboardi+4j+4=who东北:chessboardi-1j+1=who&chessboardi-2j+2=who&chessboardi-3j+3=who&chessboardi-4j+4=who作为说明,以水平方向判定为例子;BOOL Match:IsWin(int who,int pos52)int i,j;for(i=0;iLW;i+)for(j=0;jLW;j+)if(chessboardij=who)if(j+4LW)/水平if(chessboardij+1=who&chessboardij+2=who&chessboardij+3=who&chessboardij+4=who)for(int k=0;k5;k+)posk0=i;posk1=j+k;return TRUE;/垂直,像水平方向那样添加条件即可/东南,像水平方向那样添加条件即可/东北,像水平方向那样添加条件即可return false;4.3.5 主界面CFiveChessView类的实现CFiveChessView是程序的主视图类。CFiveChessView类也是本程序中相当重要的一个类。它实现了棋盘、棋子的绘制之外,程序界面的美化,还有鼠标消息的处理等。显示主界面,如图4-6:图4-6 主界面图首先游戏初始化当然包括Winsock的初始化,获得本机的IP地址,以及相关的状态变量的初始化。其中状态变量包括m_bIsClient表示是否客户端、m_bIsInit表示是否已经初试化、m_bWin m_bOver表示是否结束、m_turn表示轮到谁走棋等。这是因为初始只需要调用一次。开始游戏时有作为客户端运行的 “连接服务器”或者作为服务器端“开启服务器”两个选项。l 当选择作为服务器端“开启服务器”时,游戏创建一个CServerDlg类对话框,并由对话框获得输入的端口号信息,由于在游戏初始化时Winsock已经初始化。这里直接调用CServerSocket类创建一个socket监听端口。程序功能实现如下:void CFiveChessView:OnSetserver() CServerDlg dlg;/服务器端口设置对话框if(dlg.DoModal()=IDOK)m_bIsClient=FALSE;/作为服务器m_bIsInit=TRUE;/已经初试化m_port=dlg.m_iPort;/得到输入端口号m_ListenSocket.Init(m_port,this);/开始监听端口服务器端当监听到有客户端需要连接时,有成员函数ProcessPendingAccept接受客户端的连接处理。ProcessPendingAccept函数实现如下:void CFiveChessView:ProcessPendingAccept()if(m_ListenSocket.Accept(m_ClientSocket)=FALSE)/分配一个会话SOCKETAfxMessageBox(Server Listen Socket Error);return;elsem_who=1;/服务器端用黑子m_ClientSocket.Init(this);/初试化会话SOCKETAfxMessageBox(嘿嘿,有人进来挑战了);l 当选择作为客户端“连接服务器”时,游戏创建一个CClientDlg类对话框,并由对话框获得输入的IP信息、端口号信息,由ClientSocket.Create()创建会话socket,并连接服务器。游戏设计中具体响应函数OnSetclient如下:void CFiveChessView:OnSetclient() / TODO: Add your command handler code hereCClientDlg dlg;int ret=dlg.DoModal();/设置服务器IP和端口if(ret=2000)/用户确定m_bIsClient=TRUE;/作为客户端m_bIsInit=TRUE;m_port=dlg.m_iPort;/得到用户输入的端口号for(int i=0;i15)m_POS0+;/得到点击的Ym_POS1=(point.x-LEFTDIS)/30;/y ,绘图坐标中的xif(point.x-LEFTDIS)%3015)m_POS1+;/得到点击的Xif(m_POS0=LW|m_POS1=LW)return;/这个位置是否可以下if(m_match.CanDown(m_POS0,m_POS1,m_who)=TRUE)Invalidate(FALSE);/重新绘制棋子和棋盘m_turn=m_who%2+1;/轮到对方下棋CMessg msg;msg.m_turn=m_turn;msg.m_x=m_POS0;msg.m_y=m_POS1;m_ClientSocket.SendMessage(&msg);/发送下子的位置/判断是否赢if(m_match.IsWin(m_who,m_winpos)m_bWin=TRUE;m_bOver=TRUE;Invalidate(FALSE);AfxMessageBox(果然是高手,你赢了耶!);elseAfxMessageBox(不要急嘛,别人还没有走了!);CView:OnLButtonDown(nFlags, point);当用户选择菜单“音乐播放”时,音乐播放是新添加了一个播放线程控制播放。这里就需要调用成员函数OnOpen打开文件选择对话框,选择本机上的音乐文件,音乐文件可以是mp3 、wma 、wav格式,并且是自动播放。停止播放是成员函数OnStop。 void CFiveChessView:OnOpen() / TODO: Add your command handler code here /第一次打开播放音乐if(mythread_running = false)mythread_running = true;/线程的状态改为运行mythread=static_cast(AfxBeginThread(RUNTIME_CLASS(CSoundThread);/已经打开过播放,应当关闭原来的线程,在打开新线程else/发送一个消息关闭上播放线程PostThreadMessage(mythread-m_nThreadID,UDM_END_THREAD,0,0);/关闭上一次打开的线程mythread_running = true;/重新开始一个播放线程mythread=static_cast(AfxBeginThread(RUNTIME_CLASS(CSoundThread);void CFiveChessView:OnStop() / TODO: Add your command handler code hereif(mythread_running = true)/关闭播放线程mythread_running = false;PostThreadMessage(mythread-m_nThreadID,UDM_END_THREAD,0,0);/发送/一个关闭播放线程的消息4.3.6 多媒体CSoundThread类的实现CSoundThread是一个多线程类,它负责控制多媒体的播放与停止,还要负责线程的关闭工作。如图4-7:图4-7 音乐播放功能图CSoundThread使用的是MCI消息命令接口函数的编程,使用了自定义消息用于线程外关闭播放线程。BOOL CSoundThread:InitInstance()/音乐文件选择对话框CString strFileName;CString sFilter=MP3文件(*.mp3)|*.mp3|Wav 文件(*.wav)|*.wav|WMA文件(*.wma)|*.wma|;CFileDialog file

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论