《C高级语言程序设计课程设计石头剪刀布小游戏.doc》由会员分享,可在线阅读,更多相关《C高级语言程序设计课程设计石头剪刀布小游戏.doc(30页珍藏版)》请在三一办公上搜索。
1、 计算机科学与技术学院C高级语言程序设计课程设计报告 ( 2014 /2015 学年 第 1 学期)学生姓名: 学生专业: 学生班级: 学生学号: 指导教师: 2015年1月9日计算机科学与技术学院课程设计任务书课程设计名称C高级语言程序设计课程设计课程设计题目 石头剪刀布小游戏学生姓名专业班级学号课程设计任务内容问题描述 设计一个游戏,在游戏中用户用手表示石头、剪刀或布中的一个,出拳头表示石头,伸出两根手指表示剪刀,伸手表示布,用户做出他们的选择,计算机也随机的做出选择,如果所作的选择是一样的,则表示平局,否则就按如下规则决定胜负:石头砸坏剪刀;剪刀剪碎布;布覆盖石头,编写程序实现计算机与人
2、进行游戏。基本要求 (1)知识要求:了解和掌握枚举类型的要求;知道c+中类的各部分定义时的要求和注意;函数调用的必备知识;随机函数rang所需要点;知道调用类里面的函数要用到区域符“:”,函数输出输入所需内容等(2)结果要求:至少可以在输入相应的命令如(c,h,s,I,p,q)后,可以显示相应的结果能够让玩家可以了解和体会游戏,并且可以自由的运行游戏。 测试要求(1)可以运行代码并显示这是基本要求。(2)在输入布,剪刀,石头中任一选项时,电脑会出现任一选项与之对应并输出结果。(3)输入正确的命令测试是否运行正常,并得到想要的结果。指导教师: 时 间: 年 月 日 计算机科学与技术学院课程设计成
3、绩评审表课程设计名称C高级语言程序设计课程设计课程设计题目石头剪刀布小游戏学生姓名专业班级同组人学号指导教师设计成绩评价内容签 字: 时 间: 年 月 日 目录第一章. 设计问题描述与分析.11.1问题描述.11.2 系统功能分析.1第二章.算法设计与流程图.2 2.1算法设计.2 2.2流程图.5第三章.程序设计编码与测试.7 3.1程序代码.7 3.2测试.14第四章.设计过程总结或分析.19 第一章.设计问题描述与分析1 .问题描述;在游戏中,玩家们用手表示石头、剪刀或布中的一个,出拳头表示石头,伸出两根手指表示剪刀,伸手表示布,玩家和计算机做出他们的选择,如果所作的选择是一样的,则表示
4、平局,否则就按如下规则决定胜负:(1)石头砸坏剪刀;(2)剪刀剪碎布;(3)布覆盖石头。编写程序实现计算机与人进行游戏。2. 系统功能分析:游戏中可能出现的选择情况都可以估计到,因此,定义一个枚举类型把游戏中可能出现的选择项都列出来,包括cloth(布),hammer(锤子),scissors(剪刀),game(游戏结果),help(帮助),instructions(游戏方法指导),quit(退出游戏)。定义一个类Game,把需要让外界调用的成员函数指定为公用的,类中的公用部分包含玩家选择命令(select())、机器选择(mach())、提示游戏规(gamehelp())、判断输赢(Win_
5、lose())、游戏结果(gameshow())、帮助(gamehelp())游戏说明(instruct()每局游戏结果(solution())七个成员函数,另外有一个用来赋初值构造函数(Game();而为了保证类的封装性和信息的隐蔽,把数据成员指定为私有的。 创建游戏类对象g,调用对象g的成员函数solution(),开始游戏。 第二章.算法设计与流程图1.算法设计:(1)在头文件head.h中定义枚举类型enumc_h_scloth,hammer,scissors,game,help,instructions,quit来列出游戏选择项,同时定义一个类Game把需要让外界调用的成员函数sel
6、ect()、mach()、gamehelp()、Win_lose()、gameshow()、solution()、instruct()、Game()指定为公用的,为了保证类的封装性和信息的隐蔽,把数据成员intwin、intlose、inttie、enumc_h_splayer、enumc_h_smachine指定为私有的。(2)在源文件head.cpp中定义构造函数Game(),对赢、输、平局的数据成员初始化为0。(3)在源文件head.cpp中定义成员函数select(),获取玩家选择一个命令(即在石头、剪刀、布、游戏结果、游戏帮助、游戏介绍、退出中做出选择),并将选择的结果返回。(4)在
7、源文件head.cpp中定义成员函数mach(),实现机器对锤子、剪刀或布选择,这中间用到随机函数,利用到time.h和stdlib.h头文件,以及关键字rand、srand。(5)在源文件head.cpp中定义成员函数gameshow(intwin,intlose,inttie),输出游戏结果,包含有赢、输、平局以及游戏总次数的情况。(6)在源文件head.cpp中定义成员函数gamehelp(),输出各字符所表示的意义,以帮助玩家进行选择。 (7)在源文件head.cpp中定义成员函数成员函数win_lose(enumc_h_splayer,enumc_h_smachine),读取玩家和电
8、脑的选择,根据游戏规则判断玩家赢、输或平局,返回判断结果。(8)在源文件head.cpp中定义成员函数instruct(),对游戏规则进行说明。最后定义成员函数solution(),统计游戏从开始运行到现在运行的结果,并输出每局的游戏结果。(9)在源文件game.cpp中,定义主函数。在主函数中,创建游戏类对象g,调用对象g的成员函数solution(),开始游戏。2.流程图:2.1功能模块图:开始输入显示结果判断结果机器选择玩家选择 图2.1 功能模块2.2用户选择模块: 开始输入定义变量c获取用户输入选择定义枚举变量p用以返回玩家下一模块返回“布”返回“石头”返回“游戏介绍”返回“游戏结果
9、”返回“剪刀”返回“游戏帮助”返回“退出”return p 图2.2用户选择图2.3机器选择模块:开始输入 下一模块初始化随机种子定义变量 i并随机初始化i=i%3当i=0时,返回cloth当i=1时,返回hammer当i=2时,返回scissors 图2.3 机器选择图2.4判断模块:上一模块 下一模块定义变量 victory用以记录评判结果player= =clothplayer= =hammerYNvictory=machine= =hammer;victory=machine= =scissors;victory=machine= =cloth;YN 上一模块 图2.4 判断模块ins
10、truct( )(player=select( )!=quitswitch(player)2.5显示模块: clothhammerscissors machine = mach();player=machine累计平局次数输出“平局”win_lose( )累计玩家获胜次数输出玩家获胜累计电脑获胜次数输出电脑获胜输出游戏统计结果结束 图2.5显示模块图 第三章.程序设计编码与测试3.1程序代码: /head.h enum c_h_scloth,hammer,scissors,game,help,instructions,quit;class Game /Game类public: Game();
11、/构造函数 enum c_h_s select( ); /选择命令函数 enum c_h_s mach( ); /机器选择函数 void gamehelp( );/帮助函数 int Win_lose(enum c_h_s player,enum c_h_s machine);/判断输赢函数 void gameshow(int,int,int );/游戏结果函数 void solution( );/游戏结果函数 void instruct( );/游戏说明函数private: int win; / 赢的次数 int lose; /输的次数 int tie; /平局次数 enum c_h_s pl
12、ayer; /玩家的选择 enum c_h_s machine; /机器的选择;/head.cpp #include#include#includeGame:Game()win=0;lose=0;tie=0; enum c_h_s Game:select()char c;enum c_h_s p;cout请选择c,h或sc;switch(c)case c: p=cloth; cout玩家的选择:n; cout n; cout n; cout n; cout n;cout n; break;case h: p=hammer; cout玩家的选择:n;cout n; cout n;cout n;c
13、out n; break;case s: p=scissors; cout玩家的选择:n; cout n; cout n;cout n;cout n; break;case g: p=game;break;case p: p=help;break;case i: p=instructions;break;case q: p=quit;break;default: cout输入有误,请重新输入:endl;return p;enum c_h_s Game:mach() /机器选则结果int i;srand(unsigned)time(NULL); 8/函数rand()是真正的随机数生成器,而sra
14、nd()会设置供rand()使用的随机数种子。/如果你在第一次调用rand()之前没有调用srand(),那么系统会为你自动调用srand()。/而使用同种子相同的数调用 srand()会导致相同的随机数序列被生成。i=rand();i=i%3;if(i=0) cout电脑的选择:n; cout n; cout n; cout n; cout n;cout n;return cloth; elseif(i=1) cout电脑的选择:n; cout n; cout n; cout n; cout n;return hammer;elsecout电脑的选择:n; cout n; cout n; c
15、out n; cout n; return scissors;void Game:gameshow(int win,int lose,int tie )cout游戏结果如下:endl 玩家获胜的次数是:winendl 电脑获胜的次数是:loseendl 平局的次数是:tieendl 游戏的总次数是:win+lose+tieendl;void Game:gamehelp( )cout 玩家可以输入下列的字符:endl c 表示布 endl h 表示锤子 endl s 表示剪刀 endl g 查看游戏结果 endl p 可获得游戏帮助 endl i 游戏指导信息 endl q 退出游戏 endl;
16、int Game:Win_lose(enum c_h_s player,enum c_h_s machine )int victory;if(player=cloth)victory=machine=hammer;elseif(player=hammer)victory=machine=scissors;elsevictory=machine=cloth;return victory;void Game:instruct( ) cout 剪刀 锤子 布 小游戏 endl 在这个游戏中 endl c 表示布 endl h 表示锤子 endl s 表示剪刀. endl 游戏者和计算机都只选择 c,
17、h,s中的一个.如果二者的选择相同,那么这一局就是平局.此外: endl 布包锤子(布获胜). endl 锤子打烂剪刀(锤子获胜). endl 剪刀剪布(剪刀获胜). endl 还有其它的选择是: endl g 表示游戏的结果(至今获胜的次数) endl p 可获得帮助 endl i 可获得游戏方法的指导信息 endl q 表示退出游戏 endl 这个游戏一直重复到游戏者选择 q 为止. endl goodluck endl;/game.cppvoid Game:solution( ) /游戏结果Game:instruct( );while(player=select( )!=quit)swi
18、tch(player)case cloth:case hammer:case scissors: machine=mach();if(player=machine) tie=tie+1; cout平局endl; elseif(Win_lose(player, machine)win=win+1;cout玩家获胜endl;elselose=lose+1;cout电脑获胜endl;case game: Game:gameshow(win,lose,tie ); break;case instructions: Game:instruct( );break;case quit: gameshow(w
19、in,lose,tie );break;case help: Game:gamehelp( );break; Game:gameshow(win,lose,tie );coutbyeendl; #includevoid main()cout 软件132001 201320020122 吕毅endl;Game g;g.solution( );3.2测试:1.游戏规则及说明截图: 图3.1游戏规则及说明截图2. 游戏运行及统计结果截图: (1). 图3.2游戏运行截图 13图3.2中玩家输入选择c(cloth)即选择布,此时电脑选择的也是c(cloth)布,所以结果是平局,总次数一次。(2). 图
20、3.3游戏运行截图图3.3中当玩家选择h(hammer)即锤子时,电脑选择s(scissors)剪刀,玩家获胜,总次数两次,平局一次。(3). 图3.4游戏运行截图图3.4中玩家选择s(scissors)即剪刀,电脑选择h锤子,此时电脑获胜,总次数三场,平局一场。3.查看游戏结果截图: 图3.5游戏结果截图图3.5中输入g命令即查看游戏结果。4.游戏帮助截图: 图3.6游戏帮助截图图3.6中输入p命令即(help)命令得到游戏帮助信息1. 游戏指导说明截图: 图3.7游戏指导说明截图图3.7中输入i(intruction)命令,获得游戏指导说明2. 退出游戏截图: 图3.8退出游戏截图图3.8
21、中输入q(quit)停止命令,按enter键退出。第四章.设计过程总结或分析总结: 在设计石头-剪刀-布游戏的程序过程中,我们用到了面向对象的类、成员函数、结构函数、随机函数、枚举类型、break语句、for语句、if语句、while循环、函数调用机制、参数的传递、switch语句等。 本设计基本完成了设计的要求,测试结果是正确的。如需完善的话可以把游戏所做的选择可以弄成图像,让程序变的更加直观。设计心得和体会:在这个程序中让我了解了什么是类,类所包含的对象怎么去调用,对于它的保护对象和公有对象理解了其中的作用和效果。补充了一个随机函数,让我知道到了随机种子的生成,与应用的技巧。总之这个实训让
22、我得到了很多重要的编译技巧和思考的路线方向。在设计这个小游戏过程中,我遇到了很多问题:1、枚举类型的定义和做参数的使用,随机函数的头文件和初始化化随机函数,上网收集错误,分析自己的不足处,然后加以改正。2、调用类里面的函数要用到区域符“:”,会常常忘记,还有使用类的私有成员时只有类里面的对象可以调用和定义等等。附录集合交并差:流程图如下:I=4结束I=2输出交集I=3输出差集I=1开始输入集合1输入集合2输出并集代码:#include#includetypedef struct LNode/定义结构体类型指针 char data; struct LNode*next;*pointer;void
23、 Inputdata(pointer head)/定义输入集合函数 pointer p; char tmp; scanf(%c,&tmp); while(tmp!=n) p=(pointer)malloc(sizeof(struct LNode); p-data=tmp; p-next=head-next; head-next=p; scanf(%c,&tmp); void Output(pointer head)/定义输出集合函数 pointer p; p=head-next; while(p) printf(%c,p-data); p=p-next; printf(n);void Add(
24、pointer head1,pointer head2,pointer head3)/定义集合的并集函数 pointer p1,p2,p3; p1=head1-next; while(p1) p3=(pointer)malloc(sizeof(struct LNode); p3-data=p1-data; p3-next=head3-next; head3-next=p3; p1=p1-next; p2=head2-next; while(p2) p1=head1-next; while(p1)&(p1-data!=p2-data) p1=p1-next; if (!p1) p3=(point
25、er)malloc(sizeof(struct LNode); p3-data=p2-data; p3-next=head3-next; head3-next=p3; p2=p2-next; void Same(pointer head1,pointer head2,pointer head3)/定义集合的交集函数 pointer p1,p2,p3; p1=head1-next; while(p1) p2=head2-next; while(p2!=NULL)&(p2-data!=p1-data) p2=p2-next; if(p2!=NULL)&(p2-data=p1-data) p3=(p
26、ointer)malloc(sizeof(struct LNode); p3-data=p1-data; p3-next=head3-next; head3-next=p3; p1=p1-next; void Sub(pointer head1,pointer head2,pointer head3)/定义集合的差集函数 pointer p1,p2,p3; p1=head1-next; while(p1) p2=head2-next; while(p2)&(p2-data!=p1-data) p2=p2-next; if(!p2) p3=(pointer)malloc(sizeof(struc
27、t LNode); p3-data=p1-data; p3-next=head3-next; head3-next=p3; p1=p1-next; void main()/主函数 int n,m; char str; printf(输入数据,按回车键结束 n); pointer head1,head2,head3;/声明pointer变量 head1=(pointer)malloc(sizeof(struct LNode); head1-next=NULL; head2=(pointer)malloc(sizeof(struct LNode); head2-next=NULL; head3=(
28、pointer)malloc(sizeof(struct LNode); head3-next=NULL; printf(请输入集合1:n); Inputdata(head1);/调用输入集合函数 printf(请输入集合2:n); Inputdata(head2);/调用输入集合函数loop:printf(n请选择正确的操作类型!n); printf(1:并集t2:交集t3.差集t4.退出n请选择序号n); for(m=0;m+) scanf(%d,&n);switch(n)case 1: printf(两集合的并是n); Add(head1,head2,head3);/调用并集函数 Out
29、put(head3); head3-next=NULL; break;case 2: printf(两集合的交是n); Same(head1,head2,head3);/调用交集函数 Output(head3); head3-next=NULL; break;case 3: printf(两集合的差是n); Sub(head1,head2,head3);/调用差集函数 Output(head3); head3-next=NULL; break; case 4: getchar(); printf(确定要退出吗?n); str=getchar(); if(78=str|110=str) goto loop; if(89=str|121=str) exit(0); else printf(错误的指令!n); goto loop; break; default: printf(错误的指令!,请重新输入!nn); goto loop; break;