ImageVerifierCode 换一换
格式:DOCX , 页数:30 ,大小:89.48KB ,
资源ID:10275992      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/10275992.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(五子棋分析.docx)为本站会员(b****7)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

五子棋分析.docx

1、五子棋分析一.需求分析1,序言 一款游戏项目的确立是建立在各种各样的需求上面的,这种需求往往来自于玩家的实际需求或者是出于公司自身发展和实力的情况,其中玩家的实际需求也就是说市场需求最为重要.面对对游戏拥有不同知识和理解层面的玩家,项目的负责人(或者游戏制作人)对玩家需求的理解程度,在很大程度上决定了此类游戏开发项目的成败.因此如何更好地的了解,分析,明确玩家需求,并且能够达给参与项目开发的每个成员,保证开发过程按照满足玩家需求为目的正确项目开发方向进行,是每个游戏开发项目管理者需要面对的问题.2,项目背景五子棋是起源于中国古代的传统黑白棋种之一.现代五子棋日文称之为连珠,英译为Renju,英

2、文称之为Gobang或FIR(Five in a Row的缩写),亦有连五子,五子连,串珠,五目,五目碰,五格等多种称谓.五子棋不仅能增强思维能力,提高智力,而且富含哲理,有助于修身养性.五子棋既有现代休闲的明显特征短,平,快,又有古典哲学的高深学问阴阳易理;它既有简单易学的特性,为人民群众所喜闻乐见,又有深奥的技巧和高水平的国际性比赛;它的棋文化源渊流长,具有东方的神秘和西方的直观;既有场的概念,亦有点的连接.它是中西文化的交流点,是古今哲理的结晶.GBA五子棋和其它五子棋类游戏最大的不同就是要发挥GBA的便携性,即在任何地方,任何时间,都能进行五子棋的对战.而由于GBA本身的机能限制有不能

3、像在做大型机PC机游戏那样使用大量的高解析图图片,也不能使用高空间占用率,高时间占用率的人工智能算法.故在考虑用户的需求的同时要充分考虑GBA硬件的机能限制,以免在日后的开发过程中对需求产生不可行的后果.作为一个悠闲的小游戏系统,首先应该为用户提供一套方便的操作方法,在游戏模式,用户操作,反馈信息方面应该有明确的说明,能够让大多数玩家能快速上手.而游戏的界面应尽量做到古典风格,使该游戏看上去不仅是一款悠闲的精品,而把它做成是一款棋类的教学软件,随着版本的不断扩充,最终把游戏作成一本五子棋的百科全书.二.类图主要类棋盘类CTable游戏模式类CGame是否连接网络(客户端使用)BOOL m_bC

4、onnectedm_bOldWait; 先前的等待标志m_bWait; 等待标志m_color; / 玩家颜色m_conn传输用套接字m_sock 传输用套接字 m_data1515; / 棋盘数据m_iml; / 棋子图像*m_pGame; / 游戏模式指针CString m_strAgainst;/ 对方名字CString m_strMe我方名字 Accept( int nGameMode ) 接受连接Back()悔棋Chat( LPCTSTR lpszMsg ) 发送聊天消息Clear( BOOL bWait ) 清空棋盘Connect( int nGameMode ) 主动连接CTab

5、le()构造函数,初始化棋盘数据以及图像数据CTable()析构函数,释放m_pGame指针Draw( int x, int y, int color ) 在指定棋盘坐标处绘制指定颜色的棋子DrawGame()发送和棋请求GetColor() const获取玩家颜色GiveUp()发送认输消息OnLButtonUp( UINT nFlags, CPoint point ) 处理左键弹起消息,为玩家落子之用OnPaint()处理WM_PAINT消息Over()处理对方落子后的工作PlayAgain()发送再玩一次请求Receive()接收来自对方的数据RestoreWait()重新设置先前的等待

6、标志SetColor( int color ) 设置玩家颜色SetData( int x, int y, int color ) 设置棋盘数据,并绘制棋子SetGameMode( int nGameMode ) 设置游戏模式SetMenuState( BOOL bEnable ) 设置菜单状态(主要为网络对战准备)SetWait( BOOL bWait ) 设置等待标志,返回先前的等待标志Win( int color ) const判断指定颜色是否胜利CTable *m_pTable棋子m_StepList落子步骤悔棋操作Back()初始化操作Init()胜利后的处理Win()发送落子消息Se

7、ndStep()接收来自对方的消息ReceiveMsg()三.功能介绍及主要代码1.基本功能介绍集多种功能于一体:游戏包括单人游戏和网络对战.单人游戏有包含玩家先走和电脑先走等功能;网络对战又能实现多人游戏和新建游戏等功能,实现了游戏的空间分享性.而且游戏中又可实现聊天功能,实现了游戏的交互性和互动性,另外游戏中还可以悔棋.退出,和棋,集多种功能于一身.游戏中,玩家可自由设置自己的名字,还可以统计战绩,是一款功能强大的娱乐小游戏,能满足不同人的需求.2软件架构软件的总体架构如图2.1:二人游戏类一人游戏类游戏类指针棋盘类主界面用户图2.1 软件架构考虑到整个的下棋过程(无论对方是电脑抑或其他网

8、络玩家)可以分为:己方落子、等待对方落子、对方落子、设置己方棋盘数据这一系列过程,因此一人游戏类、二人游戏类和棋盘类之间的关系参考了AbstractFactory(抽象工厂)模式,以实现对两个不同模块进行一般化的控制。22.1棋盘类整个架构的核心部分,类名为CTable。封装了棋盘的各种可能用到的功能3,如保存棋盘数据、初始化、判断胜负等。用户操作主界面,主界面与CTable进行交互来完成对游戏的操作。2.2游戏模式类用来管理人机对弈/网络对弈两种游戏模式,类名为CGame。CGame是一个抽象类,经由它派生出一人游戏类COneGame和网络游戏类CTwoGame,如图2.2:抽象类CGame

9、COneGameCTwoGame 图2.2 CGame类派生关系这样,CTable类就可以通过一个CGame类的指针4,在游戏初始化的时候根据具体游戏模式的要求实例化COneGame或CTwoGame类的对象;然后利用多态性5,使用CGame类提供的公有接口就可以完成不同游戏模式下的不同功能了。3棋盘类CTable3.1主要成员变量说明3.1.1网络连接标志m_bConnected用来表示当前网络连接的情况,在网络对弈游戏模式下客户端连接服务器的时候用来判断是否连接成功;事实上,它也是区分当前游戏模式的唯一标志。3.1.2棋盘等待标志m_bWait与m_bOldWait由于在玩家落子后需要等待

10、对方落子,m_bWait标志就用来标识棋盘的等待状态。当m_bWait为TRUE时,是不允许玩家落子的。在网络对弈模式下,玩家之间需要互相发送诸如悔棋、和棋这一类的请求消息,在发送请求后等待对方回应时,也是不允许落子的,所以需要将m_bWait标志置为TRUE。在收到对方回应后,需要恢复原有的棋盘等待状态,所以需要另外一个变量在发送请求之前保存棋盘的等待状态做恢复之用,也就是m_bOldWait。等待标志的设置,由成员函数SetWait和RestoreWait完成。3.1.3网络套接字m_sock和m_conn在网络对弈游戏模式下,需要用到这两个套接字对象。其中m_sock对象用于做服务器时的

11、监听之用,m_conn用于网络连接的传输。3.1.4棋盘数据m_data这是一个15*15的二位数组,用来保存当前棋盘的落子数据。其中对于每个成员来说,0表示落黑子,1表示落白子,-1表示无子。3.1.5游戏模式指针m_pGame这个CGame类的对象指针是CTable类的核心内容。它所指向的对象实体决定了CTable在执行一件事情时候的不同行为,具体的内容请参见“游戏模式”一节。3.2主要成员函数说明3.2.1套接字的回调处理Accept、Connect、Receive本程序的套接字派生自MFC的CAsyncSocket类6,CTable的这三个成员函数就分别提供了对套接字7回调事件OnAc

12、cept、OnConnect、OnReceive的实际处理,其中尤以Receive成员函数重要,它之中包含了对所有网络消息(参见“消息机制”一节)的分发处理。3.2.2清空棋盘Clear在每一局游戏开始的时候都需要调用这个函数将棋盘清空,也就是棋盘的初始化工作。在这个函数中,主要发生了这么几件事情: 将m_data中每一个落子位都置为无子状态(-1)。 按照传入的参数设置棋盘等待标志m_bWait,以供先、后手的不同情况之用。 使用delete将m_pGame指针所指向的原有游戏模式对象从堆上删除。3.2.3绘制棋子Draw这无疑是很重要的一个函数,它根据参数给定的坐标和颜色绘制棋子。绘制的详

13、细过程如下: 将给定的棋盘坐标换算为绘图的像素坐标。 根据坐标绘制棋子位图。 如果先前曾下过棋子,则利用R2_NOTXORPEN将上一个绘制棋子上的最后落子指示矩形擦除。 在刚绘制完成的棋子四周绘制最后落子指示矩形。3.2.4左键消息OnLButtonUp作为棋盘唯一响应的左键消息,也需要做不少的工作: 如果棋盘等待标志m_bWait为TRUE,则直接发出警告声音并返回,即禁止落子。 如果点击时的鼠标坐标在合法坐标(0, 0)(14, 14)之外,亦禁止落子。 如果走的步数大于1步,方才允许悔棋。 进行胜利判断,如胜利则修改UI状态并增加胜利数的统计。 如未胜利,则向对方发送已经落子的消息。

14、落子完毕,将m_bWait标志置为TRUE,开始等待对方回应。3.2.5绘制棋盘OnPaint每当WM_PAINT消息触发时,都需要对棋盘进行重绘。OnPaint作为响应绘制消息的消息处理函数使用了双缓冲技术,减少了多次绘图可能导致的图像闪烁问题。这个函数主要完成了以下工作: 装载棋盘位图并进行绘制。 根据棋盘数据绘制棋子。 绘制最后落子指示矩形。3.2.6对方落子完毕Over在对方落子之后,仍然需要做一些判断工作,这些工作与OnLButtonUp中的类似,在此不再赘述。3.2.7设置游戏模式SetGameMode这个函数通过传入的游戏模式参数对m_pGame指针进行了初始化,代码如下:voi

15、d CTable:SetGameMode( int nGameMode ) if ( 1 = nGameMode ) m_pGame = new COneGame( this ); else m_pGame = new CTwoGame( this ); m_pGame-Init();这之后,就可以利用OO的继承和多态特点8来使m_pGame指针使用相同的调用来完成不同的工作了,事实上,COneGame:Init和CTwoGame:Init都是不同的。3.2.8胜负的判断Win这是游戏中一个极其重要的算法,用来判断当前棋盘的形势是哪一方获胜。其详细内容请参见“主要算法”一节。4游戏模式类CGa

16、me这个类负责对游戏模式进行管理,以及在不同的游戏模式下对不同的用户行为进行不同的响应。由于并不需要CGame本身进行响应,所以将其设计为了一个纯虚类9,它的定义如下:class CGameprotected: CTable *m_pTable;public: / 落子步骤 list m_StepList;public: / 构造函数 CGame( CTable *pTable ) : m_pTable( pTable ) / 析构函数 virtual CGame(); / 初始化工作,不同的游戏方式初始化也不一样 virtual void Init() = 0; / 处理胜利后的情况,CTw

17、oGame需要改写此函数完成善后工作 virtual void Win( const STEP& stepSend ); / 发送己方落子 virtual void SendStep( const STEP& stepSend ) = 0; / 接收对方消息 virtual void ReceiveMsg( MSGSTRUCT *pMsg ) = 0; / 发送悔棋请求 virtual void Back() = 0;4.1主要成员变量说明4.1.1棋盘指针m_pTable由于在游戏中需要对棋盘以及棋盘的父窗口主对话框进行操作及UI状态设置,故为CGame类设置了这个成员。当对主对话框进行操作

18、时,可以使用m_pTable-GetParent()得到它的窗口指针。4.1.2落子步骤m_StepList一个好的棋类程序必须要考虑到的功能就是它的悔棋功能,所以需要为游戏类设置一个落子步骤的列表。由于人机对弈和网络对弈中都需要这个功能,故将这个成员直接设置到基类CGame中。另外,考虑到使用的简便性,这个成员使用了C+标准模板库10(Standard Template Library,STL)中的std:list,而不是MFC的CList。4.2主要成员函数说明4.2.1悔棋操作Back在不同的游戏模式下,悔棋的行为是不一样的。 人机对弈模式下,计算机是完全允许玩家悔棋的,但是出于对程序负

19、荷的考虑(此原因请参见“几点补充说明”一节),只允许玩家悔当前的两步棋(计算机一步,玩家一步)。 双人网络对弈模式下,悔棋的过程为:首先由玩家向对方发送悔棋请求(悔棋消息),然后由对方决定是否允许玩家悔棋,在玩家得到对方的响应消息(允许或者拒绝)之后,才进行悔棋与否的操作。4.2.2初始化操作Init对于不同的游戏模式而言,也就有不同的初始化方式。对于人机对弈模式而言,初始化操作包括以下几个步骤: 设置网络连接状态m_bConnected为FALSE。 设置主界面计算机玩家的姓名。 初始化所有的获胜组合。 如果是计算机先走,则占据天元(棋盘正中央)的位置。网络对弈的初始化工作暂为空,以供以后扩

20、展之用。4.2.3接收来自对方的消息ReceiveMsg这个成员函数由CTable棋盘类的Receive成员函数调用,用于接收来自对方的消息。对于人机对弈游戏模式来说,所能接收到的就仅仅是本地模拟的落子消息MSG_PUTSTEP;对于网络对弈游戏模式来说,这个成员函数则负责从套接字读取对方发过来的数据,然后将这些数据解释为自定义的消息结构,并回到CTable:Receive来进行处理。4.2.4发送落子消息SendStep在玩家落子结束后,要向对方发送自己落子的消息。对于不同的游戏模式,发送的目标也不同: 对于人机对弈游戏模式,将直接把落子的信息(坐标、颜色)发送给COneGame类相应的计算

21、函数。 对于网络对弈游戏模式,将把落子消息发送给套接字,并由套接字转发给对方。4.2.5胜利后的处理Win这个成员函数主要针对CTwoGame网络对弈模式。在玩家赢得棋局后,这个函数仍然会调用SendStep将玩家所下的制胜落子步骤发送给对方玩家,然后对方的游戏端经由CTable:Win来判定自己失败。5消息机制Windows系统拥有自己的消息机制,在不同事件发生的时候,系统也可以提供不同的响应方式11。五子棋程序也模仿Windows系统实现了自己的消息机制,主要为网络对弈服务,以响应多种多样的网络消息。5.1消息机制的架构当继承自CAsyncSocket的套接字类CFiveSocket收到消

22、息时,会触发CFiveSocket:OnReceive事件12,在这个事件中调用CTable:Receive,CTable:Receive开始按照自定义的消息格式接收套接字发送的数据,并对不同的消息类型进行分发处理。CFiveSocket网络数据CTable:Receive分发处理CFiveSocket:OnReceiveCFiveSocket:Receive调用 图5.1 自定义的消息机制如图5.1所示,当CTable获得了来自网络的消息之后,就可以使用一个switch结构来进行消息的分发了。5.2各种消息说明网络间传递的消息,都遵循以下一个结构体的形式:/ 摘自Messages.htype

23、def struct _tagMsgStruct / 消息ID UINT uMsg; / 落子信息 int x; int y; int color; / 消息内容 TCHAR szMsg128; MSGSTRUCT;随着uMsg表示消息ID,x、y表示落子的坐标,color表示落子的颜色,szMsg随着uMsg的不同而有不同的含义。5.2.1落子消息MSG_PUTSTEP表明对方落下了一个棋子,其中x、y和color成员有效,szMsg成员无效。在人机对弈游戏模式下,亦会模拟发送此消息以达到程序模块一般化的效果。5.2.2悔棋消息MSG_BACK表明对方请求悔棋,除uMsg成员外其余成员皆无效

24、。接到这个消息后,会弹出MessageBox询问是否接受对方的请求(如图5.2所示),并根据玩家的选择回返MSG_AGREEBACK或MSG_REFUSEBACK消息。另外,在发送这个消息之后,主界面上的某些元素将不再响应用户的操作。图5.2 请求悔棋5.2.3同意悔棋消息MSG_AGREEBACK表明对方接受了玩家的悔棋请求,除uMsg成员外其余成员皆无效。接到这个消息后,将进行正常的悔棋操作。5.2.4拒绝悔棋消息MSG_REFUSEBACK表明对方拒绝了玩家的悔棋请求(如图5.3所示),除uMsg成员外其余成员皆无效。接到这个消息后,整个界面将恢复发送悔棋请求前的状态。图5.3 拒绝悔棋

25、5.2.5和棋消息MSG_DRAW表明对方请求和棋,除uMsg成员外其余成员皆无效。接到这个消息后,会弹出MessageBox询问是否接受对方的请求(如图5.4所示),并根据玩家的选择回返MSG_AGREEDRAW或MSG_REFUSEDRAW消息。另外,在发送这个消息之后,主界面上的某些元素将不再响应用户的操作。图5.4 请求和棋5.2.6同意和棋消息MSG_AGREEDRAW表明对方接受了玩家的和棋请求(如图5.5所示),除uMsg成员外其余成员皆无效。接到这个消息后,双方和棋。图5.5 同意和棋5.2.7拒绝和棋消息MSG_REFUSEDRAW表明对方拒绝了玩家的和棋请求(如图5.6所示

26、),除uMsg成员外其余成员皆无效。接到这个消息后,整个界面将恢复发送和棋请求前的状态。图5.6 拒绝和棋5.2.8认输消息MSG_GIVEUP表明对方已经投子认输(如图5.7所示),除uMsg成员外其余成员皆无效。接到这个消息后,整个界面将转换为胜利后的状态。图5.7 认输5.2.9聊天消息MSG_CHAT表明对方发送了一条聊天信息,szMsg表示对方的信息,其余成员无效。接到这个信息后,会将对方聊天的内容显示在主对话框的聊天记录窗口内。5.2.10对方信息消息MSG_INFORMATION用来获取对方玩家的姓名,szMsg表示对方的姓名,其余成员无效。在开始游戏的时候,由客户端向服务端发送

27、这条消息,服务端接到后设置对方的姓名,并将自己的姓名同样用这条消息回发给客户端。5.2.11再次开局消息MSG_PLAYAGAIN表明对方希望开始一局新的棋局,除uMsg成员外其余成员皆无效。接到这个消息后,会弹出MessageBox询问是否接受对方的请求(如图5.8所示),并根据玩家的选择回返MSG_AGREEAGAIN消息或直接断开网络。图5.8 再次开局5.2.12同意再次开局消息MSG_AGREEAGAIN表明对方同意了再次开局的请求,除uMsg成员外其余成员皆无效。接到这个消息后,将开启一局新游戏。6主要算法五子棋游戏中,有相当的篇幅是算法的部分。无论是人机对弈,还是网络对弈,都需要

28、合理算法的支持,本节中将详细介绍五子棋中使用的算法。136.1判断胜负五子棋的胜负,在于判断棋盘上是否有一个点,从这个点开始的右、下、右下、左下四个方向是否有连续的五个同色棋子出现,如图6.1:图6.1 判断胜负方向这个算法也就是CTable的Win成员函数。从设计的思想上,需要它接受一个棋子颜色的参数,然后返回一个布尔值,这个值来指示是否胜利,代码如下:BOOL CTable:Win( int color ) const int x, y; / 判断横向 for ( y = 0; y 15; y+ ) for ( x = 0; x 11; x+ ) if ( color = m_dataxy

29、 &color = m_datax + 1y & color = m_datax + 2y &color = m_datax + 3y & color = m_datax + 4y ) return TRUE; / 判断纵向 for ( y = 0; y 11; y+ ) for ( x = 0; x 15; x+ ) if ( color = m_dataxy &color = m_dataxy + 1 & color = m_dataxy + 2 &color = m_dataxy + 3 & color = m_dataxy + 4 ) return TRUE; / 判断“”方向 for ( y = 0; y 11; y+ ) for ( x = 0; x 11; x+ ) if ( color = m_dataxy &color = m_datax + 1y + 1 & color = m_datax + 2y + 2 &color = m_datax + 3y + 3 & color = m_datax + 4y + 4 )

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1