1、C+ 五子棋游戏网络版的设计与开发分类号:TP311.5 U D C:D10621-408-(2007) 6021-0密 级:公 开 编 号:2003032110成都信息工程学院学位论文五子棋游戏(网络版)的设计与开发论文作者姓名:彭朝仿申请学位专业:网络工程申请学位类别:工学学士指导教师姓名(职称):王祖俪论文提交日期:2007年06月10日五子棋游戏(网络版)的设计与开发摘 要网络游戏的出现代表了一种全新娱乐方式的诞生。目前网络游戏正以其独特的魅力吸引着众多的玩家。随着游戏产业的蓬勃发展,将需要越来越多的人加入到游戏开发中来。本毕业设计所完成的五子棋游戏(网络版)是在Windows XP下
2、使用Microsoft Visual C+6.0开发的C/S系统,可以实现网络间的双人对战,并且可以提供多媒体播放功能。系统的多媒体播放功能可以播放MP3、WMA等主流格式的音乐。本论文从基本网络套节字开始入手,介绍了一些本系统相关的理论知识,随后详细介绍了五子棋游戏(网络版)的开发过程。包括服务器端、客户端的socket编程,五子棋服务器和客户端通信的实现,五子棋判断算法的实现,主界面视图,多媒体播放以及定时器等附加功能的实现。最后对系统进行测试并对所做工作进行总结。关键词:网络游戏;五子棋;VC;WinSocket;MCI The Design and Development of the
3、 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
4、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
5、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 引
6、言1.1 网络游戏背景中国民族原创网络游戏为中国网络游戏产业所做出了巨大贡献,民族原创网络游戏已经成为产业发展的主导力量。同样在中国自主研发的民族原创网络游戏已经真正成为中国游戏市场的主导力量。网络游戏是通过信息网络传播和实现的互动娱乐形式,是一种网络与文化相结合的产业。近年来,网络文化市场发展很快,随着互联网的迅速普及、宽带的接入社区和家庭,我国网络游戏市场发展迅速并进入了一个高速增长期,并已经创造了较大的产值,带动了相关产业的发展,对促进我国网络经济和娱乐业的发展、丰富互联网时代人民群众的文化娱乐生活起到了积极作用。1.2 五子棋游戏现状及研究意义如今网络上的提供免费五子棋游戏,大多数是单
7、机版的,界面单一,功能单一。本系统将实现在网络上对战的五子棋功能;同时还整合多媒体功能;还对在下棋界面美化,以及下棋中可能出现的意外进行了处理。这样五子棋休闲游戏将不在是一个功能单一界面枯燥的无声游戏,而是一个较完善的休闲游戏。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+可以完成各
8、种各样的应用程序的开发,从底层软件直到上层直接面向用户的软件。而且,Visual C+强大的调试功能的为大型复杂软件的开发提供了有效的排错手段。进入90年代以来,随着多媒体技术和图形图像技术的不断发展,可视化(Visual)技术得到广泛的重视,越来越多计算机专业人员和非专业人员都开始研究并应用可视化技术。所谓可视化技术,一般是指软件开发阶段的可视化和计算机图形技术和方法的应用。可视化编程就是软件开发阶段的可视化。Visual C+6.0是一个很好的可视化编程工具,使用Visual C+6.0环境来开发Windows应用程序大大缩短了开发时间,而且它的界面更友好,便于程序员操作。开发环境是程序员
9、同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是Transmi
10、ssion 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编程方法。通讯则
11、必须有服务器端和客户端。简单介绍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
12、 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 ) ;当绑定完成之后,服务器端必须建立一个监听的队列来接收客户端的连接
13、请求。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 ) 来连接服务端。当服务器端和客户端建立连接以后,无论是客户端,还是服
14、务器端都可以使用: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类介绍微
15、软的MFC把复杂的WinSock API函数封装到类里,这使得编写网络应用程序更容易。CAsyncSocket类逐个封装了WinSock API,为高级网络程序员提供了更加有力而灵活的方法。这个类基于程序员了解网络通讯的假设,目的是为了在MFC中使用WinSock,程序员有责任处理诸如阻塞、字节顺序和在Unicode与MBCS 间转换字符的任务。CAsyncSocket类编程模型在一个MFC应用程序中,要想轻松处理多个网络协议,而又不牺牲灵活性时,可以考虑使用CAsyncSocket类,它的效率比CSocket 类要高。CAsyncSocket类针对字节流型套接字的编程模型简述如下:1、构造一
16、个CAsyncSocket对象,并用这个对象的Create成员函数产生一个Socket句柄。可以按如下两种方法构造: CAsyncSocket sock; /使用默认参数产生一个字节流套接字Sock.Create(); 或在指定端口号产生一个数据报套接字CAsyncSocket*pSocket=newCAsyncSocket;int nPort=27;pSocket-Create(nPort,SOCK-DGRAM);第一种方法在栈上产生一个CAsyncSocket对象,而第二种方法在堆上产生CAsyncSocket对象;第一种方法中Create()成员函数用缺省参数产生一个字节流套接字,第二种
17、方法中用Create()成员函数在指定的端口产生一个数字报套接字。Create()函数的原型为:BOOL Create( UINT nSocketPort = 0, int nSocketType = SOCK_STREAM,LPCTSTR lpszSocketAddress = NULL );该函数的参数有:1)端口,UINT类型。注意:如果是服务方,则使用一个众所周知的端口供服务方连接;如果是客户方,典型做法是接受默认参数,使套接字可以自主选择一个可用端口。2)socket 类型,可以是SOCK-STREAM(默认值,字节流)或SOCK-DGRAM(数据报)。 3)socket的地址,例如
18、或202.193.64.33。 2、如是客户方程序,用CAsyncSocketConnect()成员函数连接到服务方;如是服务方程序,用CAsyncSocketListen()成员函数开始监听,一旦收到连接请求,则调用CAsyncSocketAccept()成员函数开始接收。注意:CAsyncSocket Accept()成员函数要用一个新的并且是空的CAsyncSocket对象作为它的参数,这里所说的空的指的是这个新对象还没有调用Create()成员函数。 3、调用其他的CAsyncSocket类的Receive()、ReceiveFrom()、Send()和SendTo()等成员函数进行数
19、据通信。 4、通讯结束后,销毁CAsyncSocket对象。如果是在栈上产生的CAsyncSocket对象,则对象超出定义的范围时自动被析构;如果是在堆上产生,也就是用了new这个操作符,则必须使用delete操作符销毁CAsyncSocket 对象。2.5.3 CSocket类介绍为了给程序员提供更方便的接口以自动处理这些任务,MFC给出了CSocket类,这个类是由CAsyncSocket类继承下来的,它提供了比CAsyncSocket更高层的WinSock API接口。Csocket类和CsocketFile类可以与Carchive类一起合作来管理发送和接收的数据,这使管理数据收发更加便
20、利。CSocket对象提供阻塞模式,这对于Carchive的同步操作是至关重要的。阻塞函数(如Receive()、Send()、ReceiveFrom()、SendTo() 和Accept())直到操作完成后才返回控制权,因此如果需要低层控制和高效率,就使用CasyncSock类;如果需要方便,则可使用Csocket类。一个CSocket对象代表了一个比CAsyncSocket对象更高层次的Windows Socket的抽象,CSocket类与CSocketFile类和CArchive类一起工作来发送和接收数据,因此使用它更加容易使用。CSocket对象提供阻塞模式,因为阻塞功能对于CArch
21、ive的同步操作是至关重要的。在这里有必要对阻塞的概念作一解释:一个socket可以处于“阻塞模式”或“非阻塞模式”,当一个套接字处于阻塞模式(即同步操作)时,它的阻塞函数直到操作完成才会返回控制权,之所以称为阻塞是因为此套接字的阻塞函数在完成操作返回之前什么也不能做。如果一个socket处于非阻塞模式(即异步操作),则会被调用函数立即返回。在CAsyncSocket类中可以用GetLastError 成员函数查询最后的错误,如果错误是WSAEWOULDBLOCK则说明有阻塞,而CSocket绝不会返回WSAEWOULDBLOCK,因为它自己管理阻塞。但在CSocket类中,为了利用CArch
22、ive 处理通讯中的许多问题和简化编程,它的一些成员函数总是具有阻塞性质的,这是因为CArchive类需要同步的操作。CSocket类编程模型使用CSocket对象涉及CArchive和CSocketFile 类对象。以下介绍的针对字节流型套接字的操作步骤中,只有第3步对于客户方和服务方操作是不同的,其他步骤都相同。 1、构造一个CSocket对象。 2、使用这个对象的Create()成员函数产生一个socket对象。在客户方程序中,除非需要数据报套接字,Create()函数一般情况下应该使用默认参数。而对于服务方程序,必须在调用Create时指定一个端口。需要注意的是,Carchive类对象
23、不能与数据报(UDP)套接字一起工作,因此对于数据报套接字,CAsyncSocket和CSocket 的使用方法是一样的。 3、如果是客户方套接字,则调用CAsyncSocket Connect()函数与服务方套接字连接;如果是服务方套接字,则调用CAsyncSocketListen()开始监听来自客户方的连接请求,收到连接请求后,调用CAsyncSocketAccept()函数接受请求,建立连接。请注意Accept()成员函数需要一个新的并且为空的CSocket对象作为它的参数,解释同上。4、产生一个CSocketFile对象,并把它与CSocket 对象关联起来。5、为接收和发送数据各产生
24、一个CArchive 对象,把它们与CSocketFile对象关联起来。切记CArchive是不能和数据报套接字一起工作的。 6、使用CArchive对象的Read()、Write()等函数在客户与服务方传送数据。7、通讯完毕后,销毁CArchive、CSocketFile和CSocket对象2.5.4 多媒体MCI接口介绍多媒体控制接口MCI是MicroSoft Windows定义的多媒体接口标准。MCI向Windows提供高层次的,独立于设备的,控制各种多媒体设备的命令。MCI可以在C语言中直接调用函数库。对MCI的访问可以通过两种方式:一种是使用消息命令接口函数;另一种是使用字符串接口函
25、数。它们的不同之处在于有着不用的命令结构和发送消息到多媒体设备的不同原理。但是任何一种方式都可以达到同样的效果。基于字符串多媒体控制接口的编程方式,通过向设备发送字符串实现对多媒体设备的控制。这种方式主要有两个函数MciSendString和MciGetErrorString。基于消息命令接口函数的编程方式,也就是游戏设计中采用的方式。一条基于消息的MCI命令包括四部分:MCI设备标记、控制消息参数、消息标记、消息数据结构指针。这种方式有三个核心函数MciSendCommand、MciGetDeviceID、MciGetErrorString。就MCI的使用五子棋游戏中,使用基于消息命令接口函
26、数的编程方式,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.GetB
27、uffer(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.
28、1 五子棋游戏(网络版)需求分析 五子棋游戏基本功能该功能为程序设计的最基本的功能,程序有服务器端和客户端。当服务器端运行时会自动侦察是否有客户端运行,并自动接入开始游戏。当用户五子连成一线时即赢。 音乐播放现在游戏中已经很难找到是无声游戏的,多媒体就成了一个游戏不可缺少的一部分。该功能是多媒体播放功能,在用户游戏时候能随意播放自己喜欢的音乐。声音是提高游戏娱乐性中不可缺少的一环。 扩展功能在游戏中当下棋位置不对或者还没有轮到本机下棋能提示用户相应信息。当游戏中用户长时间没有下棋会提示用户该下棋,当对方长时间没有下棋会提示用户是否继续。设想如下图3-1:图3-1 五子棋设想图3.2 五子棋游戏
29、(网络版)研究思路本毕业设计是利用VC 6.0这一集成开发工具,在Windows环境下开发一款休闲网络游戏。本毕业设计通过策划、实现、测试等游戏开发的一般流程。游戏设计是按如下功能模块的设计思路来安排的: 五子棋游戏设计可以分成如下几个模块:服务器模块:负责建立游戏服务器并接受客户端的连接和处理客户端的数据。客户端模块:负责连接到服务器并处理和服务器的会话。游戏规则模块:负责游戏的控制和结果的判断,使游戏按规则进行。视图控制模块:负责控制整个程序的操作,负责处理用户的输入和游戏的界面绘制。 多媒体功能设计模块:音频播放模块:负责播放MP3,WMA等格式的音乐。效果如图3-2:图3-2 五子棋游
30、戏(网络版)效果图4 五子棋游戏(网络版)设计4.1 五子棋游戏(网络版)流程图4-1 五子棋游戏(网络版)流程图4.2 五子棋游戏(网络版)功能设计方案4.2.1 主要类介绍CServerSocket类:是一个专门用来监听客户端连接的Socket类。当游戏运行,选择了开启服务器之后,即调用本类来初始一个Socket对象。这个Socket对象将负责监听网络上有没有客户端连接到来。CClientSocket类:是一个专门用做会话类,它负责数据的发送和接受。当游戏运行,选择了连接服务器之后,即调用本类来初始一个Socket对象。这个对象是用来连接服务器,它连接上以后,就可以通过他进行数据的交换。C
31、Messg类:是一个数据类,它发挥串行化数据的作用。它就是用来在网络上传输的信息。Match类:是一个规则类,它负责游戏规则的处理。在游戏运行中,它保存着一个二维数组记录当前棋盘的信息,它还负责判断能否在某个位置下棋,是否有人赢棋。CFiveChessView类:是游戏的主视图类。在游戏中它负责在主窗口中绘制盘和棋子。以及鼠标消息的处理。CClientDlg类:是游戏中客户端设置的对话框类。在游戏中,选择打开连接服务器时,弹出来的连接服务器对话框。CServerDlg类:是游戏中服务器端设置的对话框类。在游戏中,选择打开开启服务器时,弹出的开启服务器对话框。CSoundThread类:是游戏中负责多媒体播放的线程类,主要负责音乐播放。当然了它实现了播放和关闭,也就是线程的开启和终止。4.2.2 主要类的工作示意图图4-2 主要类工作示意图4.3 五子棋游戏实现4.3.1 游戏连接CServerSocket类的实现这是一个专门用来监听客户端连接的Socket类,它继承于CSocket,响应OnAccept消息。所需要的参数从对话框中取得,如图4-3:图4-3 服务器端设置图CServerSocket类需要声明一个主视图指针,为接受连接函数服务。并且在
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1