新技术专题题目:网络版五子棋对战游戏设计专业:计算机科学与技术11学号:1133050152姓名:王志勋指导老师:丁宁完成日期:2014年12月6日成绩:-1-1、前言五子棋是人们喜欢的一种棋类游戏,近来,随着计算机的快速发展,以计算机作为对战平台,各种棋类游戏如雨后春笋般纷纷冒出,使得那些喜爱下棋,有常常苦于没有对手的棋迷们能随时过足棋瘾,而且这类软件个个水平颇高,大有与人脑分庭抗礼之势。其中战胜过国际象棋世界冠军—卡斯帕罗夫的“深蓝”便是最具说服力的代表。当我们与电脑对战对时,您知道这些软件是怎样像人脑一样进行思考的吗?总的来说(我们假定您熟悉五子棋的基本规则),要让电脑知道该在哪一点下子,就要根据盘面的形式,为每一可能落子点计算其重要程度,也就是当这子落下后会形成什么模型,然后通览全盘选出最重要的一点,这便是最基本的算法。当然,仅靠当前盘面进行判断是远远不够的,这样下棋很容易掉进玩家设下的陷阱,因为它没有考虑以后的变化。所以在此基础上我们需要使用好的算法是电脑能预测出今后几步的各种走法,以便做出最佳选择,这也是我们下棋时常说的“想了几步”。怎样才能达到这个程度呢?这是本文所要讨论的主要问题。作为一个五子棋游戏爱好者,在使用了众多的五子棋游戏软件后,发现当今大多数五子棋游戏软件中电脑的AI值不是很高,难与人脑抗衡,这是基于以上的最基本算法扩展而出的电脑最优落子算法不够优秀而造成的。本人使用C#语言作为开发工具,在吸收别人所编的五子棋游戏软件的基础上,再融入自己的创新思想(最优落子算法的改进),编写了这个五子棋游戏,软件实现了人机对弈和双人对的功能,游戏软件界面美观,操作容易,电脑的AI值也较高2、需求分析2.1要求(1)游戏流程:启动游戏后,显示主菜单。里面包括开始游戏、和棋、游戏帮助、退出。(2)游戏规则:1、黑先白后,从天元开始落子。然后执白棋的一方在黑棋周围的交叉点上落子,白第二着棋应布在自己河界的一侧。此后,执黑方在以天元为中心的25个交叉点的范围内布盘面的第三着棋。2、最先在横向,竖向,斜向形成连续的相同色五个棋子的一方为胜。3、黑棋禁手判负,白棋无禁手。黑棋禁手包括“三三”,“四四”,“长连”。黑方只能“四三”胜。所谓禁手,是指黑方一子落下同时形成两个或两个以上的活三,冲四及长连禁手。长连禁手是指黑方形成六个或六个以上的连续棋子。4、双方均不能形成五连为和棋。5、对局中拔子,中途退场均判为负。6、五连与禁手同时形成,先五为胜。因黑方已形成五连,故禁手失效,黑方胜。7、黑方禁手形成时,白方应立即指出禁手点,黑方即负。若白方继续应子,则黑方禁手不成立。8、高段位职业比赛的特殊规定:“三手可交换”:黑下完第2手,执白者可提出交换。-2-即执白方变为执黑方。“五手两打法”:执黑下第五手时,必须下两手棋,执白者从这两手棋中任选一步。本文所论述的联机五子棋系统就是依照这种方式进行的。2.2任务将主要通过VC++语言,运用面向对象的程序设计方法,开发此款五子棋游戏。力争使程序短小精悍,简洁明了;游戏界面优美,容易操作;功能丰富,趣味性强。现在将我们对项目期望实现的目标一一介绍:(1)能够实现五子棋游戏中的全部规则□能够对连五的胜负进行判断,并给出提示□能够对黑方禁手进行判断,并能够在落子后进行直接判负的提示。(2)能够支持设置网络端口□玩家可以自行设定连接的服务器IP地址。通信端口默认使用10000□支持两个玩家进行练级网络对弈模式。□支持和棋操作。1.3运行环境本游戏短小精悍,而且对电脑配置的要求均不高,目前几乎所有的PC机均可运行该游戏。但是为了能让大家更好地体验该款游戏,我们给出如下的最低配置:最低配置:CPU1GHz内存32M硬盘4GWindows95MicrosoftVisualC++6.0同时结合我们开发该游戏的环境,我们强烈推荐用户使用如下的配置:最佳配置:CPU2GHz及以上内存256M及以上硬盘80G及以上WindowsXP及以上MicrosoftVisualC++6.01.4开发工具现在,市场上应用开发产品很多,流行的也有数十种。目前在我国市场上最为流行、使用最多、最为先进的可用作企业级开发工具的产品有:Microsoft公司的VisualBasicMicrosoft公司的VisualCBorland公司的DelphiJavaC#等等在目前市场上这些众多的程序开发工具中,有些强调程语言的弹性与执行效率;有些则偏重于可视化程序开发工具所带来的便利性与效率的得高,各有各的优点和特色,也满足了不同用户的需求。然而,语言的弹性和工具的便利性是密不可分的,只有便利的工具,却没有弹-3-性的语言作支持,许多特殊化的处理动作必需要耗费数倍的工夫来处理,使得原来所标榜的效率提高的优点失去了作用;相反,如果只强调程续语言的弹性,却没有便利的工具作配合,会使一些即使非常简单的界面处理动作,也会严重地浪费程序设计师的宝贵时间,而我在这几种语言中选择了C#。第一是因为C#开发一些软件比较方便快捷;第二是因为C#刚学过,印象比较深,而且做这个游戏,刚好能加深一下印象,还能有个系统的复习。3、概括设计与详细设计3.1概括设计(1)系统功能架构:(2)处理流程整个五子棋的处理流程如图所示:游戏准备开始游戏网络五子棋输入服务器IP地址选择先手或者后手网络交互游戏规则判断退出游戏游戏版本号查询和棋选中菜单中的“开始”项选择网络类型,为客户机设置主机IP地址,进行网络连接主机为黑色,客户机为白色由黑方开始落子根据规则判断-4-黑方连五或禁手白方连五游戏结束(3)类结构设计游戏由五个类组成,如图所示:□游戏规则类:主要负责各种类的调用及游戏规则的实现。□棋盘窗口类:主要负责棋盘和棋子等的更新和显示。□设置对话框类:主要负责参数的设置与连接。□网络通信类:主要负责游戏的网络通信。□网络协议类:主要负责游戏网络通信协议的实现。传送数据到主机,等待由白方开始落子根据判断规则传送数据到主机,等待游戏结束,通知结果五子棋游戏游戏规则类网络协议类网络通信类棋盘窗口类客户端对话框类-5-(4)出错处理设计当游戏中的一方出现错误。游戏的错误处理类会采用弹出对话框的方式提示用户出错信息。3.2详细设计详细设计就是使设计和实现前面的各种类结构本小组是按:网络通信协议类设计与实现------交互界面的设计与实现--------棋盘窗口类的设计与实现--------网络交互的设计与实现------游戏规则的设计与实现-------游戏中主对话框类的设计与实现的顺序进行设计和完成编码的1、网络通信协议的设计与实现□游戏中棋子在棋盘中的坐标,及棋子的位置。□游戏中的控制信息。□其他扩展信息。为能适应3种不同类的信息的传输,所以在游戏的网络传输协议中,必须加入一个网络协议包结构。如图:数据长度信息类型数据按照该格式可以设计出各种数据类型的详细结构。2、交互界面的设计与实现(1)控制菜单的设计在本小组的设计的五子棋中,有3中操作命令需要使用菜单来支持:A、新游戏操作,当用户进行主界面后,需要这个菜单项来开始新的游戏。开始新游戏之前需要对网络进行设置。B、和棋操作,在游戏中由一方提出提前结束游戏。相当于认输并重新开始新一轮游戏、C、退出游戏操作,当前用户不需要再玩游戏时,直接退出整个游戏界面。(2)控制菜单的实现为实现菜单,就需要在五子棋项目的资源中加入一个菜单栏(IDR_MAIN_MENU),并且要设置相应的ID资源号。(3)网络设置对话框的设计在游戏开始时,需要对网络进行设置,其包含的内容如下:A、可以选择当前用户是主机,还是客户机。如果是主机则执黑子,如果是客户机则执白子。B、当用户选择为主机时,IP地址默认为:“127.0.0.1”,端口号由用户填写。C、当用户为客户机时,则需要在设置连接到主机的IP地址及端口号。D、如果上面已经设置过,则从新开始游戏时,把上一次设置的IP地址和端口号显示出来。3、棋盘窗口类的设计与实现(1)设计本组设计的五子棋需支持如下几个功能:□能够显示棋盘和棋子图片。□能够接受用户鼠标输入,并把相应的坐标转换成相应的行列数据填充到棋子数组中。□能够处理来在网络通信的各种数据。□能够调用规则类来对象判断胜负。-6-□能够支持清空游戏棋盘上的棋子的功能。(2)棋盘类的实现有了支持的功能列表,就需要声明一个棋盘类,其代码如下:#ifndef__BOARD_H__#define__BOARD_H__#includestdafx.hclassCBoard:publicCWnd{private:CImageListm_iml;//棋子图像intm_color;//玩家颜色BOOLm_bWait;//等待标志BOOLm_bOldWait;//原来的等待状态public:CBoard();virtual~CBoard();voidRestoreWait();voidClear(BOOLbWait);voidSetColor(intcolor);intGetColor()const;voidSetWait(BOOLbWait);voidSetData(intx,inty,intcolor);voidDrawGame();voidDraw(intx,inty,intcolor);voidReceive();voidOver(intx,inty);protected:afx_msgvoidOnPaint();afx_msgvoidOnLButtonUp(UINTnFlags,CPointpoint);DECLARE_MESSAGE_MAP()};#endif(3)棋盘类函数的实现以上是声明了类的结构和成员,之后要根据这些声明,对这个类进行基函数实现,其代码如下:#includeboard.h-7-#includeResource.h#includeConnectData.h#includeRule.h#includeFiveChessDlg.h#defineMAX_LEN256/*定义最大长度*/////////////////////////////////////////////////////////////////////////////构造函数,初始化棋盘数据以及图像数据//////////////////////////////////////////////////////////////////////////CBoard::CBoard(){//初始化图像列表m_iml.Create(24,24,ILC_COLOR24|ILC_MASK,0,2);//载入黑、白棋子掩码位图CBitmapbmpBlack,bmpWhite;bmpBlack.LoadBitmap(IDB_BMP_BLACK);m_iml.Add(&bmpBlack,0xff00ff);bmpWhite.LoadBitmap(IDB_BMP_WHITE);m_iml.Add(&bmpWhite,0xff00ff);}////////////////////////////////////////////////////////////////////////////析构函数//////////////////////////////////////////////////////////////////////////CBoard::~CBoard(){}//消息映射表BEGIN_MESSAGE_MAP(CBoard,CWnd)//{{AFX_MSG_MAP(CBoard)ON_WM_PAINT()ON_WM_LBUTTONUP()//}}AFX_MSG_MAPEND_MESSAGE_MAP()////////////////////////////////////////////////////////////////////////////处理WM_PAINT消息///////////////////////////////////////////////////