版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、目录第1章 :课程设计目的和要求·······················21.1 数据结构课程设计的目的 ·····················
2、83;····21.2 数据结构课程设计实现的要求······················2第2章 :课程设计任务内容··················&
3、#183;······32.1 五子棋对弈系统···································3第3章 :详细设计说明····&
4、#183;························43.1 功能设计·······················
5、3;················43.2五子棋对弈系统流程图······························43.3 软件中
6、实现各项功能的函数与程序代码········5第4章 :程序运行环境说明··························104.1 程序运行环境说明及出现的问题········
7、·············104.2 运行结果···································
8、183;·····10第五章:课程设计心得与体会····················14附录·····················&
9、#183;··················15源程序:······························&
10、#183;······16五子棋第1章 课程设计目的和要求1.1 数据结构课程设计的目的 进一步培养结构化程序设计的思想,加深对高级系统语言基本语言要素和控制结构的理解,针对数据结构中的重点和难点内容进行训练,独立完成有一定工作量的程序设计任务,同时强调好的程序设计风格。此课程设计着眼于知识的运用,把平常学的知识运用到课程实践中来,本身就是考察我们知识运用能力。要求熟悉运用一些编程软件,对我们所学的理论知识进一步的深化。1.2 数据结构课程设计实现的要求使用C+语言编写一个基于控制台的简单程序,使学生掌握简单的程序设计技巧。同时设计一
11、个简单的五子棋对弈系统,可以实现五子棋的基本功能,是一款娱乐用的小型程序。第2章 课程设计任务内容2.1五子棋对弈系统 设计一个五子棋系统程序,实现对五子棋进行运行。基本要求:五子棋是有两个人在一盘棋上进行对抗的竞技活动。在对局开始时,先由用户选择哪方开局,先开局一方将一枚棋子落在一点上,然后由另一方在对方棋周围交叉点上落子,如此轮流落子,知道某一方首先在棋盘的直线、横线或斜线上形成连续的五子则该方程就算获胜。此时算法结束,当有任何一方退时出,都可在算法中实现。 第三章 详细设计说明3.1 功能设计(1)由两个玩家分别下棋,当某一玩家五子相连,则赢。 (2)界面要求:初始状态显示棋盘,并显示两
12、个玩家的操作键及初始玩家名称;游戏进行状态动态显示棋盘,不同玩家的棋子用不同符号显示,屏幕上显示当前玩家号,结束时显示赢家名称。开始3.2五子棋对弈系统流程图 白放下子判断该位置是否有棋找另一位 是白方下子 否判断是否重现开局跳出白棋获胜判断白方是否胜出 是否黑方下子 否 判断该位置是否有棋棋 否游戏结束找另一位 是否 黑方下子 跳出黑棋获胜判断黑方是否胜出 是判断该位是否图 3-1程序总体图白(黑)方下子 是白(黑)子在水平方向是否大于4 白(黑)方获胜否白(黑)子在垂直方向是否大于4是进入选择是否重新开局框白(黑)方获胜 否 是白(黑)子在正对角线方向是否大于4白(黑)方获胜 否 是白(黑
13、)子在反对角线方向是否大于4白(黑)方获胜否黑(白)方下子图3-2算法流程图3.3 软件中实现各项功能的函数与程序代码主要函数、结构体和链表Int a; /纪录坐标位置Int b; /纪录坐标位置Char achBoardij,/用于在【a】【b】处落子chSort;; /棋子的类别Int nWin /赢棋的次数类的使用:class CGobangprivate:char chSort; /棋子的类别int nWin; /赢棋的次数int nLose; /输棋的次数static int nDraw; /平局次数public: static char achBoard1919; /棋盘stati
14、c int nSize; /棋盘的尺寸nSize*nSizeCGobang(char chsort) /构造函数,决定一方棋子的类别chSort=chsort;nWin=nLose=nDraw=0;friend void huiqi(); /悔棋static void savefile(); /将棋盘保存至文件static void readBoard(); /从文件中读入棋盘void continute(); /接着上次的游戏玩void PlayTurn(void); /走一步棋int Judge(); /判断是否连成五子,是则返回1void Win(void); /赢棋void Lose(
15、void); /输棋static void Draw(void); /平局void PrintInfo(void); /打印总体情况static void PrintBoard(void); /输出棋盘static int GetFull(void); /判断棋盘是否一满static void InitialBoard(void); /初始化棋盘;本次程序设计主要设计了五个模块1.绘制棋盘模块 当游戏初始化时,和每当落子消息触发时,都需要对棋盘进行重绘。这里用特殊符号“o”“”分别来描绘白子、黑子。这个函数主要完成了以下工作: 装载棋盘二位数组并进行绘制。 根据棋盘数据绘制棋子。 绘制最后落子
16、指示规矩。绘制棋牌;定义变量i,ji=0;i+j>nSize退出循环i>nSize退出循环i<nSize j=0;j+判断:a=i&&=j判断:achBoardij=0NoYes输出“ ”NoYes “ + ” 判断:achBoardij=0输出NoYes“ 输出 ”“ 输出 ”完成扫描1行;输出换行符棋盘绘制结束 图3-32键盘操作控制模块 此模块主要用于处理与用户的交互过程。即完成落子判断过程。 此模块主要完成以下工作: 判断是否在棋盘内按落子键,和移动是否超出棋盘范围。 判断落子点是否已有棋子。3判断胜负模块 这是游戏中一个极其重要的算法,用来判断当前棋
17、盘的形势是哪一方获胜。五子棋的胜负,在于判断棋盘上是否有一个点,从这个点开始的右、下、右下、左下四个方向是否有连续的五个同色棋子出现,如图:图 3-5判断胜负方向 这个算法是本系统里的nWin成员函数。需要它接受一个棋子颜色的参数,然后返回一个布尔值,这个值指示是否胜利。1).横向判断流程图“” 定义变量:lint i,j,k/控制循环变量 int k=0, 循环控制列:j=0,j+ j>=nSize J, j<nSize 循环控制列:i=0,j+ IiIIi i>=nSize输出结果;nWin=output(k,nWin) i<nSize 循环控制 5:k=0,k+
18、k>=5 k<5achBoard11+k =1 achBoard1 i+k =2 k+ k+图3-6 循环控制 5:k=0;k+K>5 k>=5 Name1+kj=1 Namei+k1=2 k+ k+2).竖向判断流程图“|”3).从左到右斜方向“” 循环控制 5:k=0;k+ K>5 k>=5Name1+kj-k=1 Namei+kj-k=2 k+ k +图3-84) .从右到左斜方向“/” 循环控制 5:k=0;k+ k>5 k>=5Name1+kj-k=1 Namei+kj-k=2 k+ k+图3-9图3-94.重置棋盘模块 在每局游戏开始
19、的时候都需要调用这个函数InitialBoard(void)将棋盘初始化,也就是棋盘的初始化工作。在这个函数中,主要发生了这么几件事情: 将achBoardNN中每一个落子位都置为无子状态(0)。 默认的先手顺序是黑子先手,置player=1。5.游戏结束模块 这一模块主要用于释放内存,用输出流语句输出结束信息,并控制循环退出程序。第四章 程序运行环境说明4.1 程序运行环境说明及出现的问题该程序可以实现对学生信息的录入和显示,可以采用Dev-c或者Visual C+运行,可以实现简单的界面化,使程序方便使用和修改。4.2 运行结果软件使用结果1.进入游戏主界面图4-12.点击1开始游戏图4-
20、23.继续点击1或2游戏过程中图4-34.判断胜负图4-45.在主界面中点击0退出游戏图4-6第五章 课程设计心得与体会课程设计是培养学生综合运用所学知识 ,发现,提出,分析和解决实际问题,锻炼实践能力的重要环节,是对我们的实际工作能力的具体训练和考察过程.随着科学技术发展的日新月异,当今计算机应用在生活中可以说得是无处不在。因此作为二十一世纪的大学来说掌握程序开发技术是十分重要的,而C+语言又是最常见,功能最强大的一种高级语言,因此做好C+语言课程设计是十分必要的。通过几周的课程设计使我们懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论
21、中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。在设计的过程中遇到问题,可以说得是困难重重,这毕竟第一次做这么长的程序设计,难免会遇到过各种各样的问题,同时在设计的过程中发现了自己的不足之处,对一些前面学过的知识理解得不够深刻,掌握得不够牢固,通过这次课程设计之后,我们把前面所学过的知识又重新温故了一遍。我做的是五子棋设计,虽然是很简单的一个小的程序,但对我来说却是一个很大的困难。更加是第一次做课程设计,所以做了一个下午却丝毫没有进展,最主要是不知从何开始,这个时候才知道上课老师们不厌其烦的教导是多么的宝贵,这个时候才后悔上课的时候没有认真的听讲。可是现在一切都晚了
22、,还好时间还算是充裕,只好拿出书本重新复习一下。开始的时候真的感觉编程是一件很无聊的事情,不过当一个程序运行成功的时候那种喜悦是无法言语的,那种成就感是无法比拟的。又经过几天的努力,终于把程序完成了,尽管程序还是有很多功能上的欠缺和漏洞,可我还是很高兴的。无论如何是自己的劳动成果,是自己经过努力得到的成绩,同时也是学习C+语言的一次实践作业,自己进步的证明。在课程设计过程中,收获知识,提高能力的同时,我也学到了很多人生的哲理,懂得怎么样去制定计划,怎么样去实现这个计划,并掌握了在执行过程中怎么样去克服心理上的不良情绪。因此在以后的生活和学习的过程中,我一定会把课程设计的精神带到生活中,不畏艰难
23、,勇往直前!附录1:参考文献1、谭浩强 著.C+程序设计教程.清华大学出版社2、陈维兴 林小茶 编著.C+面向对象程序设计.中国铁道出版社3、田淑清, C语言程序设计,北京:高等教育出版社,2006年1月4、David J.Kruglinski,Scot Wingo,George Shepherd,Visual C+6.0技术内幕(第五版),希望图书室译,北京:北京希望电子出版社,2001 年1月源程序:#include <iostream>#include <string>#include <fstream>#include <iomanip>
24、int a90,b90; /定义全局数组int k=0;using namespace std;class CGobang /棋子类private:char chSort; /棋子的类别int nWin; /赢棋的次数int nLose; /输棋的次数static int nDraw; /平局次数public:static char achBoard1919; /棋盘static int nSize; /棋盘的尺寸nSize*nSizeCGobang(char chsort) /构造函数,决定一方棋子的类别chSort=chsort;nWin=nLose=nDraw=0;friend void
25、 huiqi(); /悔棋static void savefile(); /将棋盘保存至文件static void readBoard(); /从文件中读入棋盘void continute(); /接着上次的游戏玩void PlayTurn(void); /走一步棋int Judge(); /判断是否连成五子,是则返回1void Win(void); /赢棋void Lose(void); /输棋static void Draw(void); /平局void PrintInfo(void); /打印总体情况static void PrintBoard(void); /输出棋盘static in
26、t GetFull(void); /判断棋盘是否一满static void InitialBoard(void); /初始化棋盘;char CGobang:achBoard1919;int CGobang:nSize=0;int CGobang:nDraw=0;void CGobang:Draw()cout<<"nntt平局!nn"nDraw+;void CGobang:InitialBoard() /初始化棋盘for(int i=0;i<nSize;i+)for(int j=0;j<nSize;j+)achBoardij=' ' v
27、oid CGobang:PrintBoard() /输出棋盘int i,j;cout<<endl;cout<<setw(5)<<endl;for(i=1;i<=nSize;i+)cout<<setw(4)<<i;cout<<endl;for(i=0;i<nSize;i+)cout<<setw(3)<<endl;cout<<i+1;for(j=0;j<nSize;j+)cout<<achBoardij<<" | "cout<
28、;<endl;int CGobang:GetFull() /判断棋盘是否一满,若是返回1for(int i=0;i<nSize;i+)for(int j=0;j<nSize;j+)if(achBoardij=' ')return 0;return 1;void CGobang:Win() /赢棋cout<<"nntt"<<chSort<<"方获胜!nn"nWin+;void CGobang:savefile() /将棋盘保存至文件ofstream outfile("C+.tx
29、t",ios:out);if(!outfile)cerr<<"open file error!"<<endl;exit(1);for(int i=0;i<nSize;i+)for(int j=0;j<nSize;j+) outfile.write(char *) &achBoardij,sizeof(achBoardij); outfile.close();void CGobang:Lose() /输棋nLose+;void CGobang:PlayTurn(void) /走一步棋int nRow,nCol;char c
30、hoice1,choice2;docout<<"t现在该"<<chSort<<"方下棋,请输入棋盘坐标(x,y):"cin>>nRow>>nCol;if(nRow>nSize|nCol>nSize)cout<<"t输入的坐标越界,x与y的范围应小于等于"<<nSize<<",请重新输入n"else if(nRow>0&&nCol>0&&achBoardnRow-1n
31、Col-1!=' ')cout<<"t棋盘("<<nRow<<","<<nCol<<")处已有棋子,请重新输入n" else if(nRow=-1) huiqi();else if(nRow=0&&nCol=0)cout<<"t确认你想结束游戏吗(y,n)?"cin.get(); cin>>choice1;if(choice1='y'|choice1='Y')cout&
32、lt;<"t是否保存(y,n)?:"cin.get();cin>>choice2;if(choice2='y'|choice2='Y')CGobang:savefile();cout<<"t保存成功,欢迎下次再玩!n"exit(1);elsecout<<"t游戏结束,欢迎再次使用五子棋游戏!"cout<<endl;exit(0);else achBoardnRow-1nCol-1=chSort;ak=nRow-1;bk=nCol-1;k+;break
33、;while(1);int CGobang:Judge() /判断是否连成五子,是则返回1int i,j;for(i=0;i<nSize;i+)for(j=0;j<nSize;j+)if(achBoardij=chSort)if(j+4<nSize)if(achBoardij+1=chSort&&achBoardij+2=chSort&&achBoardij+3=chSort&&achBoardij+4=chSort)return 1;if(i+4<nSize)if(achBoardi+1j=chSort&&
34、;achBoardi+2j=chSort&&achBoardi+3j=chSort&&achBoardi+4j=chSort)return 1;if(i+4<nSize&&j+4<nSize)if(achBoardi+1j+1=chSort&&achBoardi+2j+2=chSort&&achBoardi+3j+3=chSort&&achBoardi+4j+4=chSort)return 1;if(i-4>0&&j+4<nSize)if(achBoardi-
35、1j+1=chSort&&achBoardi-2j+2=chSort&&achBoardi-3j+3=chSort&&achBoardi-4j+4=chSort)return 1;return 0;void CGobang:PrintInfo(void) /打印总体情况cout<<"Size"<<chSort<<"方共计赢"<<nWin<<"局,输"<<nLose<<"局,平"<
36、<nDraw<<"局。"<<endl;void CGobang:readBoard() /以二进制形式从文件中读出棋盘ifstream infile("C+.txt",ios:in); if(!infile)cerr<<"open file eror!"<<endl;exit(1);else for(int i=0;i<nSize;i+)for(int j=0;j<nSize;j+) infile.read(char *) &achBoardij,sizeof(
37、achBoardij);infile.close();void huiqi() /悔棋 k-;CGobang:achBoardakbk=' 'k-;CGobang:achBoardakbk=' 'CGobang:PrintBoard();void PrintRule(void) /打印游戏规则cout<<"tnn"cout<<"tt欢迎使用五子连珠游戏!"<<endl<<endl; cout<<"tnn" cout<<"t
38、游戏规则:"<<endl; cout<<"t1.每1步输入要下棋子的格子的x,y坐标,按Enter键n" cout<<"t2.有1方首先5个棋子连成一线即判获胜n" cout<<"t3.当旗子布满棋盘但仍无获胜方即为平局n" cout<<"t4.一局结束后,若想继续按Y键,若退出则按其他键n" cout<<"t5.若想中途退出游戏,请输入(0,0),再按照提示保存游戏n" cout<<"t6.
39、悔棋请输入(-1,0)n" cout<<"t6.X方先行n" cout<<"nntt请按任意键开始下棋!nn"int JudgePlay(CGobang &SideX,CGobang &SideO) /每下一步要进行输赢的判断,有赢的则返回1 if(SideX.Judge() /X方获胜SideX.Win();SideO.Lose();return 1;else if(SideO.Judge() /O方获胜SideO.Win();SideX.Lose();return 1;elsereturn 0;void Play(CGobang &SideX,CGobang &SideO) /开始一局游戏while(1)system("cls"); cout<<"t*n" cout<<"tt.悔棋请输入(-1,0)n" cout<<"tt.中途退出请输出(0,0),并根据提示保存n" cout<<"t*n"CG
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 某制药厂产品质量控制办法
- 保险精算师考试试卷及答案
- T∕CATAGS 7-2020 通 用航空应急救援术语 含2026年第1号修改单
- 心理治疗中的统计疗效调节变量与结果个性化方案
- 专题三能量与动量阶段检测(基础学生版)
- 2026春六年级下册信息技术期末练习卷(清华版新疆)含答案 (三套)
- 江西省新余一中2026届高三5月综合练习(二)化学试题含解析
- 室内氡暴露的商场环境控制策略
- 医学26年:抗甲状腺药物不良反应 查房课件
- 2025~2026学年河南省兰考县度第一学期期末七年级英语学科学业评价试卷
- (正式版)DB50∕T 1915-2025 《电动重型货车大功率充电站建设技术规范》
- GB/T 4798.3-2023环境条件分类环境参数组分类及其严酷程度分级第3部分:有气候防护场所固定使用
- 螺栓、双头螺栓长度计算工具
- SH/T 0642-1997液体石油和石油化工产品自燃点测定法
- LY/T 2489-2015木材交付通用技术条件
- GB/T 3799-2021汽车发动机大修竣工出厂技术条件
- GB/T 14699.1-2005饲料采样
- GB/T 13824-2015旋转与往复式机器的机械振动对振动烈度测量仪的要求
- 病媒生物监测及防制汇总
- 2023年北京市大兴区卫生健康系统事业单位招聘笔试题库及答案解析
- 宏业清单计价入门教程课件
评论
0/150
提交评论