石头、剪刀、布游戏
/*石头、剪刀、布是孩子们中很流行的一个游戏。在这个游戏中,孩子们用手表示石头、剪刀、布。伸手表示布、拳头表示石头、伸出两根手指表示剪刀。孩子们面对面地数到3,然后亮出各自的选择。如果选择是一样的,表示平局,否则就用如下规则决定胜负。
布覆盖石头
石头砸剪刀
剪刀剪碎布
现在我们把这个过程变成计算机和游戏者之间的游戏。游戏的过程如下:游戏者选择出石头、剪刀或布,计算机也随机选择一个,评判结果,输出结果,继续游戏,知道游戏者选择结束为止。
要解决这个问题,首先进行第一层分解。根据题意,main函数的运行过程如下:
While(用户输入!=退出)
{switch(用户的选择)
case 布,石头,剪刀:
机器选择
评判结果
报告结果
case 显示游戏战况:显示目前的战况;
case 帮助:显示帮助信息;
default:报告错误;
}
显示战况;
从上述过程可以提取出第一层所需要的6个函数:
selection_by_play获取用户输入
selection_by_machine获取机器的选择
compare评判结果
report报告结果
prn_game_status显示目前战况
prn_help显示帮助信息
为了提高程序的可读性,我们定义两个枚举类型:用户合法输入p_s_r和评判结果outcome.
定义如下:
enum p_s_s{paper, rock, scissor, game, help, quit};
enum outcome{ win, lose, tie, error};
模块划分
1.主模块
2.获取选择模块
3.比较模块
4.输出模块
各个模块的源文件:
主模块(main.cpp)包括main函数
获取选择模块(select.cpp)包括selection_by_player和selection_bu_machine两个函数
比较模块(compare.cpp)包括compare函数
输出模块(print.cpp)包括所有和输出的相关函数,有report、prn_game_status和prn_help函数
确定各函数原形:
p_r_s selection_by_player();
p_r_s selection_by_machine();
outcome compare(p_r_s, p_r_s);
void prn_help();
void report(outcome);
void prn_game_status();
包含的库头文件:
#include <iostream>
#include<cstdlib>
#include<ctime>
需要包含的头文件:
为了解决一些类型的定义、符号常量和函数原形的声明在程序中反复出现多次,编译器会认为某些符号被重复定义的问题。需要用到编译预处理命令:
#ifndef 标识符
……
#endif
这个预处理命令表示,如果指定的标识符没有定义过,则执行后面的语句,直到#endif;
如果该标识符已经定义过,则中间的这些语句都不执行。
头文件有以下这样的结构
#ifndef _name_h
#define _name_h
头文件真正需要写的内容
#endif
其中,_name_h是用户选择的代表这个头文件的一个标识。
*/
//代码清单 石头、剪刀、布游戏程序的头文件
//文件:p_r_s.h
//本文件定义了两个枚举类型,声明了本程序包括的所有函数原形
#ifndef p_r_s_h
#define p_r_s_h
#include<iostream>
#include<cstdlib> //RAND_MAX是符号常量定义在cstdlib库内
#include<ctime> //要用到系统时间
using namespace std;
//定义两个枚举类型,提高可读性
enum p_r_s { paper, rock,scissor,game,help,quit};
enum outcome { win,lose,tie,error};
//所有函数的声明
outcome compare(p_r_s player_choice,p_r_s machine_choice);//评判函数声明
void prn_final_status(); //最终战绩
void prn_game_status(); //目前战况
void prn_help(); //回到选择界面
void report(outcome result); //报告结果并记录信息
p_r_s selection_by_machine(void);//获取用户输入
p_r_s selection_by_player(void); //获取机器选择
#endif
//主模块的实现
//main.cpp
#include"p_r_s.h"
int main()
{
outcome result;
p_r_s player_choice,machine_choice;
srand(time(NULL)); //生成随机种子
while((player_choice=selection_by_player())!=quit)
switch(player_choice)
{
case paper: case rock: case scissor:
machine_choice=selection_by_machine();
result=compare(player_choice,machine_choice);
//机器跟玩家的评判结果并输出结果
report(result); break;
case game: prn_game_status(); break; //目前战况
case help: prn_help(); break; //显示帮助信息
default:
cout<<" PROGRAMER ERROR:Cannot get to here!\n\n";
cout<<” 程序错误:不能进入这里!\n\n”;
exit(1);
}
prn_game_status(); //显示目前战况
return 0;
}
//选择模块的实现
//select.cpp
#include"p_r_s.h"
p_r_s selection_by_machine()
{
int select=(rand()*3/(RAND_MAX+1)); //生成随机数0、1、2
cout<<"I am ";
switch(select)
{
case 0: cout<<"paper."; break;
case 1: cout<<"rock. "; break;
case 3: cout<<"scissor."; break;
}
return ((p_r_s)select);//返回计算机随机选择结果,要进行强制转换类型为枚举类型p_r_s
}
p_r_s selection_by_player() //玩家的选择
{
char c;
p_r_s player_choice;
prn_help(); //显示帮助界面
cout<<"please selsect:"; cin>>c; //输入选择的相应的字母代号
switch(c)
{
case 'p': player_choice=paper; cout<<"you are paper."; break; //你是布
case 'r': player_choice=rock; cout<<"you are rock."; break; //你是拳头
case 's': player_choice=scissor; cout<<"you are scissor."; break; //你是剪刀
case 'g': player_choice=game; break; //选择查看当前战况
case 'q': player_choice=quit; break; //退出游戏
default: player_choice=help; break;
}
return player_choice; //返回玩家的选择
}
//比较模块的实现
//compare.cpp
#include"p_r_s.h"
outcome compare(p_r_s player_choice,p_r_s machine_choice)
{
outcome result;
if(player_choice==machine_choice) return tie; //比较结果相同,打平
switch(player_choice)
{
case paper: result=(machine_choice==rock)? win:lose; break; //布包住拳头
case rock: result=(machine_choice==scissor)? win:lose; break;//石头砸剪刀
case scissor: result=(machine_choice==paper)? win:lose; break;//剪刀剪碎布
default: cout<<"PROGRAM ERROR:Unexpected choice!\n\n";
cout<<”程序错误:不是意想中的选择!\n\n”;
exit(1);
}
return result;
}
//输出模块的实现
//print.cpp
#include"p_r_s.h"
int win_cnt=0,lose_cnt=0,tie_cnt=0;
void prn_game_status()
{
cout<<endl;
cout<<"GAME STATUS:" <<endl;
cout<<"win(赢): "<<win_cnt<<endl;
cout<<"lose(输): "<<lose_cnt<<endl;
cout<<"Total(总共):"<<win_cnt+lose_cnt+tie_cnt<<endl;
}
void prn_help()
{
cout<<endl
<<" The following chatacters can be used:\n"
<<”下面的字母可以被使用:\n”
<<" p for paper(布)\n"
<<" r for rock(石头)\n"
<<" s for scissors(剪刀)\n"
<<" g print the game status(输出战况)\n"
<<" h help,print this list(输出菜单)\n"
<<" q quie the game(退出游戏)\n";
}
void report(outcome result)
{
switch(result)
{
case win: ++win_cnt; cout<<" You win(你赢啦). \n"; break;
case lose: ++lose_cnt; cout<<" You lose(很遗憾你输了). \n"; break;
case tie: ++tie_cnt; cout<<"A tie(打平). \n"; break;
default: cout<< “程序错误:意想之外的结果!\n\n”;
<< "PROGRAM ERROR:Unexpected result!\n\n";
exit(1);
}
}
调试结果(截图):