石头剪刀布游戏1.课题简介在游戏中,孩子们用手表示石头、剪刀或布中的一个,出拳头表示石头,伸出两根手指表示剪刀,伸手表示布,孩子们面对面地从1数到3时做出他们的选择,如果所作的选择是一样的,则表示平局,否则就按如下规则决定胜负:(1)石头砸坏剪刀;(2)剪刀剪碎布;(3)布覆盖石头。
编程实现计算机与人进行游戏。
2.设计过程(一)系统功能分析:游戏中可能出现的选择情况都可以估计到,因此,定义一个枚举类型把游戏中可能出现的选择项都列出来,包括cloth(布),hammer(锤子),scissors(剪刀),game(游戏结果),help(帮助),instructions(游戏方法指导),quit(退出游戏)。
例enum c_h_s{cloth,hammer,scissors,game,help,instructions,quit};定义一个类Game,把需要让外界调用的成员函数指定为公用的,所以,类中的公用部分应包含玩家选择命令(select( ))、机器选择(mach( ))、提示游戏规则(instruct( ))、判断输赢(Win_lose( ))、游戏结果(gameshow( ))、帮助(gamehelp( ))等成员函数,另外有一个用来赋初值构造函数;而为了保证类的封装性和信息的隐蔽,应把数据成员指定为私有的如图1所示。
(二)系统流程分析:图1、定义类Game的函数调用,函数流程图如下所示:图2、实现机器对锤子、剪刀或布选择的算法流程图,如下所示:图3、游戏选择函数,算法流程图:图4、输出游戏结果流程图如下所示:图5、主函数实现流程图如下所示:图6、统计游戏从开始运行到现在运行的结果流程图如下所示:(三)具体设计分析如下:1.1Game类实现1.1.1数据成员说明:int win; // 赢的次数int lose; //输的次数int tie; //平局次数enum c_h_s player; //玩家的选择enum c_h_s machine; //机器的选择1.1.2成员函数说明与实现1.1.2.1构造函数Game( )函数:Game( )功能:对赢、输、平局的数据成员初始化为0。
1.1.2.2成员函数select( )函数:enum c_h_s select();//玩家选择一个命令功能:获取玩家选择一个命令(即在石头、剪刀、布、游戏结果、游戏帮助、游戏介绍、退出中做出选择),并将选择的结果返回。
1.1.2.3成员函数mach( )函数:enum c_h_s mach( )功能:实现机器对锤子、剪刀或布选择。
1.1.2.4成员函数gameshow(int win,int lose,int tie )函数: void gameshow(int,int,int)功能:输出游戏结果,包含有赢、输、平局以及游戏总次数的情况。
1.1.2.5成员函数gamehelp( )函数:void gamehelp( )功能:输出各字符所表示的意义,以帮助玩家进行选择。
提示信息如下:c 表示布h 表示锤子s 表示剪刀g 查看游戏结果p 可获得游戏帮助I 游戏指导信息q 退出游戏算法:直接用cout语句输出。
1.1.2.6成员函数win_lose(enum c_h_s player,enum c_h_s machine )函数:int win_lose(enum c_h_s,enum c_h_s)功能:读取玩家和电脑的选择,根据游戏规则判断玩家赢、输或平局,返回判断结果。
1.1.2.7成员函数instruct( )函数: void instruct( )功能:对游戏规则进行说明。
游戏规则:**** 剪刀锤子布 ****在这个游戏中c 表示布h 表示锤子s 表示剪刀.游戏者和机器都只选择 c,h,s中的一个.如果二者的选择相同,那么这一局就是平局.此外:"布包锤子"(布获胜)."锤子打烂剪刀"(锤子获胜)."剪刀剪布"(剪刀获胜).还有其它的选择是:g 表示游戏的结果(至今获胜的次数)p 可获得帮助i 可获得游戏方法的指导信息q 表示退出游戏这个游戏一直重复到游戏者选择 q 为止.祝你好运!算法:可用cout语句输出上述内容。
1.1.2.8成员函数solution( )函数:void solution( )功能:统计游戏从开始运行到现在运行的结果,并输出每局的游戏结果。
1.2主函数实现功能:创建游戏类对象g,调用对象g的成员函数solution( ),开始游戏。
3.具体设计/* 对游戏Game类的成员结构声明.h#ifndef GAME#define GAMEenumc_h_s{cloth,hammer,scissors,game,help,instr uctions,quit};class Game{public:Game();enum c_h_s select();enum c_h_s mach();void gameshow(int,int,int);void gamehelp( ); int win_lose(enum c_h_s,enum c_h_s); void instruct( );void solution( );protected:int win;int lose;int tie;enum c_h_s player;enum c_h_s machine;};#endif/* Game类游戏的操作的函数定义.cpp #include<iostream.h>#include<time.h>#include<stdlib.h>#include"head.h"Game::Game(){win=0;lose=0;tie=0;}enum c_h_s Game::select(){char c;c_h_s p;cout<<" "<<endl;cout<<" 请选择c,h,或s:"<<endl;cout<<" "<<endl;cin>>c;switch(c){case's':p=scissors;break;case'h':p=hammer;break;case'c':p=cloth;break;case'g':p=game;break;case'p':p=help;break;case'i':p=instructions;break;case'q':p=quit;break;default:cout<<"error"<<endl;}return p;}enum c_h_s Game::mach(){srand((unsigned)time(NULL));int i=rand();i=i%3;if(i==0)return cloth;if(i==1)return hammer;elsereturn scissors;}void Game::gameshow(int win, int lose, int tie){cout<<endl;cout<<" 游戏结果如下: ";cout<<endl;cout<<" 玩家获胜的次数是:"<<win<<endl;cout<<" 电脑获胜的次数是:"<<lose<<endl;cout<<" 平局的次数是:"<<tie<<endl;cout<<" 游戏的总次数是:"<<win+lose+tie<<endl;}void Game::gamehelp(){cout<<endl;cout<<" 玩家可以输入下列字符: "<<endl;cout<<endl;cout<<" c 表示布 "<<endl;cout<<" h 表示锤子 "<<endl;cout<<" s 表示剪刀 "<<endl;cout<<" g 查看游戏结果"<<endl;cout<<" p 可获得游戏帮助"<<endl;cout<<" I 游戏指导信息"<<endl;cout<<" q 退出游戏"<<endl;}int Game::win_lose(enum c_h_s player,enumc_h_s machine){int victory=0;if(player==cloth)victory=machine==hammer;elseif (player==hammer)victory=machine==scissors;elsevictory=machine==cloth;if(victory!=0)return win;elsereturn lose;}void Game::instruct() {cout<<" **** 剪刀锤子布 **** "<<endl;cout<<endl;cout<<"在这个游戏中:"<<endl;cout<<"c 表示布"<<endl;cout<<"h 表示锤子"<<endl;cout<<"s 表示剪子"<<endl;cout<<"游戏者和机器都只选择 c,h,s 中的一个.如果二者的选择相同,此外:"<<endl;cout<<"“布包锤子”(布获胜)."<<endl; cout<<"“锤子打烂剪刀”(锤子获胜)."<<endl;cout<<"“剪刀剪布”(剪刀获胜)."<<endl;cout<<endl;cout<< "还有其它的选择是:"<<endl;cout<< "g 表示游戏的结果(至今获胜的次数)"<<endl;cout<< "p 可获得帮助"<<endl;cout<<"i 可获得游戏方法的指导信息"<<endl;cout<<"q 表示退出游戏"<<endl;cout<<"这个游戏一直重复到游戏者选择 q 为止."<<endl;cout<<"祝你好运!"<<endl;}void Game::solution( ){instruct();while((player=select( ))!=quit){switch(player){case cloth:case hammer:casescissors:machine=mach();break;case game:{gameshow(win,lose,tie);break;}case instructions:{instruct( );break;}case help:{gamehelp();break;}default:cout<<"对不起,您输入的信息有误!"<<endl;}if(player==cloth||player==hammer||player==s cissors)if(machine==player){cout<<"平局"<<endl;tie++;gameshow(win,lose,tie);}else if(win_lose(player,machine)==win){cout<<"电脑获胜"<<endl;win++;gameshow(win,lose,tie);}elseif(win_lose(player,machine)==lose){cout<<"玩家获胜"<<endl;lose++;gameshow(win,lose,tie);}}cout<<"退出游戏"<<endl;cout<<"bye"<<endl;}/*定义Game类函数.cpp #include<iostream.h> #include"head.h"int main(){ Game g;g.solution(); return 0;}4.测试1、游戏规则及说明截图:图1、游戏规则及说明2、游戏运行及统计结果截图图 2、游戏运行及统计结果3、游戏帮助截图:图3、游戏帮助5.总结本设计在编程过程中使用到:①在头文件head.h中使用到条件预处理命令;②创建类对函数的整体定义,以及类的封装性;③用到了“srand((unsigned)time(NULL))”表示随机函数。