版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、题目:基于TCP/IP协议的在线五子棋系统的设计与实现目 录一 系统功能描述11.1 五子棋介绍11.2 功能简介1二 系统的模块划分12.1 软件的总体架构如图所示12.2 棋盘模块12.2.1 主要成员变量说明22.2.2 主要成员函数说明22.3 游戏模块42.3.1 主要成员变量说明42.3.2 主要成员函数说明42.4 客户端模块52.4.1 主要成员变量说明52.4.2 主要成员函数说明52.5 服务端模块52.6 消息机制模块62.6.1 消息机制的架构62.6.2 各种消息说明6三 调试数据103.1 程序主界面103.2 建立游戏103.3 加入游戏103.4 连接成功后主界
2、面113.5 退出主界面113.6 胜利后主界面123.7 更改昵称123.8 关于五子棋123.9 失败后主界面13四 主要代码134.1 判断胜负134.2 初始化棋盘164.3 在指定棋盘坐标处绘制指定颜色的棋子164.4 设置棋盘数据,并绘制棋子184.5 清空棋盘18五 系统功能的优缺点195.1 优点195.2 不足195.3 如果自己有时间和能力,系统应该实现如下功能19参考文献19一 系统功能描述1.1 五子棋介绍五子棋是起源于中国古代的传统黑白棋种之一。现代五子棋日文称之为“连珠” ,英译为“Renju” ,英文称之为“Gobang”或“FIR”(Five in a Row的
3、缩写),亦有“连五子” 、“五子连” 、“串珠” 、“五目” 、“五目碰” 、“五格”等多种称谓。五子棋不仅能增强思维能力,提高智力,而且富含哲理,有助于修身养性。五子棋既有现代休闲的明显特征“短、平、快” ,又有古典哲学的高深学问“阴阳易理” ;它既有简单易学的特性,为人民群众所喜闻乐见,又有深奥的技巧和高水平的国际性比赛;它的棋文化源渊流长,具有东方的神秘和西方的直观;既有“场”的概念,亦有“点”的连接。它是中西文化的交流点,是古今哲理的结晶。1.2 功能简介使用Socket实现五子棋的简单游戏规则,该系统集成了服务器端和客户端功能,即可以做服务器端也可以做客户端,实现功能如下:(1)五子
4、棋棋盘正确显示(2)正确显示双方棋子,走棋数据的正确存储与传递(3)能够正确判断胜负(4)能够实现认输、悔棋、和棋和重新开局(5)能够实现显示玩家姓名和更改玩家姓名二 系统的模块划分2.1 软件的总体架构如图所示主界面用户棋盘类游戏类指针二人游戏类图2.1 软件架构2.2 棋盘模块整个架构的核心部分,类名为CTable。封装了棋盘的各种可能用到的功能,如保存棋盘数据、初始化、判断胜负等。用户操作主界面,主界面与CTable进行交互来完成对游戏的操作。2.2.1 主要成员变量说明1. 网络连接标志m_bConnected用来表示当前网络连接的情况,在网络对弈游戏下客户端连接服务器的时候用来判断是
5、否连接成功。2. 棋盘等待标志m_bWait与m_bOldWait由于在玩家落子后需要等待对方落子,m_bWait标志就用来标识棋盘的等待状态。当m_bWait为TRUE时,是不允许玩家落子的。在网络对弈游戏下,玩家之间需要互相发送诸如悔棋、和棋这一类的请求消息,在发送请求后等待对方回应时,也是不允许落子的,所以需要将m_bWait标志置为TRUE。在收到对方回应后,需要恢复原有的棋盘等待状态,所以需要另外一个变量在发送请求之前保存棋盘的等待状态做恢复之用,也就是m_bOldWait。等待标志的设置,由成员函数SetWait()和RestoreWait()完成。3. 网络套接字m_sock和m
6、_conn在网络对弈游戏下,需要用到这两个套接字对象。其中m_sock对象用于做服务器时的监听之用,m_conn用于网络连接的传输。4. 棋盘数据m_data这是一个15*15的二维数组,用来保存当前棋盘的落子数据。其中对于每个成员来说,0表示落黑子,1表示落白子,-1表示无子。5. 游戏模式指针m_pGame这个CGame类的对象指针是CTable类的核心内容,它所指向的对象实体决定了CTable在执行一件事情时候的行为。2.2.2 主要成员函数说明1. 套接字的回调处理Accept()、Connect()、Receive()本程序的套接字派生自MFC的CAsyncSocket类,CTabl
7、e的这三个成员函数就分别提供了对套接字回调事件OnAccept、OnConnect、OnReceive的实际处理,其中尤以Receive成员函数重要,它之中包含了对所有网络消息(参见“消息机制”一节)的分发处理。2. 清空棋盘Clear()在每一局游戏开始的时候都需要调用这个函数将棋盘清空,也就是棋盘的初始化工作。在这个函数中,主要发生了这么几件事情:l 将m_data中每一个落子位都置为无子状态(-1)。l 按照传入的参数设置棋盘等待标志m_bWait,以供先、后手的不同情况之用。l 使用delete将m_pGame指针所指向的原有游戏模式对象从堆上删除。3. 绘制棋子Draw()这无疑是很
8、重要的一个函数,它根据参数给定的坐标和颜色绘制棋子。绘制的详细过程如下:l 将给定的棋盘坐标换算为绘图的像素坐标。l 根据坐标绘制棋子位图。l 如果先前曾下过棋子,则利用R2_NOTXORPEN将上一个绘制棋子上的最后落子指示矩形擦除。l 在刚绘制完成的棋子四周绘制最后落子指示矩形。4. 左键消息OnLButtonUp()作为棋盘唯一响应的左键消息,也需要做不少的工作:l 如果棋盘等待标志m_bWait为TRUE,则直接发出警告声音并返回,即禁止落子。l 如果点击时的鼠标坐标在合法坐标(0, 0)(14, 14)之外,亦禁止落子。l 如果走的步数大于1步,方才允许悔棋。l 如未胜利,则向对方发
9、送已经落子的消息。l 落子完毕,将m_bWait标志置为TRUE,开始等待对方回应。5. 绘制棋盘OnPaint()每当WM_PAINT消息触发时,都需要对棋盘进行重绘。OnPaint作为响应绘制消息的消息处理函数使用了双缓冲技术,减少了多次绘图可能导致的图像闪烁问题。这个函数主要完成了以下工作:l 装载棋盘位图并进行绘制。l 根据棋盘数据绘制棋子。l 绘制最后落子指示矩形。6. 对方落子完毕Over()在对方落子之后,仍然需要做一些判断工作,这些工作与OnLButtonUp中的类似,在此不再赘述。7. 设置游戏模式SetGameMode()这个函数通过传入的游戏模式参数对m_pGame指针进
10、行了初始化,代码如下:void CTable:SetGameMode( int nGameMode ) m_pGame = new CTwoGame( this ); m_pGame-Init();8. 胜负的判断Win()这是游戏中一个极其重要的算法,用来判断当前棋盘的形势是哪一方获胜。2.3 游戏模块用来管理网络对弈,类名为CGame。CGame是一个抽象类,经由它派生出二人游戏类CTwoGame。这样,CTable类就可以通过一个CGame类的指针,在游戏初始化的时候实例化CTwoGame类的对象;然后利用多态性,使用CGame类提供的公有接口就可以完成不同功能了。2.3.1 主要成员变
11、量说明1. 棋盘指针m_pTable由于在游戏中需要对棋盘以及棋盘的父窗口主对话框进行操作及UI状态设置,故为CGame类设置了这个成员。当对主对话框进行操作时,可以使用m_pTable-GetParent()得到它的窗口指针。2. 落子步骤m_StepList一个好的棋类程序必须要考虑到的功能就是它的悔棋功能,所以需要为游戏类设置一个落子步骤的列表。由于网络对弈中需要这个功能,故将这个成员直接设置到基类CGame中。另外,考虑到使用的简便性,这个成员使用了C+标准模板库(Standard Template Library,STL)中的std:list,而不是MFC的CList。2.3.2 主
12、要成员函数说明1悔棋操作Back()悔棋的过程为:首先由玩家向对方发送悔棋请求(悔棋消息),然后由对方决定是否允许玩家悔棋,在玩家得到对方的响应消息(允许或者拒绝)之后,才进行悔棋与否的操作。2初始化操作Init()网络对弈的初始化工作暂为空,以供以后扩展之用。3接收来自对方的消息ReceiveMsg()这个成员函数由CTable棋盘类的Receive成员函数调用,用于接收来自对方的消息,这个成员函数则负责从套接字读取对方发过来的数据,然后将这些数据解释为自定义的消息结构,并回到CTable:Receive来进行处理。4发送落子消息SendStep()在玩家落子结束后,要向对方发送自己落子的消
13、息,将把落子消息发送给套接字,并由套接字转发给对方。5胜利后的处理Win()在玩家赢得棋局后,这个函数仍然会调用SendStep将玩家所下的制胜落子步骤发送给对方玩家,然后对方的游戏端经由CTable:Win来判定自己失败。2.4 客户端模块利用类向导生成的CClientDlg类,用来连接服务器端进行网络对弈。2.4.1 主要成员变量说明超时时间m_nTimer,与服务器连接时判断是否连接成功,当0 = m_nTimer时提示连接失败。2.4.2 主要成员函数说明1初始化对话框OnInitDialog()自动获得主机IP地址,设置IDC_EDIT_HOST的内容。2连接服务器OnBtnConn
14、ect() 根据IDC_EDIT_HOST的内容获取主机名称,创建套接字并连接,设定时钟SetTimer()。3计时响应OnTimer(UINT nIDEvent)响应用SetTimer()函数设定的时钟发送的时钟消息,当0 = m_nTimer时提示连接失败。2.5 服务端模块利用类向导生成的CServerDlg类,用来建立服务器端进行网络对弈。主要成员函数说明:1初始化对话框OnInitDialog()自动获取主机名及IP地址,设置IDC_EDIT_HOST和IDC_EDIT_IP的内容。2. 监听客户端连接OnBtnListen() 调用Socket的Create()和Listen()进
15、行创建Socket和监听请求。2.6 消息机制模块2.6.1 消息机制的架构当继承自MFC中CAsyncSocket的Scoket类CFiv收到消息时,会触发CFiveSocket:OnReceive事件,在这个事件中调用CTableeSocket:Receive,CTable:Receive开始按照自定义的消息格式接收套接字发送的数据,并对不同的消息类型进行分发处理。网络数据CFiveSocketCTable:Receive分发处理CFiveSocket:OnReceiveCFiveSocket:Receive调用 图2.6.1 自定义的消息机制如图2.6.1所示,当CTable获得了来自网
16、络的消息之后,就可以使用一个switch结构来进行消息的分发了。2.6.2 各种消息说明网络间传递的消息,都遵循以下一个结构体的形式:/ 摘自Messages.htypedef struct _tagMsgStruct / 消息ID UINT uMsg; / 落子信息 int x; int y; int color; / 消息内容 TCHAR szMsg128; MSGSTRUCT;uMsg表示消息ID,x、y表示落子的坐标,color表示落子的颜色,szMsg随着uMsg的不同而有不同的含义。1落子消息MSG_PUTSTEP表明对方落下了一个棋子,其中x、y和color成员有效,szMsg成
17、员无效。2悔棋消息MSG_BACK表明对方请求悔棋,除uMsg成员外其余成员皆无效。接到这个消息后,会弹出MessageBox询问是否接受对方的请求(如图2.6.2所示),并根据玩家的选择回返MSG_AGREEBACK或MSG_REFUSEBACK消息。另外,在发送这个消息之后,主界面上的某些元素将不再响应用户的操作。图2.6.2 请求悔棋3同意悔棋消息MSG_AGREEBACK表明对方接受了玩家的悔棋请求,除uMsg成员外其余成员皆无效。接到这个消息后,将进行正常的悔棋操作。4拒绝悔棋消息MSG_REFUSEBACK表明对方拒绝了玩家的悔棋请求(如图2.6.3所示),除uMsg成员外其余成员
18、皆无效。接到这个消息后,整个界面将恢复发送悔棋请求前的状态。图2.6.3 拒绝悔棋5和棋消息MSG_DRAW表明对方请求和棋,除uMsg成员外其余成员皆无效。接到这个消息后,会弹出MessageBox询问是否接受对方的请求(如图2.6.4所示),并根据玩家的选择回返MSG_AGREEDRAW或MSG_REFUSEDRAW消息。另外,在发送这个消息之后,主界面上的某些元素将不再响应用户的操作。图2.6.4 请求和棋6同意和棋消息MSG_AGREEDRAW表明对方接受了玩家的和棋请求(如图2.6.5所示),除uMsg成员外其余成员皆无效。接到这个消息后,双方和棋。图2.6.5 同意和棋7拒绝和棋消
19、息MSG_REFUSEDRAW表明对方拒绝了玩家的和棋请求(如图2.6.6所示),除uMsg成员外其余成员皆无效。接到这个消息后,整个界面将恢复发送和棋请求前的状态。图2.6.6 拒绝和棋8认输消息MSG_GIVEUP表明对方已经投子认输(如图2.6.7所示),除uMsg成员外其余成员皆无效。接到这个消息后,整个界面将转换为胜利后的状态。图2.6.7 认输9对方信息消息MSG_INFORMATION用来获取对方玩家的姓名,szMsg表示对方的姓名,其余成员无效。在开始游戏的时候,由客户端向服务端发送这条消息,服务端接到后设置对方的姓名,并将自己的姓名同样用这条消息回发给客户端。10再次开局消息
20、MSG_PLAYAGAIN表明对方希望开始一局新的棋局,除uMsg成员外其余成员皆无效。接到这个消息后,会弹出MessageBox询问是否接受对方的请求(如图2.6.8所示),并根据玩家的选择回返MSG_AGREEAGAIN消息或直接断开网络。图2.6.8 再次开局11同意再次开局消息MSG_AGREEAGAIN表明对方同意了再次开局的请求,除uMsg成员外其余成员皆无效。接到这个消息后,将开启一局新游戏。三 主要代码4.1 判断胜负五子棋的胜负,在于判断棋盘上是否有一个点,从这个点开始的右、下、右下、左下四个方向是否有连续的五个同色棋子出现,如图4.1:图4.1 判断胜负方向这个算法也就是C
21、Table的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 &color = m_datax + 1y & color = m_datax + 2y &color = m_datax + 3y & color = m_datax + 4y ) return TRUE; / 判断纵向 for
22、 ( 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
23、+ 2 &color = m_datax + 3y + 3 & color = m_datax + 4y + 4 ) return TRUE; / 判断“/”方向 for ( y = 0; y 11; y+ ) for ( x = 4; x m_szIni ); m_strMe = str; / 初始化图像列表 m_iml.Create( 24, 24, ILC_COLOR24 | ILC_MASK, 0, 2 ); / 载入黑、白棋子掩码位图 CBitmap bmpBlack, bmpWhite; bmpBlack.LoadBitmap( IDB_BMP_BLACK ); m_iml.Add
24、( &bmpBlack, 0xff00ff ); bmpWhite.LoadBitmap( IDB_BMP_WHITE ); m_iml.Add( &bmpWhite, 0xff00ff ); / 初始化游戏模式 m_pGame = NULL;4.3 在指定棋盘坐标处绘制指定颜色的棋子void CTable:Draw( int x, int y, int color ) POINT pt; pt.x = 12 + 25 * x; pt.y = 84 + 25 * y; CDC *pDC = GetDC(); CPen pen; pen.CreatePen( PS_SOLID, 1, 0xff
25、); pDC-SelectObject( &pen ); pDC-SetROP2( R2_NOTXORPEN ); m_iml.Draw( pDC, color, pt, ILD_TRANSPARENT ); STEP step; / 利用R2_NOTXORPEN擦除先前画出的矩形 if ( !m_pGame-m_StepList.empty() ) / 获取最后一个点 step = *( m_pGame-m_StepList.begin() ); pDC-MoveTo( 11 + 25 * step.x, 83 + 25 * step.y ); pDC-LineTo( 36 + 25 * s
26、tep.x, 83 + 25 * step.y ); pDC-LineTo( 36 + 25 * step.x, 108 + 25 * step.y ); pDC-LineTo( 11 + 25 * step.x, 108 + 25 * step.y ); pDC-LineTo( 11 + 25 * step.x, 83 + 25 * step.y ); / 更新最后落子坐标数据,画新的矩形 step.color = color; step.x = x; step.y = y; m_pGame-m_StepList.push_front( step ); pDC-MoveTo( 11 + 25 * step.x, 83 + 25 * step.y ); pDC-LineTo( 36 + 25 * step.x, 83 + 25 * step.y ); pDC-LineTo( 36 + 25 * step.x, 108 + 25 * step.y ); pDC-LineTo( 11 + 25 * step.x, 108 + 25 * st
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 《细胞免疫检测技术》课件
- 微课人力资源管理课程简介财经管理人力资源管理系
- n4护士述职报告
- 中小学水上交通安全知识
- 业务销售工作规划
- 低血糖的预防及应急预案
- 《公司法概论》课件
- 山东省枣庄市2024年中考化学真题【附答案】
- 医疗学术报告
- 数学学案:课堂导学“且”与“或”“非”(否定)
- 古诗文系列课件模板-山房春事二首
- 2024年上海市第二十七届初中物理竞赛初赛试题及答案
- 2011年认识实习报告
- 水务公司招聘笔试题库及答案
- 医疗垃圾分类与处理的人员培训与资质要求
- 审核的改进计划和措施
- 《旅游管理》专业调研报告
- 2024野生哺乳动物及栖息地调查技术规程
- 2024年中医药知识与技能竞赛题库附含答案
- 2023年6月大学生英语四级真题试卷及详细答案(三套)
- 高一选科指导课件
评论
0/150
提交评论