C++课程设计——猜谜语小游戏

一、问题描述

二、项目流程图 

三、解题思路与源码 

        题目可以分为三部分,根据自己的想法又增添了增加了主页面,设有开始游戏、退出游戏和游戏规则供用户选择。

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值