C++入门编程之成语接龙

2021/5/1 14:25:22

本文主要是介绍C++入门编程之成语接龙,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

成语接龙问题

问题描述:

题目描述:成语接龙是中华民族传统的文字游戏。它有着悠久的历史,也有广泛的社会基础,是老少皆宜的民间文化娱乐活动。请设计四字成语接龙游戏。
功能需求:
(1) 计一个四字成语类Idiom,包含成语内容,首字母的拼音,末尾字母 的拼音。
(2) 设计一个成语接龙游戏类Game,系统可以判断用户的回答是否是成语,并且可以按照前一个成语,判断是否接龙成功。如果回答的成语接龙正确,则以新的成语作为新的起点,继续接龙;如果不成功,继续为原有的成语接龙。
(3) 设计提示功能,引导用户接龙成功。
(4) 使用外部文件存储相关数据。

开发环境:

Dev C++

解题思路:

  1. 使用外部文件储存,创建一个.txt文件来储存成语,组成成语数据库,用fstream类导入成语库。
  2. 分别用两个ifstream,声明出两个变量,分别储存成语与拼音,放在Idiom类里。
  3. 再定义出一个Game类,声明出6个函数。
     matchIfidiom函数,用来匹配是否为成语。
     matchIfcatch函数,用来检测是否接龙。
     matchIfexist函数,用来检测是否在游戏里存在出现过的成语。
     pointOut函数,用来做提示功能。
     printOut函数,用来输出结果。
     gameStart函数,用来启动游戏。
     String exist成语,用来储存出现过的成语
  4. 在gameStart函数里,根据玩家输入1或2来决定是否退出或者提示。 这个项目中最关键的一点就是,第一次输入的成语必须是一个四字成语,否则直接退出。于是,提示功能只能在第二轮输入开始才能使用。在每次输入成语后,printOut函数都会检测是否为四字成语,是否存在出现的成语(当第二次输入时)。当用户需要提示时,输入“2”,printOut函数将输进来的idiom又赋值为上一个成语(因为“2”不是成语,这也是需要第二次输入才能使用提示功能的原因)。gameStart函数里声明出一个变量idiom,用来给用户输入成语,然后传入printOut函数输入结果。由于需要判断是否接龙,于是在函数里面加入判断语句if(),把idiom放入matchIfcatch函数里,如果不接龙,则实现if语句里面的内容。

程序设计:

void Game::gameStart()//开始游戏 
{
	string idiom;//玩家成语 
	string lastidiom;//储存上一次的成语(从第二个成语开始)
	int tag1=0;//标记从第二个开始 

	cout<<"***********功能面板***********"<<endl
		<<"*                            *"<<endl
	    <<"* 途中若想退出游戏输入——1  *"<<endl
	    <<"* 若想要提示输入      ——2  *"<<endl	
		<<"*                            *"<<endl
		<<"******************************"<<endl;
	cout<<"游戏开始,请输入一个四字成语。"<<endl;
		
	do{
		cin>>idiom;//用户输入成语 
		tag1++;//标记--从第二个成语开始储存 
			
		if(idiom.compare("1")==0) //退出游戏 
		{
			break;
		} 
		
		if(idiom.compare("2")==0)//提示功能 
		{
			idiom=lastidiom;
			string end_in=idiom.substr(6,8);//截取最后的字符 
			
			idiom=pointOut(end_in); 
			
			if(idiom.compare("Endgame")!=0 )
				cout<<idiom<<endl;	
			else
				{
					cout<<"接龙完毕。";
					break;
				}
				
		}
		
		
		printOut(idiom);
		
		
			if(tag1>=2&&!matchIfcatch(lastidiom,idiom))
			{
				idiom=lastidiom;//若接龙失败,则为原来的成语接龙 
				cout<<"接龙失败,以上一个的成语继续"<<endl; 
			}
			
		 exist.append(idiom);
		 
		if(tag2)
		lastidiom=idiom;
	}while(1);
}

void Game::printOut(string idiom)//输出是否为四字成语 
{
	int tag=0; 
	ifstream eachIdiom;
	string eachidiom;    //每行的单个成语 
	string idiom1;       //缓存的整行成语 
	eachIdiom.open("1.txt");
	while(getline(eachIdiom,idiom1)) 
	{
		eachidiom=idiom1.substr(0,8); 
		if(matchIfidiom(idiom,eachidiom)&&!matchIfexist(idiom))          //matchIfidiom()检查是否为四字成语。matchIfexist()检查是否重复。 
			{
				cout<<"==>";
				tag=1;
				tag2=1;
				break;
			}
				continue;
	}
				
			if(tag!=1)
			{
				cout<<"非成语或出现重复,请重新输入。"<<endl; 
				tag2=0;
			}
				
	
			eachIdiom.close();
} 
   
string Game::pointOut(string end_in)      //提示功能
{
	ifstream eachIdiom1;
	string idiom1;
	string eachidiom;           //暂存读取到的四字成语 
	string eachidiom_first;     //存取当前成语的第一个字 
	int tag=0;                  //通过tag的值判断是否成功找到满足条件的成语。 
	string Pidiom;             //返回的提示成语 
	eachIdiom1.open("1.txt");
	while(getline(eachIdiom1,idiom1)) 
	{
		eachidiom=idiom1.substr(0,8); 
		eachidiom_first=eachidiom.substr(0,2);//首字 
		if(end_in.compare(eachidiom_first)==0)   //如果 end_in == eachidiom_first则为0 
		{
			Pidiom=eachidiom;         
			if(matchIfexist(Pidiom))              //判断该成语前是否出现 如果之前出现则直接重新执行while语句 
				continue;
			tag=1;
			break;
		}
 		
	}
		eachIdiom1.close();
		if(tag==1)
			return Pidiom;             // 此时 Pidiom为满足所有条件的的成语。 
		return "Endgame";               //没有找到成语只能结束游戏 
}

int main()
{
	Game a;
	a.gameStart();		
	system("pause");
	return 0;
}

运行结果:

在这里插入图片描述



这篇关于C++入门编程之成语接龙的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程