题目可以分为三部分,根据自己的想法又增添了增加了主页面,设有开始游戏、退出游戏和游戏规则供用户选择。
void menu(); //主菜单函数 void quit(); //退出函数 void rule(); //规则函数1、第一部分
- 创建一个谜语类 Riddle,包含谜面,谜底,谜底所属类别这三个公有数据成员。由于字符串数组处理过于复杂,这里使用了在 C++ 中可以表示字符串数据类型的 string 定义谜面、谜底和谜底所属类别。
class Riddle{
public:
string type; //谜底所属类别
string poser; //谜面
string key; //谜底
string tip1; //一级提示
string tip2; //二级提示
Riddle(string a,string b,string c,string d):poser(a),key(b),tip1(c),tip2(d){}
};
- 使用外部文件存储相关的信息。在外部建立了以 ANSI 编码的文本文档储存相关数据。为了方便打开外部文件时使用的是相对地址,而非绝对地址,这样程序或文档每次移动位置后就不需再修改地址。
- 创建一个猜谜语游戏类Game,功能为随机产生谜面内容。要想随机产生谜面内容,首先要使用随机数发生器的初始化函数 srand() 函数给谜面设置一个随机数,为了之后得到的随机数不一样,在这里又使用 time(0) 与之结合,因为无法准确地确定题库里的题数,所以定义了一个整型变量 n 来表示,通过循环可算出,接着 rand() 函数随机产生的谜面内容。
class Game{
public:
int star();
private:
string str1; //str1谜面
string str2; //str2谜底
string str3; //str3一级提示
string str4; //str4二级提示
};
int Game::star(){
srand(time(0)); //给谜面设置随机数
int n=0; //n存储谜语的个数
ifstream fin;
fin.open("猜谜语.txt"); //打开外部文件 (相对地址)
if(!fin){
cout<<"文件打开失败!";
return 0;
}
while(fin){ //成功打开外部文件
getline(fin,str1);
n++; //获得谜语个数
}
fin.close(); //关闭外部文件
while(1){
fin.open("猜谜语.txt");
int num=rand()%n; //随机产生谜面内容
for(int i=0;i'); //读入谜面
getline(fin,str2,'-'); //读入谜底
getline(fin,str3,'~'); //读入一级提示
getline(fin,str4); //读入二级提示
Riddle g(str1,str2,str3,str4); //根据读入的数据生成对象
3、第三部分
- 在类 Game 里增加判断答案功能。使用了一个大 while 循环产生题目,一般用 if 语句判断答案正误,但考虑到只有回答正确才会进入下一题,而回答错误就需要再次答题,并且有可能是无限次的答题,于是使用了小 while 循环去判断答案正误,若正确则跳出此次循环进入下一次大循环(下一题)。若错误则在小循环内多次循环答题,整型变量 j 记录答题次数。
- 题目要求在类 Game 里增加多级提示功能。于是设置多个 if 语句判断答题次数,根据用户答题次数进入对应的 if 语句。用户答错超过3次就有2次提示,第4次答题时给第1个提示,第5次答题时给第2个提示,从第6次答题开始不再有提示,但用户可选择出谜底进入下一题。
while(1){ //大循环产生题目
int j=0; //整型变量j记录答题次数
cout<>str2;j++;
while(str2!=g.key){ //小循环判断回答是否正确
if(j<3){
cout<<"哎呀!猜错了!(⊙﹏⊙)n请继续输入答案:";
cin>>str2;j++;
}else if(j==3){ //多级提示之一级提示
cout<<" ∧_∧"<>str2;j++;
}else if(j==4){ //多级提示之二级提示
cout<>str2;j++;
}else if(j>4){
cout<>e;
while(e!='0'&&e!='1'){ //如果是整型输入字母就会进入死循环
fflush(stdin); //清空输入缓冲区
cout<<"你输入的不是1或0,请重新输入!"<>e;
}
if(e=='0'){
fflush(stdin); //清空输入缓冲区
cout<>str2;j++;
}
if(e=='1'){
fflush(stdin); //清空输入缓冲区
cout<<"谜底是:"<
4、第四部分
- 主菜单页面
int main()
{
menu(); //显示主页面
return 0;
}
void menu() //主页面
{
cout<>f;
while(f!='1'&&f!='2'&&f!='3'){ //如果是整型,输入字母就会进入死循环
fflush(stdin); //清空输入缓冲区
cout<<"输入的不是1、2或3,请重新输入!"<>f;
}
if(f=='1'){
fflush(stdin); //清空输入缓冲区
system("cls"); //清屏
p.star(); //调用star(),开始游戏
}else if(f=='2'){
fflush(stdin); //清空输入缓冲区
system("cls"); //清屏
quit(); //调用quit(),显示退出页面
}else if(f=='3'){
fflush(stdin); //清空输入缓冲区
system("cls"); //清屏
rule(); //调用rule(),显示规则页面
}
}
- 退出游戏页面
void quit() //退出页面
{
cout<>h;
while(h!='8'&&h!='6'){ //如果是整型,输入字母就会进入死循环
fflush(stdin); //清空输入缓冲区
cout<<"输入的不是8或6,请重新输入!"<>h;
}
if(h=='8'){
exit(0); //退出游戏
}else if(h=='6'){
fflush(stdin); //清空输入缓冲区
system("cls"); //清屏
menu();
} //返回主页面
}
- 游戏规则页面
void rule() //规则页面
{
cout<>k;
while(k!='6'){ //如果是整型,输入字母就会进入死循环
fflush(stdin); //清空输入缓冲区
cout<<"输入的不是6,请重新输入!"<>k;
}
if(k=='6'){
fflush(stdin); //清空输入缓冲区
system("cls"); //清屏
menu(); //返回主页面
}
}
四、 结果展示
源码 + 报告下载:https://download.csdn.net/download/weixin_48968649/85740425



