一、问题描述
二、项目流程图
三、解题思路与源码
题目可以分为三部分,根据自己的想法又增添了增加了主页面,设有开始游戏、退出游戏和游戏规则供用户选择。
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 编码的文本文档储存相关数据。为了方便打开外部文件时使用的是相对地址,而非绝对地址,这样程序或文档每次移动位置后就不需再修改地址。
2、第二部分
- 创建一个猜谜语游戏类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<num;i++){
getline(fin,str1);
}
getline(fin,str1,'>'); //读入谜面
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<<endl<<g.poser<<endl; //显示随机产生的谜面
cout<<"请输入答案:";
cin>>str2;j++;
while(str2!=g.key){ //小循环判断回答是否正确
if(j<3){
cout<<"哎呀!猜错了!(⊙﹏⊙)\n请继续输入答案:";
cin>>str2;j++;
}else if(j==3){ //多级提示之一级提示
cout<<" ∧_∧"<<endl
<<" 跑偏了! (′·∞·)"<<endl
<<endl<<"给你个提示吧:"<<g.tip1<<endl
<<"请继续输入答案:";
cin>>str2;j++;
}else if(j==4){ //多级提示之二级提示
cout<<endl<<"就快要答对了!( ′··)╯(._.`)"<<endl
<<endl<<"再给你个提示吧:"<<g.tip2<<endl
<<"请继续输入答案:";
cin>>str2;j++;
}else if(j>4){
cout<<endl<<" 哎呀!"<<endl //回答错误
<<" 又猜错了! (╯ ' - ')╯( ┻━┻"
<<endl<<" 加油呀! (掀桌子)"<<endl
<<endl<<"是否(1/0)出谜底:";
char e; //定义字符型变量e,而不是整型
cin>>e;
while(e!='0'&&e!='1'){ //如果是整型输入字母就会进入死循环
fflush(stdin); //清空输入缓冲区
cout<<"你输入的不是1或0,请重新输入!"<<endl
<<"是否(1/0)出谜底:";
cin>>e;
}
if(e=='0'){
fflush(stdin); //清空输入缓冲区
cout<<endl<<" ┬—┬ ノ( ' - 'ノ)" <<endl //可无限答题至答出正确答案
<<" (摆好摆好) 请继续输入答案吧:";
cin>>str2;j++;
}
if(e=='1'){
fflush(stdin); //清空输入缓冲区
cout<<"谜底是:"<<g.key<<endl //也可跳过此题
<<"要继续努力呀! *\\(^_^)/*"<<endl
<<endl<<"下一题";
break;
}
}
}
if(str2==g.key){
cout<<" ∧ ∧"<<endl
<<"恭喜你!答对了! (^ω^)"<<endl //回答正确
<<" 你真棒! .( O┬ O"<<endl
<<" 请继续答题吧! .≡.◎-ヽJ┴ ◎"<<endl;
}
break;
}
fin.close(); //关闭外部文件
}
}
4、第四部分
- 主菜单页面
int main()
{
menu(); //显示主页面
return 0;
}
void menu() //主页面
{
cout<<endl;
cout<<" 猜谜语 "<<endl;
cout<<" ------------------------------"<<endl;
cout<<" ︰ 1.开始游戏 ︰"<<endl;
cout<<" ︰ 2.退出游戏 ︰"<<endl;
cout<<" ︰ 3.游戏规则 ︰"<<endl;
cout<<" ------------------------------"<<endl;
cout<<endl;
cout<<"请选择你要进行的操作:";
Game p; //创建对象
char f; //定义字符型变量f,而不是整型
cin>>f;
while(f!='1'&&f!='2'&&f!='3'){ //如果是整型,输入字母就会进入死循环
fflush(stdin); //清空输入缓冲区
cout<<"输入的不是1、2或3,请重新输入!"<<endl
<<"请选择你要进行的操作:";
cin>>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<<endl
<<" _(:з)∠)_ "<<endl
<<" 真的要退出游戏吗?"<<endl
<<" -----------------------------------------"<<endl
<<" ︰ 输入8退出游戏. (ToT)/~~~ ︰"<<endl
<<" ︰ ︰"<<endl
<<" ︰ 输入6返回主页面! ~~~///(^v^)\\\\\\~~~ ︰"<<endl
<<" -----------------------------------------"<<endl
<<"请输入:";
char h; //定义字符型变量h,而不是整型
cin>>h;
while(h!='8'&&h!='6'){ //如果是整型,输入字母就会进入死循环
fflush(stdin); //清空输入缓冲区
cout<<"输入的不是8或6,请重新输入!"<<endl
<<"请输入:";
cin>>h;
}
if(h=='8'){
exit(0); //退出游戏
}else if(h=='6'){
fflush(stdin); //清空输入缓冲区
system("cls"); //清屏
menu();
} //返回主页面
}
- 游戏规则页面
void rule() //规则页面
{
cout<<endl
<<" 欢迎来到猜谜语游戏!"<<endl
<<" -----------------------------------------------------------"<<endl
<<" ︰ 你可无限次答题直至回答正确后进入下一题, ︰"<<endl
<<" ︰ ︰"<<endl
<<" ︰ 答错3次后会有1次提示,第4次答错时会有第2次提示, ︰"<<endl
<<" ︰ ︰"<<endl
<<" ︰ 两次提示完后可选择出谜底,会出现正确答案并进入下一题, ︰"<<endl
<<" ︰ ︰"<<endl
<<" ︰ 也可选择继续答题直至答对后进入下一题但不再有提示。 ︰"<<endl
<<" ︰ ︰"<<endl
<<" ︰ 输入6回到主页面开始游戏吧!祝玩得愉快!(*^_^*) ︰"<<endl
<<" ︰ ︰"<<endl
<<" ︰ ヾ(≧▽≦ 谢谢观看! ≧▽≦)ノ ︰"<<endl
<<" -----------------------------------------------------------"<<endl
<<"请输入:" ;
char k; //定义字符型变量k,而不是整型
cin>>k;
while(k!='6'){ //如果是整型,输入字母就会进入死循环
fflush(stdin); //清空输入缓冲区
cout<<"输入的不是6,请重新输入!"<<endl
<<"请输入:";
cin>>k;
}
if(k=='6'){
fflush(stdin); //清空输入缓冲区
system("cls"); //清屏
menu(); //返回主页面
}
}
四、 结果展示
源码 + 报告下载:https://download.csdn.net/download/weixin_48968649/85740425