C++ 五子棋游戏论文.docx

上传人:小飞机 文档编号:3153762 上传时间:2023-03-11 格式:DOCX 页数:16 大小:43.72KB
返回 下载 相关 举报
C++ 五子棋游戏论文.docx_第1页
第1页 / 共16页
C++ 五子棋游戏论文.docx_第2页
第2页 / 共16页
C++ 五子棋游戏论文.docx_第3页
第3页 / 共16页
C++ 五子棋游戏论文.docx_第4页
第4页 / 共16页
C++ 五子棋游戏论文.docx_第5页
第5页 / 共16页
亲,该文档总共16页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《C++ 五子棋游戏论文.docx》由会员分享,可在线阅读,更多相关《C++ 五子棋游戏论文.docx(16页珍藏版)》请在三一办公上搜索。

1、C+ 五子棋游戏论文X X X X 大 学 C+语言程序设计课程设计 题目: 五子棋游戏 院: 专业班级: 学 号: 学生姓名: 指导教师: 教师职称: 起止时间: 课程设计任务及评语 院: 教研室: 学 号 课程设计题目 程序设计的任务与要求: .掌握面向对象程序设计语言C+的基本语法 五子棋游戏 学生姓名 专业班级 课程设计任务 .掌握C+面向对象设计的思想 .掌握VC+6.0与DEV C+ 开发工具的使用 (4). 运用标准C+规范设计应用程序 设计过程中,要严格遵守设计的时间安排,听从指导教师的指导。正确地完成上述内容,规范完整地撰写出设计报告。 成绩: 指导教师签字: 年 月 日 指

2、导教师评语及成绩xxxx大 学 课 程 设 计 说 明 书 目 录 第1章 课程设计目的与要求 . 1 1.1 设计目的 . 1 1.2实验环境 . 1 1.3预备知识 . 1 1.4设计要求 . 1 第2章 课程设计内容 . 2 2.1 课题描述 . 2 2.2 系统设计 . 2 2.2.1功能分析 . 2 2.2.2面向对象设计 . 3 2.2.3类成员描述 . 6 2.3程序实现 . 6 2.3.1源码分析 . 6 2.3.2运行结果 . 12 第3章 总结 . 13 参考文献 . 14 xxxx 大 学 课 程 设 计 说 明 书 第1章 课程设计目的与要求 1.1 设计目的 将理论教

3、学中涉及到的知识点贯穿起来,对不同的数据类型、程序控制结构、数据结构作一比较和总结,结合设计题目进行综合性应用,对所学知识达到融会贯通的程度。 通过课程设计,学生在下述各方面的能力应该得到锻炼: 进一步巩固、加深学生所学专业课程C+语言教程的基本理论知识,理论联系实际,进一步培养学生综合分析问题,解决问题的能力。 全面考核学生所掌握的基本理论知识及其实际业务能力,从而达到提高学生素质的最终目的。 利用所学知识,开发小型应用系统,掌握运用C+语言编写调试应用系统程序,训练独立开发应用系统,进行数据处理的综合能力。 对于给定的设计题目,如何进行分析,理清思路,并给出相应的数学模型。 掌握面向对象程

4、序设计的方法。 熟练掌握C+语言的基本语法,灵活运用各种数据类型。 进一步掌握在集成环境下如何调试程序和修改程序。 1.2实验环境 硬件要求能运行Windows 操作系统的微机系统。C+语言应用程序开发软件使用:VC+ 系统,或其他C+语言应用程序开发软件。 1.3预备知识 熟悉C+语言程序设计的基本知识及VC+编辑器的使用方法。 1.4设计要求 1.仔细分析设计题目,画出程序流程图,编写程序源代码。 2.积极上机调试源程序,增强编程技巧与调程能力。 3.认真书写课程设计预习报告,课程设计说明书。 4.遵守课程设计要求和机房管理制度,服从指导教师的安排,确保课程设计的顺利完成课程设计内容。 1

5、 xxxx 大 学 课 程 设 计 说 明 书 第2章 课程设计内容 2.1 课题描述 五子棋游戏的实现需要一定的人工智能,让电脑会思考问题。电脑通过思考后自动做出反应。做五子棋游戏可以让我对人工智能及MFC有初步的认识。同时更锻炼了C+的实战能力,为以后这方面的发展打下基础,随后详细介绍了五子棋游戏的开发过程。 本系统将实现下棋中可能出现的意外进行了处理。这样五子棋休闲游戏将不在是一个功能单一界面枯燥的无声游戏,而是一个较完善的休闲游戏。 2.2 系统设计 2.2.1功能分析 用函数画出棋盘,画出棋子 实现人工智能让电脑具有“思考”能力,实现人机对弈。玩家先走执白子,电脑自动后手下棋,执黑子

6、。玩家执白子#define White 0白子在数组位置定义为0;电脑黑子#define Black 1数组位置定义为1;无子位置#define Empty -1数组位置定义为-1。 本程序将棋盘设为一个二维数组,每次点击鼠标左键通过void CMyView :OnLButtonDown(UINT nFlags, CPoint point)反馈点击坐标信息,从而改变二维数组相应位置上的值,再在 void CMyView:OnDraw(CDC* pDC)函数中根据数组的值绘制出棋子。 玩家先手下棋后判断此时棋盘输赢情况 进而SendMessage(WM_COMPUTER);发送消息让电脑思考下棋

7、。电脑思考分情况:当棋盘上只有一个棋子时1=m_Unit,电脑会生成八个随机数根据生成的随机数随机在玩家棋子周围下一步棋。玩家下棋时m_IsManOrder=TRUE;当玩家落棋以后m_IsManOrder=FALSE;此时玩家不能在下棋,电脑开始下棋,电脑下完棋后m_IsManOrder=TRUE人又可以下棋。这样就实现了人机交替下棋。 倒计时功能 通过SetTimer(1,1000,NULL);函数每1秒响应一次OnTimer,定时器标号为1。通过KillTimer(1);关闭1号定时器。 倒计时有四种可选项:OnLevtime1、 OnLevtime2 、OnLevtime3、 OnNo

8、time这四个函数分别对应30秒、一分钟、五分钟和不限时这四种情况。 在void CMyView:OnTimer(UINT nIDEvent) 函数中,当时间=10秒时,开始读秒。并当时间减2 xxxx 大 学 课 程 设 计 说 明 书 少至0是判定玩家输。 坐标显示 实现显示上一步坐标功能比较简单,直接根据m_ChePos.x和m_ChePos.y来决定输出的坐标。只是当m_ChePos.x时直接输出数字即可,但m_ChePos.y时要用switch转换一步,将数字对应的字母AO输出即可 2.2.2面向对象设计 CAboutDlg继承了CDialog类。对话框有两类:模态对话框和非模态对话

9、框。模态对话框在应用继续进行之前必须关闭。非模态对话框允许用户执行另外的操作而不必取消或删除该对话框 一个CDialog对象是对话框模板与一个CDialog派生类的组合。使用对话框编辑器创建对话框并存入资源之中,然后使用ClassWizard创建一个CDialog派生类。同其它窗口一样,对话框从Windows 中获取信息。在对话框中会对来自对话框控件的处理消息感兴趣,因为它说明了对话框是如何与用户交互的。ClassWizard观察对话框每个控件可能产生的消息,可以选择你所希望处理的消息。ClassWizard 将适当的消息映射器入口和消息处理成员函数加到一个新类中。 图2.1 CAboutDl

10、g类图 CMyApp继承了CWinApp类。通过它来继承Windows应用程序对象。应用程序对象提供了初始化应用程序和运行应用程序所需的成员函数。 每个使用微软基础类库的应用程序都只能包含一个从CWinApp继承的对象。当Windows调用WinMain函数时,这个对象在其它C+全局对象都已经生成并且可用之后才被创建,WinMain函数是由微软基础类库提供的。将CWinApp对象定义为全局的。当从CWinApp继承应用程序类的时候,应重载InitInstance成员函数以创建应用程序的主窗口对象。 3 xxxx 大 学 课 程 设 计 说 明 书 图2.2 CMyApp类图 图 2.3 CMy

11、View类图 整体UML类图如下: -结束1CMyChessApp-结束4*-结束6*1-结束2CSplashWindow*CMyChessDlg113-结束-结束5图2.4 整体的UML类图 4 xxxx 大 学 课 程 设 计 说 明 书 总体流程图 主循环控制模块:控制下棋顺序,当轮到某方下子时,负责将程序转到相应的模块中去,主要担当一个调度者的角色。这个五子棋程序是用键盘控制下棋。 五子棋流程图如2.5所示 开始 白方下子 判断该位置是否有棋 找另一位置 有 是 白方下子 判断白方是否胜出 否 黑方下子 跳出白方胜出 是 选择是否重新开局 游戏结束 判断该位置是否有棋 找另一位置 有

12、黑方下子 无 判断黑方是否胜出 跳出黑方胜出 是 图2.5五子棋的流程图 5 xxxx 大 学 课 程 设 计 说 明 书 2.2.3类成员描述 核心类Class CMyView函数成员及其主要功能简介: CMyView:CMyView 构造函数,初始化数据 CMyView:CMyView 析构函数 BOOL CMyView:PreCreateWindow(CREATESTRUCT& cs) 生成窗口 void CMyView:OnDraw(CDC* pDC) 设置底色,插入棋盘图片,画棋子,显示剩余时间/显示横纵坐标 在MFC的发行版本中,ASSERT_VALID什么也不做。在调试版本中,它

13、检验一个指针是否为NULL,并且调用对象自己的AssertValid成员函数。如果这些测试中有些失败了,它就按照与ASSERT相同的方式显示一个警告信息。 void CMyView: (CDumpContext& dc) const CMyDoc* CMyView:GetDocument / non-debug version is inline void CMyView:OnGameStart /游戏一开始的一些初始化和设置 void CMyView:OnGameOver/游戏结束后的一些操作和设置 void CMyView:OnHelp /帮助 2.3程序实现 2.3.1源码分析 初始化棋

14、盘:判断哪方先开始, 初始化计算机和玩家的获胜组合情况 bool ctable1515572,bool ptable1515572 void CMyChessDlg:InitializeBoard /初始时双方都还没下子 int i,j,count=0,k; m_pclastpos.x=-1; m_pclastpos.y=-1; m_pplastpos.x=-1; m_pplastpos.y=-1; start=true; /判断哪方先开始 if(m_bwfirst) 6 xxxx 大 学 课 程 设 计 说 明 书 player=false; computer=true; else play

15、er=true; computer=false; pwin=cwin=false; for(i=0;i15;i+) for(j=0;j15;j+) for(k=0;k572;k+) ptableijk=false; ctableijk=false; for(i=0;i2;i+) for(j=0;j572;j+) winij=0; for(i=0;i15;i+) for(j=0;j15;j+) boardij=2; for(i=0;i15;i+) for(j=0;j11;j+) for(k=0;k5;k+) ptablej+kicount=true; ctablej+kicount=true;

16、count+; for(i=0;i15;i+) for(j=0;j11;j+) for(k=0;k5;k+) ptableij+kcount=true; ctableij+kcount=true; /初始化计算机和玩家的获胜组合情况7 xxxx 大 学 课 程 设 计 说 明 书 count+; for(i=0;i11;i+) for(j=0;j11;j+) for(k=0;k5;k+) ptablej+ki+kcount=true; ctablej+ki+kcount=true; count+; for(i=0;i=4;j-) for(k=0;k5;k+) ptablej-ki+kcount

17、=true; ctablej-ki+kcount=true; count+; 给出下了一个子后的分数: int CMyChessDlg:GiveScore(int type, int x, int y) int i,score=0; for(i=0;i572;i+) if(type=1) if(ctablexyi) switch(win1i) case 1: score+=5; break; case 2: score+=50; break; case 3: score+=100; break; 8 /计算机下 xxxx 大 学 课 程 设 计 说 明 书 case 4: score+=100

18、00; break; default: break; /人下 else if(ptablexyi) switch(win0i) case 1: score-=5; break; case 2: score-=50; break; case 3: score-=500; break; case 4: score-=5000; break; default: break; return score; 核心程序 ,即计算机如何运用极小极大法分析,选取最优走法,在程序中极小极大法即体现在两个while循环前后及之间的内容,其估价函数的体现在ctemp+pscore中 void CMyChessDlg:

19、ComTurn Int bestx,besty,i,j,pi,pj,ptemp,ctemp,pscore=10,cscore=-10000, ctempboard1515,ptempboard1515; int m,n,temp120,temp220; /暂存第一步搜索的信息 if(start) if(board77=2) 9 xxxx 大 学 课 程 设 计 说 明 书 bestx=7; besty=7; else bestx=8; besty=8; start=false; else /寻找最佳位置 GetBoard(ctempboard,board); while(SearchBlank

20、(i,j,ctempboard) /进行第一步查找 n=0; pscore=10; GetBoard(ptempboard,board); /获取当前棋盘状态 ctempboardij=3; /标记已被查找 ctemp=GiveScore(1,i,j); for(m=0;mptemp) /此时为玩家下子,运用极小极大法时应选取最小值 pscore=ptemp; 10 xxxx 大 学 课 程 设 计 说 明 书 for(m=0;mcscore) /此时为计算机下子,运用极小极大法时应选取最最大值 cscore=ctemp+pscore; bestx=pi; besty=pj; boardbes

21、txbesty=1; if(m_pclastpos.x!=-1&m_pclastpos.y!=-1) /画前一棋子 if(!m_bwfirst) DrawBlackChess(m_pclastpos.x,m_pclastpos.y); else DrawWhiteChess(m_pclastpos.x,m_pclastpos.y); if(!m_bwfirst) DrawNowBlack(bestx,besty); else DrawNowWhite(bestx,besty); m_pclastpos.x=bestx; m_pclastpos.y=besty; for(i=0;i572;i+)

22、 /修改计算机下子后,棋盘的变化状况 if(ctablebestxbestyi&win1i!=7) win1i+; if(ptablebestxbestyi) ptablebestxbestyi=false; win0i=7; computer=false; 11 xxxx 大 学 课 程 设 计 说 明 书 player=true; 程序流程的部分控制: void CMyChessDlg:OnTimer(UINT nIDEvent) / TODO: Add your message handler code here and/or call default IsWin; /是否已有一方获胜

23、if(pwin) /玩家获胜 KillTimer(0); MessageBox(恭喜,您真厉害!); player=false; computer=false; m_binit=true; else if(cwin) /计算机获胜 KillTimer(0); MessageBox(抱歉,您输了); player=false; computer=false; m_binit=true; 2.3.2运行结果 游戏结束界面: 图2.7 12 xxxx 大 学 课 程 设 计 说 明 书 第3章 总结 通过编写这个程序,我体会最为深刻的一点是系统架构和设计模式的重要性。即使是对于一个并不大的程序,代码

24、的组织都是非常重要的,因为这关系到日后的维护以及扩展。这个游戏之中,编程或者博弈树算法的知识都可以直接从无所不包的Internet上获取,甚至可以直接获得一个完整的五子棋人机对弈算法的源代码级模块。但是对于系统的架构,却完全是自己的事情,几千上万行的代码需要通过合适的方法组织起来,使程序员编写代码更加有条理,更加符合软件工程的标准,这才是最重要的。 在刚开始编写这个程序的时候,我幼稚地认为其中最重要的是博弈树算法。我们的先人早已为我们准备好了各种精良可用的现成算法,我们所要做的就是直接“拿来主义”罢了;但是对于代码的组织才是真正软件工业的核心部分,因为软件事实上是直接和经济挂钩的,因此我们必须

25、在编写代码之前选择一种最为合适的方法来组织这些代码,否则我们将会失去更多的时间和金钱。 于是,我将以前写的代码全部删除,认真地思考了三天的时间。我也在这三天内真正从一个学生程序员走入了软件开发的大门,我开始发现其实软件开发并不是纯数学正相反,数学只占了很小的一部分。它其实是一种哲学,一种有着数学美感的哲学。 13 xxxx 大 学 课 程 设 计 说 明 书 参考文献 1.Nicolai M.Josuttis著 C+标准程序库 华中科技大学出版社 2.黄迪明 主编 C+语言程序设计基础 北京:电子工业出版社 3.钱能 主编 C+程序设计教程 北京:清华大学出版社 4.郑莉、董渊 编著 C+语言程序设计 北京:清华大学出版社 5.吴访升 编著 C+程序设计 北京: 机械工业出版社 6.Decoder 主编 C/C+程序设计 北京:中国铁道出版社 7.徐孝凯 编著 C+语言程序设计 北京:清华大学出版社 8.易君 编著 Visual C+.NET网络编程 中国铁道出版社 9.Bruce Eckel著 C+编程思想 机械工业出版社 10. 薛淑斌 袁玫 编著 C+程序设计教程 高等教育出版社 14

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号