辽宁工业大学。
c++语言程序设计》课程设计(**)
题目: 五子棋游戏
院(系): 软件学院
专业班级: 软件工程113班
学号。教师职称: 副教授
起止时间:2011.12.12-2011.12.25
课程设计(**)任务及评语。
院(系):软件学院教研室:软件教研室。
将理论教学中涉及到的知识点贯穿起来,对不同的数据类型、程序控制结构、数据结构作一比较和总结,结合设计题目进行综合性应用,对所学知识达到融会贯通的程度。
通过课程设计,学生在下述各方面的能力应该得到锻炼:
1)进一步巩固、加深学生所学专业课程《c++语言教程》的基本理论知识,理论联系实际,进一步培养学生综合分析问题,解决问题的能力。
2)全面考核学生所掌握的基本理论知识及其实际业务能力,从而达到提高学生素质的最终目的。
3)利用所学知识,开发小型应用系统,掌握运用c++语言编写调试应用系统程序,训练独立开发应用系统,进行数据处理的综合能力。
4)对于给定的设计题目,如何进行分析,理清思路,并给出相应的数学模型。
5)掌握面向对象程序设计的方法。
6)熟练掌握c++语言的基本语法,灵活运用各种数据类型。
7)进一步掌握在集成环境下如何调试程序和修改程序。
硬件要求能运行windows 操作系统的微机系统。c++语言应用程序开发软件使用:vc++ 系统,或其他c++语言应用程序开发软件。
熟悉c++语言程序设计的基本知识及vc++编辑器的使用方法。
1.仔细分析设计题目,画出程序流程图,编写程序源**。
2.积极上机调试源程序,增强编程技巧与调程能力。
3.认真书写课程设计预习报告,课程设计说明书。
4.遵守课程设计要求和机房管理制度,服从指导教师的安排,确保课程设计的顺利完成课程设计内容。
本设计所完成的五子棋游戏游戏开发环境是在windows xp下使用microsoft visual c++6.0开发的c/s系统,可以实现网络间的双人对战及单机游戏,并且可以提供多****功能。本设计从c++程序设计开始入手,介绍了本系统相关的理论知识,随后详细介绍了五子棋游戏的开发过程。
包括服务器端、客户端的socket编程,五子棋服务器和客户端通信的实现,五子棋判断算法的实现,主界面视图以及定时器等附加功能的实现。最后对系统进行测试并对所做工作进行总结。本系统将实现下棋中可能出现的意外进行了处理。
这样五子棋休闲游戏将不在是一个功能单一界面枯燥的无声游戏,而是一个较完善的休闲游戏。
1. 程序中类classgobangplayer定义的函数有voidsetmove(charx,chary);主要功能是设置棋步,将字符类型变为相应的int类型,如'1',变为1,'a'变为10,这里x,和y的使用的数学上有点不同,主要是考虑到用了structpoint来表示棋盘的坐标,访问数组为array[这样x=要是非要同数学的习惯,array[看起来不方便。
2. 程序中利用宏来完成数据的颜色的棋子的类。
3. 程序中利用全局变量完成数据的输出及中间数据处理过程。
4. 编制函数boolgobangplayer::iswin()完成扫描的时候要考虑向左,和向右的情况,比如向左知道有2个相同,向右又有两个相同的棋子,向左向有在同一直线上,加上,刚下的,就有五个棋子,5子连线就胜了,count是用来表示同一直线上相连棋子的数目的,count==4时,就赢了,刚才已经说过,假如先向左扫描,得到相连棋子的数目,再向右扫描时,在左边的棋子还会起作用,因为他们是在同一直线上的,跟着,扫描另外一条直线的时候,count就应该重新为0,比如说,横的直线,不会影响竖的直线。
一条直线扫描两次。所以k%2==1,count=0。
5. 编制函数writedat(void)完成文件的读写过程。
6. 编制主函数 main() 完成函数调用过程。
7. 从vc++技术内幕中提取的winsock的派生类,用来实现网络连接。
电脑下子,其中最简单的计算方法,就是遍历棋型表computer[15][15][4]和player[15][15][4]找出其中数值最大的一点,在该点下子即可。但这种算法的弱点非常明显,只顾眼前利益,不能顾全大局,这就和许多五子棋初学者一样犯了“目光短浅”的毛病。要解决这个问题,我们引入‘今后几步猜测法’,具体方法是这样的:
首先,让电脑分析一个可能的点,假如在这儿下子将会形成对手不得不防守的棋型;那么下一步对手就会照您的思路下子来防守您,如此一来便完成了第一步的猜测。这时再调用模块4对猜测后的棋进行盘面分析,假如出现了‘四三’、‘双三’或‘双四’等制胜点,那么己方就可以获胜了(当然对黑棋而言‘双三’、‘双四’是禁手,另当别论);否则照同样的方法向下分析,就可猜测出第二步、第三步……等一等,要是盘面上没有对手必须防的棋型,哪该怎么办呢?进攻不成的话就得考虑防守了,将自己和对手调换一下位置,然后用上面的方法来猜测对手的棋,这样既可以防住对手巧妙的攻击,又能侍机发动反击。
五子棋的胜负,在于判断棋盘上是否有一个点,从这个点开始的右、下、右下、左下四个方向是否有连续的五个同色棋子出现判断胜负方向,这个算法也就是ctable的win成员函数。从设计的思想上,需要它接受一个棋子颜色的参数,然后返回一个布尔值,这个值来指示是否胜利,考虑到攻守两方面的需要,所以将玩家落子给的分数置为负值。获胜组合是一个三维数组,它记录了所有取胜的情况。
对于每一个落子坐标,获胜的组合一共有15 * 11 * 2 + 11 * 11 * 2 = 572种。
而对于每个坐标的获胜组合,应该设置一个[15][15][572]大小的三维数组。在拥有了这些获胜组合之后,就可以参照每个坐标的572种组合给自己的局面和玩家的局面进行打分,也就是根据当前盘面中某一方所拥有的获胜组合多少进行权值的估算,给出最有利于自己的一步落子坐标。由于是双方对弈,所以游戏的双方都需要一份获胜组合,也就是:
bool m_computer[15][15][572]; 电脑获胜组合。
bool m_player[15][15][572]; 玩家获胜组合。
在每次游戏初始化(conegame::init)的时候,需要将每个坐标下可能的获胜组合都置为true。此外,还需要设置计算机和玩家在各个获胜组合中所填入的棋子数:
int m_win[2][572];
每当一方落子后,都需要作如下处理:如果己方此坐标的获胜组合仍为true,且仍有可能在此获胜组合处添加棋子,则将此获胜组合添加棋子数加1;如果对方此坐标的获胜组合仍为true,则将对方此坐标的获胜组合置为false,并将对方此获胜组合添加棋子数置为-1(不可能靠此组合获胜)。
函数是根据当前的盘面来比较得到的可以考虑的几种情况,可以根据实际的得分情况选取分数比较高的几个盘面,也就是说在第一层节点选择的时候采用贪婪算法,直接找出相对分数比较高的几个形成第一层节点,目的是为了提高搜索速度和防止堆栈溢出。
其中对于search函数的表示如下:实际上核心的算法是一个剪枝过程,其中在这个搜索过程中相关的四个参数为:(1)当前棋局情况;(2)当前的下子方,可以是机器(max)或者是人(min);(3)父节点的值;(4)当前的搜索深度。
注意这里的函数是用来判断当前盘面是否可以分出胜负,而是对当前的盘面从机器的角度进行打分函数的主要目的是根据情况,即是机器还是用户来返回节点的应有的值。
1.类的设计。
本程序设计了cmychessapp类、csplashwindow类、cmychessdlg类三个类来实现该五子棋游戏。
cmychessapp类的作用:显示主面板信息。
csplashwindow类的作用:创建一个窗口,在上面贴图,并提供一个定时器的接口。
cmychessdlg类的作用:五子棋游戏控制。
cmychessapp类是cwinapp、cdialog的子类,csplashwindow类是cwnd的子类。
派生类cmychessapp类由cmychessdlg类继承,csplashwindow类由cmychessdlg类继承。
类图。类的 uml 表示是一个长方形,垂直地分为三个区。顶部区域显示类的名字。
中间的区域列出类的属性。底部的区域列出类的操作。当在一个类图上画一个类元素时,你必须要有顶端的区域。
图2.1 csplashwindow类的uml类图。
图2.2 csplashwindow类的uml类图。
图2.3 cmychessdlg类的uml类图。
整体uml类图如下:
图2.4 整体的uml类图。
3.总体流程图。
主循环控制模块:控制下棋顺序,当轮到某方下子时,负责将程序转到相应的模块中去,主要担当一个调度者的角色。这个五子棋程序是用键盘控制下棋。
五子棋流程图如2.5所示。
图2.5五子棋的流程图。
1. cmychessdlg类: 五子棋游戏控制。
软件工程课程设计
天水师范学院。课程名称 学生信息管理系统。指导老师 张少刚。学院 电子信息与电气工程学院。班级 12级计算机科学与技术 1 班。学号 20121030108 姓名 付永霞。2015年6月25日。目录。1.可行性研究。1.1技术可行性3 1.2经济可行性3 1.3操作可行性3 2.需求分析。2.2.1...
软件工程课程设计
徐州工程学院。课程设计报告。名称软件工程课程设计 学院信电工程学院 专业软件专业。班级 11软件。姓名云柏。姓名陆剑锋。姓名徐宁。姓名陈胜。指导老师王小磊。组员 云柏陆剑锋 徐宁陈胜。分工 引言。随着科技和经济的发展,人们的消费越来越倾向于网络,出现了网购这种越来越受欢迎的新型消费方式。为了提高学校...
软件工程课程设计
个人整理精品文档,仅供个人学习使用。课程设计教案的基本内容和要求 针对不同的课程设计题目,每位同学以软件设计为中心,完成从需求分析 软件设计 编码到软件测试运行的软件开发全过程。1 同类著名 浏览 分析 需求分析 3 原型主页设计及网页设计。4 数据库设计及应用设计。5 交互网页开发技术或其他专门开...