局域网对战五子棋游戏设计.doc_第1页
局域网对战五子棋游戏设计.doc_第2页
局域网对战五子棋游戏设计.doc_第3页
局域网对战五子棋游戏设计.doc_第4页
局域网对战五子棋游戏设计.doc_第5页
已阅读5页,还剩31页未读 继续免费阅读

下载本文档

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

文档简介

新技术专题题 目: 网络版五子棋对战游戏设计 专 业: 计算机科学与技术11 学 号: 1133050152 姓 名: 王志勋 指导老师: 丁 宁 完成日期: 2014年12月6日 成 绩: 1、前言五子棋是人们喜欢的一种棋类游戏,近来,随着计算机的快速发展,以计算机作为对战平台,各种棋类游戏如雨后春笋般纷纷冒出,使得那些喜爱下棋,有常常苦于没有对手的棋迷们能随时过足棋瘾,而且这类软件个个水平颇高,大有与人脑分庭抗礼之势。其中战胜过国际象棋世界冠军卡斯帕罗夫的“深蓝”便是最具说服力的代表。 当我们与电脑对战对时,您知道这些软件是怎样像人脑一样进行思考的吗?总的来说(我们假定您熟悉五子棋的基本规则),要让电脑知道该在哪一点下子,就要根据盘面的形式,为每一可能落子点计算其重要程度,也就是当这子落下后会形成什么模型,然后通览全盘选出最重要的一点,这便是最基本的算法。当然,仅靠当前盘面进行判断是远远不够的,这样下棋很容易掉进玩家设下的陷阱,因为它没有考虑以后的变化。所以在此基础上我们需要使用好的算法是电脑能预测出今后几步的各种走法,以便做出最佳选择,这也是我们下棋时常说的“想了几步”。怎样才能达到这个程度呢?这是本文所要讨论的主要问题。作为一个五子棋游戏爱好者,在使用了众多的五子棋游戏软件后,发现当今大多数五子棋游戏软件中电脑的AI值不是很高,难与人脑抗衡,这是基于以上的最基本算法扩展而出的电脑最优落子算法不够优秀而造成的。本人使用C#语言作为开发工具,在吸收别人所编的五子棋游戏软件的基础上,再融入自己的创新思想(最优落子算法的改进),编写了这个五子棋游戏,软件实现了人机对弈和双人对的功能,游戏软件界面美观,操作容易,电脑的AI值也较高2、需求分析 2.1要求(1) 游戏流程:启动游戏后,显示主菜单。里面包括开始游戏、和棋、游戏帮助、退出。 (2) 游戏规则:1、黑先白后,从天元开始落子。然后执白棋的一方在黑棋周围的交叉点上落子,白第二着棋应布在自己河界的一侧。此后,执黑方在以天元为中心的25个交叉点的范围内布盘面的第三着棋。2、最先在横向,竖向,斜向形成连续的相同色五个棋子的一方为胜。3、黑棋禁手判负,白棋无禁手。黑棋禁手包括“三三”,“四四”,“长连”。黑方只能“四三”胜。所谓禁手,是指黑方一子落下同时形成两个或两个以上的活三,冲四及长连禁手。长连禁手是指黑方形成六个或六个以上的连续棋子。4、双方均不能形成五连为和棋。5、对局中拔子,中途退场均判为负。6、五连与禁手同时形成,先五为胜。因黑方已形成五连,故禁手失效,黑方胜。7、黑方禁手形成时,白方应立即指出禁手点,黑方即负。若白方继续应子,则黑方禁手不成立。8、高段位职业比赛的特殊规定:“三手可交换”:黑下完第手,执白者可提出交换。即执白方变为执黑方。“五手两打法”:执黑下第五手时,必须下两手棋,执白者从这两手棋中任选一步。本文所论述的联机五子棋系统就是依照这种方式进行的。2.2任务 将主要通过VC+语言,运用面向对象的程序设计方法,开发此款五子棋游戏。力争使程序短小精悍,简洁明了;游戏界面优美,容易操作;功能丰富,趣味性强。现在将我们对项目期望实现的目标一一介绍:(1) 能够实现五子棋游戏中的全部规则 能够对连五的胜负进行判断,并给出提示 能够对黑方禁手进行判断,并能够在落子后进行直接判负的提示。(2) 能够支持设置网络端口 玩家可以自行设定连接的服务器IP地址。通信端口默认使用10000 支持两个玩家进行练级网络对弈模式。 支持和棋操作。 1.3 运行环境 本游戏短小精悍,而且对电脑配置的要求均不高,目前几乎所有的PC机均可运行该游戏。但是为了能让大家更好地体验该款游戏,我们给出如下的最低配置: 最低配置:CPU1GHz 内存 32M 硬盘 4G Windows 95 Microsoft Visual C+ 6.0 同时结合我们开发该游戏的环境,我们强烈推荐用户使用如下的配置: 最佳配置:CPU2GHz及以上 内存256M及以上 硬盘80G及以上 Windows XP及以上 Microsoft Visual C+ 6.01.4开发工具现在,市场上应用开发产品很多,流行的也有数十种。目前在我国市场上最为流行、使用最多、最为先进的可用作企业级开发工具的产品有:Microsoft公司的Visual BasicMicrosoft公司的 Visual CBorland公司的DelphiJavaC#等等在目前市场上这些众多的程序开发工具中,有些强调程语言的弹性与执行效率;有些则偏重于可视化程序开发工具所带来的便利性与效率的得高,各有各的优点和特色,也满足了不同用户的需求。然而,语言的弹性和工具的便利性是密不可分的,只有便利的工具,却没有弹性的语言作支持,许多特殊化的处理动作必需要耗费数倍的工夫来处理,使得原来所标榜的效率提高的优点失去了作用;相反,如果只强调程续语言的弹性,却没有便利的工具作配合,会使一些即使非常简单的界面处理动作,也会严重地浪费程序设计师的宝贵时间,而我在这几种语言中选择了C#。第一是因为C#开发一些软件比较方便快捷;第二是因为C#刚学过,印象比较深,而且做这个游戏,刚好能加深一下印象,还能有个系统的复习。3、概括设计与详细设计3.1 概括设计网络五子棋(1) 系统功能架构:输入服务器IP地址选择先手或者后手游戏版本号查询 退出游戏游戏规则判断网络交互和棋(2) 处理流程整个五子棋的处理流程如图所示:选中菜单中的“开始”项选择网络类型,为客户机设置主机IP地址,进行网络连接 游戏准备主机为黑色,客户机为白色由黑方开始落子 根据规则判断 开始游戏 黑方连五 或禁手传送数据到主机,等待由白方开始落子根据判断规则 白方连五 传送数据到主机,等待游戏结束,通知结果 游戏结束 (3) 类结构设计游戏由五个类组成,如图所示:五子棋游戏游戏规则类网络协议类网络通信类棋盘窗口类客户端对话框类 游戏规则类:主要负责各种类的调用及游戏规则的实现。 棋盘窗口类:主要负责棋盘和棋子等的更新和显示。 设置对话框类:主要负责参数的设置与连接。 网络通信类:主要负责游戏的网络通信。 网络协议类:主要负责游戏网络通信协议的实现。(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)设计 本组设计的五子棋需支持如下几个功能: 能够显示棋盘和棋子图片。 能够接受用户鼠标输入,并把相应的坐标转换成相应的行列数据填充到棋子数组中。 能够处理来在网络通信的各种数据。 能够调用规则类来对象判断胜负。 能够支持清空游戏棋盘上的棋子的功能。(2) 棋盘类的实现 有了支持的功能列表,就需要声明一个棋盘类,其代码如下:#ifndef _BOARD_H_#define _BOARD_H_#include stdafx.hclass CBoard:public CWndprivate: CImageList m_iml; / 棋子图像 int m_color; / 玩家颜色 BOOL m_bWait; / 等待标志BOOL m_bOldWait;/原来的等待状态 public:CBoard(); virtual CBoard();void RestoreWait(); void Clear( BOOL bWait ); void SetColor(int color); int GetColor() const; void SetWait( BOOL bWait ); void SetData( int x, int y, int color ); void DrawGame();void Draw(int x, int y, int color);void Receive();void Over(int x, int y);protected: afx_msg void OnPaint(); afx_msg void OnLButtonUp( UINT nFlags, CPoint point ); DECLARE_MESSAGE_MAP();#endif(3) 棋盘类函数的实现以上是声明了类的结构和成员,之后要根据这些声明,对这个类进行基函数实现,其代码如下:#include board.h#include Resource.h#include ConnectData.h#include Rule.h#include FiveChessDlg.h#define MAX_LEN 256/*定义最大长度*/ 构造函数,初始化棋盘数据以及图像数据/CBoard:CBoard() / 初始化图像列表 m_iml.Create( 24, 24, ILC_COLOR24 | ILC_MASK, 0, 2 ); / 载入黑、白棋子掩码位图 CBitmap bmpBlack, 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消息/void CBoard:OnPaint() CPaintDC dc( this ); CDC MemDC; MemDC.CreateCompatibleDC( &dc ); / 装载棋盘 CBitmap bmp; CPen pen; bmp.LoadBitmap( IDB_BMP_QP ); pen.CreatePen( PS_SOLID, 1, 0xff ); MemDC.SelectObject( &bmp ); MemDC.SelectObject( &pen ); MemDC.SetROP2( R2_NOTXORPEN ); / 根据棋盘数据绘制棋子 int x, y; POINT pt; for ( y = 0; y 15; y+ ) for ( x = 0; x m_bIsConnect)int x, y;x = ( point.x - 12 ) / 25;y = ( point.y - 84 ) / 25;/ 如果在(0, 0)(14, 14)范围内,且该坐标没有落子,/ 则落子于此,否则发声警告并退出过程if ( x 14 | y 14 | m_dataxy != -1 )MessageBeep( MB_OK );return;else/ 如果位置合法,则落子SetData( x, y, m_color );msg.color = m_color;msg.x = x;msg.y = y;/ 开始等待m_bWait = TRUE;msg.msgType = MSG_PUTSTEP;pDlg-Send(&msg);if(rule.Win(m_color, msg.x, msg.y) = _WIN)/ 胜利pDlg-MessageBox( _T(恭喜,您获得了胜利!), _T(胜利), MB_ICONINFORMATION );pDlg-SetMenuState(TRUE);else if(rule.Win(m_color, msg.x, msg.y) = _LOST)/出现禁手pDlg-MessageBox( _T(执黑禁手, 您输了!), _T(失败), MB_ICONINFORMATION );pDlg-SetMenuState(TRUE);/ 清空棋盘/void CBoard:Clear( BOOL bWait ) int x, y; for ( y = 0; y 15; y+ ) for ( x = 0; x SelectObject( &pen ); pDC-SetROP2( R2_NOTXORPEN ); m_iml.Draw( pDC, color, pt, ILD_TRANSPARENT ); ReleaseDC( pDC );/ 接收来自对方的数据/void CBoard:Receive()CFiveChessDlg * pDlg = (CFiveChessDlg*)AfxGetMainWnd();MSGSTRUCT msg;if(pDlg-m_sock.Receive(LPVOID)&msg, sizeof(MSGSTRUCT) = SOCKET_ERROR)AfxGetMainWnd()-MessageBox( _T(接收数据时发生错误,请检查您的网络连接。), _T(错误), MB_ICONSTOP );return;switch(msg.msgType)case MSG_PUTSTEP:SetData( msg.x, msg.y, msg.color );Over(msg.x, msg.y);break;case MSG_DRAW:if ( IDYES = GetParent()-MessageBox( _T(对方请求和棋,接受这个请求吗?),_T(和棋), MB_ICONQUESTION | MB_YESNO ) )/ 发送允许和棋消息MSGSTRUCT msg;msg.msgType = MSG_AGREE_DRAW;pDlg-m_sock.Send( (LPCVOID)&msg, sizeof( MSGSTRUCT ) );SetWait( TRUE );/ 使“重玩”菜单生效pDlg-SetMenuState(TRUE);else/ 发送拒绝和棋消息MSGSTRUCT msg;msg.msgType = MSG_REFUSE_DRAW;pDlg-m_sock.Send( (LPCVOID)&msg, sizeof( MSGSTRUCT ) );break;case MSG_AGREE_DRAW:pDlg-MessageBox( _T(看来真是棋逢对手,对方接受了您的和棋请求。), _T(和棋), MB_ICONINFORMATION );/ 和棋后,使“重玩”菜单生效pDlg-SetMenuState(TRUE);break;case MSG_REFUSE_DRAW:pDlg-MessageBox( _T(看来对方很有信心取得胜利,所以拒绝了您的和棋请求。),_T(和棋), MB_ICONINFORMATION );RestoreWait();pDlg-SetMenuState(FALSE);break;case MSG_EXTERN:break;default:break;/ 和棋操作/void CBoard:DrawGame()CFiveChessDlg * pDlg = (CFiveChessDlg*)AfxGetMainWnd(); / 设置等待标志 SetWait( TRUE ); MSGSTRUCT msg; msg.msgType = MSG_DRAW; pDlg-m_sock.Send( (LPCVOID)&msg, sizeof( MSGSTRUCT ) );/ 处理对方落子后的工作/void CBoard:Over(int x, int y)CRule rule;CFiveChessDlg *pDlg = (CFiveChessDlg *)GetParent();/ 判断对方是否胜利 if ( rule.Win( 1 - m_color, x, y ) = _WIN) pDlg-MessageBox( _T(您输了,不过不要灰心,失败乃成功之母哦!), _T(失败), MB_ICONINFORMATION ); / 如果是网络对战,则生效“重玩” if ( pDlg-m_bIsConnect ) pDlg-SetMenuState(TRUE); return; /判断对方是否出现禁手else if(rule.Win(1 - m_color, x, y) = _LOST)pDlg-MessageBox( _T(恭喜您, 对方出现禁手输了!), _T(胜利), MB_ICONINFORMATION );/ 如果是网络对战,则生效“重玩”if ( pDlg-m_bIsConnect )pDlg-SetMenuState(TRUE);return;m_bWait = FALSE;/ 重新设置先前的等待标志/void CBoard:RestoreWait() SetWait( m_bOldWait );(4) 注册棋盘窗口类 另外,要是用这个棋盘类,还必须在应用程序类的注册棋盘窗口类,其代码如下:/ 注册棋盘窗口类 WNDCLASS wc; wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hbrBackground = (HBRUSH)GetStockObject( WHITE_BRUSH ); wc.hCursor = LoadCursor( IDC_ARROW ); wc.hIcon = NULL; wc.hInstance = AfxGetInstanceHandle(); wc.lpfnWndProc = :DefWindowProc; wc.lpszClassName = _T(ChessBoard); wc.lpszMenuName = NULL; wc.style = 0; AfxRegisterClass( &wc );CFiveChessDlg dlg;m_pMainWnd = &dlg;int nResponse = dlg.DoModal();if (nResponse = IDOK)/ TODO: Place code here to handle when the dialog is/ dismissed with OKelse if (nResponse = IDCANCEL)/ TODO: Place code here to handle when the dialog is/ dismissed with Cancel/ Since the dialog has been closed, return FALSE so that we exit the/ application, rather than start the applications message pump.return FALSE;4、 网络交互界面的设计与实现 根据之前需求分析以及网络通信协议中所要求功能,可以进行编码,应首先实现CConnet类的声明,之后再根据需要实现各种操作响应函数。 CConnect类的声明如以下代码:#ifndef _CONNECT_H_#define _CONNECT_H_#include class CConnect: public CAsyncSocket public:CConnect();/构造函数virtual CConnect();/析构函数/ Implementationprotected:virtual void OnAccept( int nErrorCode );virtual void OnConnect( int nErrorCode );virtual void OnReceive( int nErrorCode );virtual void OnClose( int nErrorCode );#endifCConnect的实现即以下代码:#include Connect.h#include FiveChessDlg.h#include Board.hCConnect:CConnect()CConnect:CConnect()/ CFiveSocket member functionsvoid CConnect:OnAccept( int nErrorCode )CFiveChessDlg * pDlg = (CFiveChessDlg*)AfxGetMainWnd();pDlg-Accept();pDlg-SetMenuState(FALSE);void CConnect:OnClose( int nErrorCode )CFiveChessDlg * pDlg = (CFiveChessDlg*)AfxGetMainWnd();pDlg-MessageBox( _T(对方已经离开游戏,改日再较量不迟。), _T(五子棋), MB_ICONINFORMATION);pDlg-SetMenuState(TRUE);pDlg-m_board.SetWait(TRUE);pDlg-m_conncet.Close();pDlg-m_sock.Close();pDlg-m_bIsConnect = FALSE; void CConnect:OnConnect( int nErrorCode )CFiveChessDlg * pDlg = (CFiveChessDlg*)AfxGetMainWnd();pDlg-Connect();pDlg-SetMenuState(FALSE); void CConnect:OnReceive( int nErrorCode ) CBoard *pBoard = (CBoard *)AfxGetMainWnd()-GetDlgItem( IDC_BOARD ); pBoard-Receive();5、 游戏规则的设计与实现 根据需求分析中的游戏规则要求,本小组对应其规则设计类要实现的功能,需满足:能够判断一方胜利的功能和判断黑方禁手的功能。 设计一个Cule类,该类对外提供两个接口:胜负判断接口函数win()和禁手判断接口函数Ban(),其代码如下:#ifndef _RULE_H_#define _RULE_H_#define _WIN 0x00#define _LOST 0x01#define _OTHER 0x02class CRulepublic:CRule();/构造函数CRule();/析构函数int Win(int color, int x, int y);/胜负判断接口函数BOOL Ban(int x, int y, int color);/禁手判断接口函数private:BOOL forbid2(int x, int y);/非连子禁手判断BOOL forbid1(int x, int y);/连子禁手判断;#endif两个判断函数的实现代码:#include stdafx.h#include rule.h#define NONE -1CRule:CRule()CRule:CRule()/ 连五判断/ 返回 0 为胜利 1为禁手 2为无状态/int CRule:Win(int color, int xpos, int ypos)int x, y; / 判断横向 for ( y = 0; y 15; y+ ) for ( x = 0; x 11; x+ ) if ( color = m_dataxy & color = m_datax + 1y & color = m_datax + 2y & color = m_datax + 3y & color = m_datax + 4y ) return _WIN; / 判断纵向 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 _WIN; / 判断“”方向 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

温馨提示

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

评论

0/150

提交评论