Bootstrap

剪刀、石头、布游戏

                                                   石头、剪刀、布游戏
/*石头、剪刀、布是孩子们中很流行的一个游戏。在这个游戏中,孩子们用手表示石头、剪刀、布。伸手表示布、拳头表示石头、伸出两根手指表示剪刀。孩子们面对面地数到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);
	}
}

调试结果(截图):
 
 
 


;