之列。
近几年来,由于3D硬体绘图技术的突破,使得即时描绘的书面越来越精致,而且3D游戏性更多元化更逼近真实世界,因此在遊戏产业中,3D 游戏已经逐渐取代2D游戏为游戏市场的主流,即使是网络游戏,也慢慢趋向3D化。然而游戏3D化将会带来的游戏开发上的困难等问题,这些问题以后都需要逐步解决。
2.3 开发目的及意义
使用VC++开发一个极受大众欢迎的棋类游戏-网络五子棋游戏作为学习和掌握VC++的方法,从中学习VC++开发软件所要经历的过程,以便在以后的工作中能够熟练的掌握程序开发所具备的条件,选择网络五子棋这个课题是因为五子棋在中国的历史已经相当悠久,几乎人人都会玩,具有广阔的市场前景。
2.4 任务概述
本课题的主要任务为基于互联网络游戏娱乐而设计的,游戏的两种模式(单机版与网络版)给用户提供了不同的体验,网络聊天功能也给玩家提供了一个沟通平台,这也是与其他类别游戏的本质区别所在。本设计主要功能实现包含悔棋、和棋、认输、聊天、单机游戏与网络对战游戏、战绩统计、音乐欣赏以及优美的外观设计给用户提供了更好的选择权利、视觉效果以及更强的娱乐感;其中:
(1) 单人游戏模式,玩家与事先通过算法设置好的各种程序对弈。 (2) (3)
网络对弈模式,玩家通过网络IP绑定建立联接实现双方对弈。
更改玩家姓名功能,当玩家想在网络上下棋给时给自己取过好听的有吸引力的名字就可以通过此功能实现。 (4) (5) (6)
战绩统计功能,用来统计玩家在一定时间段的输赢情况。 关于功能,用来显示版权信息。
附加功能,当玩家累了想放松下就可以通过此功能来放些音乐听或者更改一下背景图案。 (7)
悔棋功能,在不同的游戏模式下悔棋的方式不同,在人机对弈模式下计算机允许玩家自由悔棋,而在网络对弈模式下则要向对方发送请求才能实现。 (8)
和棋功能,此功能是针对网络对弈模式下设计的,当玩家由于各种原因不能定输赢时就可以通过此功能向对方请求和棋。 (9)
认输功能,当玩家觉得自己败局已定时为了节约时间可以通过此功能向对方请求认输。
(10) 聊天功能,通过MFC的网络编程实现,双方可以通过此功能在下棋时互相交
- 3 -
流经验或感情。
本设计基于面向对象VC++程序设计,具有良好的通用性、兼容性、可操作性、可扩展性等,程序所有功能都做到风格统一、设计精巧、美观大方、能体现专业的美工和窗口设计水准;所有功能操作做到便捷实用能够对用户的各种操作提供友好提示;系统的设计和实施应遵循各类网络协议和国际标准,具备良好的开放性,充分考虑系统的可扩展性。
3 开发环境及运行环境
3.1 开发环境
(1) Intel? Pentium? 4 2.0GHz,512M内存,80G硬盘。 (2) Microsoft? Windows? 2000 Professional. (3) Microsoft? Visual C++ 6.0.
(4) Microsoft? Developer Network for Visual Studio.NET 2006. (5) Visual Assist X 10.1.1301.0.
3.2 运行环境
(1) Intel? Pentium? 2及以上处理器,32M以上内存,4G以上硬盘。 (2) Microsoft? Windows? 9X/NT操作系统。 (3) 800*600或以上的屏幕分辨率。
4 软件架构
考虑到整个的下棋过程(无论对方是电脑抑或其他网络玩家)可以分为:己方落子、等待对方落子、对方落子、设置己方棋盘数据这一系列过程,因此一人游戏类、二人游戏类和棋盘类之间的关系参考了AbstractFactory(抽象工厂)模式,以实现对两个不同模块进行一般化的控制。
软件的总体架构如图1:
一人游戏类 游戏类指针 棋盘类 主界面
- 4 -
二人游戏类 用户 图1 软件架构 Figure 1 software architecture
4.1 棋盘类
整个架构的核心部分,类名为CTable。封装了棋盘的各种可能用到的功能,如保存棋盘数据、初始化、判断胜负等。用户操作主界面,主界面与CTable进行交互来完成对游戏的操作。
4.2 游戏模式类
用来管理人机对弈/网络对弈两种游戏模式,类名为CGame。CGame是一个抽象类,经由它派生出一人游戏类COneGame和网络游戏类CtwoGame 。
这样,CTable类就可以通过一个CGame类的指针,在游戏初始化的时候根据具体游戏模式的要求实例化COneGame或CTwoGame类的对象;然后利用多态性,使用CGame类提供的公有接口就可以完成不同游戏模式下的不同功能了。如图2:
COneGame 图2 CGame类派生关系
Figure 2 CGame derived class relationship
CTwoGame 抽象类CGame 5 棋盘类——CTable
5.1 主要成员变量说明
5.1.1 网络连接标志——m_bConnected
用来表示当前网络连接的情况,在网络对弈游戏模式下客户端连接服务器的时候用来判断是否连接成功;事实上它也是区分当前游戏模式的唯一标志。 5.1.2 棋盘等待标志——m_bWait与m_bOldWait
由于在玩家落子后需要等待对方落子,m_bWait标志就用来标识棋盘的等待状态。当m_bWait为TRUE时,是不允许玩家落子的。
在网络对弈模式下,玩家之间需要互相发送诸如悔棋、和棋这一类的请求消息,
- 5 -
在发送请求后等待对方回应时,也是不允许落子的,所以需要将m_bWait标志置为TRUE。在收到对方回应后,需要恢复原有的棋盘等待状态,所以需要另外一个变量在发送请求之前保存棋盘的等待状态做恢复之用,也就是m_bOldWait。
等待标志的设置,由成员函数SetWait和RestoreWait完成。 5.1.3 网络套接字——m_sock和m_conn
在网络对弈游戏模式下,需要用到这两个套接字对象。其中m_sock对象用于做服务器时的监听之用,m_conn用于网络连接的传输。 5.1.4 棋盘数据——m_data
这是一个15*15的二维数组,用来保存当前棋盘的落子数据。其中对于每个成员来说,0表示落黑子,1表示落白子,-1表示无子。 5.1.5 游戏模式指针——m_pGame
这个CGame类的对象指针是CTable类的核心内容。它所指向的对象实体决定了CTable在执行一件事情时候的不同行为,具体的内容请参见“游戏模式”一节。
5.2 主要成员函数说明
5.2.1 套接字的回调处理——Accept、Connect、Receive
本程序的套接字派生自MFC的CAsyncSocket类,CTable的这三个成员函数就分别提供了对套接字回调事件OnAccept、OnConnect、OnReceive的实际处理,其中尤以Receive成员函数重要,它之中包含了对所有网络消息的分发处理。 5.2.2 清空棋盘——Clear
在每一局游戏开始的时候都需要调用这个函数将棋盘清空,也就是棋盘的初始化工作。此函数主要完成以下几件事情:
(1) 将m_data中每一个落子位都置无子状态为-1。
(2) 按照传入的参数设置棋盘等待标志m_bWait,以供先、后手的不同情况之用。 (3) 使用delete将m_pGame指针所指向的原有游戏模式对象从堆上删除。 5.2.3 绘制棋子——Draw
此函数根据参数给定的坐标和颜色绘制棋子。绘制的详细过程如下: (1) 将给定的棋盘坐标换算为绘图的像素坐标。 (2) 根据坐标绘制棋子位图。
(3) 如果先前曾下过棋子,则利用R2_NOTXORPEN将上一个绘制棋子上的最后落子指示矩形擦除。
(4) 在刚绘制完成的棋子四周绘制最后落子指示矩形。
- 6 -
5.2.4 左键消息——OnLButtonUp
作为棋盘唯一响应的左键消息,也需要做不少的工作:
(1) 如果棋盘等待标志m_bWait为TRUE,则直接发出警告声音并返回,即禁止落子。
(2) 如果点击时的鼠标坐标在合法坐标(0, 0)~(14, 14)之外亦禁止落子。 (3) 如果走的步数大于1步,方才允许悔棋。
(4) 进行胜利判断,如胜利则修改UI状态并增加胜利数的统计。 (5) 如未胜利,则向对方发送已经落子的消息。
(6) 落子完毕,将m_bWait标志置为TRUE,开始等待对方回应。 5.2.5 绘制棋盘——OnPaint
每当WM_PAINT消息触发时,都需要对棋盘进行重绘。OnPaint作为响应绘制消息的消息处理函数使用了双缓冲技术,减少了多次绘图可能导致的图像闪烁问题。此函数主要完成以下工作:
(1) 装载棋盘位图并进行绘制。 (2) 根据棋盘数据绘制棋子。 (3) 绘制最后落子指示矩形。 5.2.6 对方落子完毕——Over
在对方落子之后,仍然需要做一些判断工作
(1) 如果落子坐标在合法坐标(0, 0)~(14, 14)之外亦禁止落子。 (2) 如果走的步数大于1步,方才允许悔棋。
(3) 进行胜利判断,如胜利则修改UI状态并增加胜利数的统计。 (4) 如未胜利,则向对方发送已经落子的消息。
(5) 落子完毕,将m_bWait标志置为TRUE,开始等待对方回应。 5.2.7 设置游戏模式——SetGameMode
这个函数通过传入的游戏模式参数对m_pGame指针进行了初始化,代码如下: void CTable::SetGameMode( int nGameMode ) {
if ( 1 == nGameMode )
m_pGame = new COneGame( this ); else
m_pGame = new CTwoGame( this );
- 7 -