码迷,mamicode.com
首页 > 编程语言 > 详细

C语言实现小游戏

时间:2016-06-08 14:13:41      阅读:311      评论:0      收藏:0      [点我收藏+]

标签:

这个C游戏程序是我的一个同学让我帮他朋友写的,因为一直催我,昨天下午叫我帮的忙,让我赶紧帮他朋友写完。所以昨晚花了几个小时帮他写的。大晚上的,睡意融融,也是难为我了!

C语言嘛!控制台程序,外观简陋。见笑见笑! 感觉对于学习C语言程序设计的朋友们非常有好处,所以我拿出来了。程序也是相当简单的,但是代码却不短。C语言该牵涉到的基本知识点也差不多全了。个人感觉思路清晰,代码可读性好! 有点自夸了,不过实践出真知!大家可以复制代码直接运行!最后面放上了源代码和可执行程序供大家下载!另外附上另外一篇文章供大家学习! C指针完全解读http://blog.csdn.net/qq_21004057/article/details/51514344

程序要求是这样的:


要求:(1) 提供如图所示的菜单选项,接收用户的输入选项。  (2) 游戏提供加法、减法、乘法、除法、设置和退出功能。其中设置分设置题量大小和设置每道题答题机会。每套题默认的题量为5道,每题默认答题次数为3次,若3次均未答对,则由系统给出正确答案。(3) 四种运算中的运算数均要求由计算机随机产生,数的范围在1~100。减法中的被减数大于减数,除法要求被除数能整除除数。(4) 为增加趣味性,当学生答对一题时,系统随机给出一些表扬的赞语。当学生答错时,系统输出“再试一次!”,让学生重新答题。( 本题主要考察函数的编写及应用。)

他们老师给他们的效果图是这样的,如下:

技术分享

给我发了这张图,还有上面的要求。思考了一会,然后着手写代码了! 这程序要求坑也是有的,可以说老师很坑的啊!但是出题的逻辑可以看出老师设坑的实力和经验丰富。

  • 坑一:光标定位,本人已经无力吐槽了
  • 坑二:随机数坑,撒种子方式不对,只能撒一次
  • 坑三:退出。由于没想到直接退出控制台的方法,所以换了种思路,数据置原始状态
把这三个坑跳过了,一切顺利。下面是我写的效果图。我就不一个一个玩了。

技术分享

代码我写的详细的注释!有兴趣的可以下载运行玩玩!玩几篇就可以了,毕竟小学生游戏。
也有400多行! 应该还可以把些封装成函数,但是嫌麻烦,所以直接复制了几处。下面上代码!
/************************************************************************/
/* @author mero															*/
/* @data 2016.6.8														*/
/* @version 1.0				                                            */
/************************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <windows.h>
//结构体config用来配置机会次数,题量大小
struct config{
	int chance;//用来存储每道题目机会次数
	int topicNum;//用来存储题目数量
}cfg[4],*p;
/*结构体award用于保存奖励语*/
struct award{
	char good[30];
	char well[20];
	char cheers[20];
	char nice[20];
	char fine[20];
}award1;
int main(void){
/*------------------------函数声明部分-------------------------*/

	int getRandom(int,int);//得到随机数函数
	int add(int,int);      //加法函数
	int mul(int,int);      //乘法函数
	void goto_xy(int,int); //定位光标到指定坐标

/*------------------------业务逻辑区---------------------------*/
	printf("\n\t\t\t\t 小学生算术游戏v1.0\n");
	printf("\n\t\t\t\t*********************\n\n");
	printf("\t\t\t\t\t[1]加法\n");
	printf("\t\t\t\t\t[2]减法\n");
	printf("\t\t\t\t\t[3]乘法\n");
	printf("\t\t\t\t\t[4]除法\n");
	printf("\t\t\t\t\t[5]设置题量大小\n");
	printf("\t\t\t\t\t[6]设置答题机会\n");
	printf("\t\t\t\t\t[0]退出\n");
	printf("\n\t\t\t\t*********************\n\n");
	//初始配置数据
	struct config cfg[4]={{3,5},{3,5},{3,5},{3,5}};
	p=cfg;
	struct award award1={"恭喜你,奖励一根棒棒糖","非常棒,太聪明啦","不错哦!加油","干得漂亮","运气真好"};
	int selector;
	for (;;)
	{
		printf("\t\t\t\t请输入选项[ ]\n");
		HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
		COORD coordScreen = {0, 0}; //光标位置
		CONSOLE_SCREEN_BUFFER_INFO csbi;
		GetConsoleScreenBufferInfo(hConsole, &csbi);
		//printf("光标坐标:(%d,%d)\n",  csbi.dwCursorPosition.X, csbi.dwCursorPosition.Y);
		goto_xy(43,csbi.dwCursorPosition.Y-1);
		scanf("%d",&selector);
		if (selector>=0&&selector<7)
		{
			switch(selector){
			case 0:
				printf("\t\t-----------正在退出游戏中-----------\n");
				printf("\t\t************************************\n");
				printf("\t\t\t\t------正在恢复原始状态--------\n");
				printf("\t\t\t\t------------请稍后------------\n");
				int j;
				for(j=0;j<4;j++){
					p->chance=3;
					p->topicNum=5;
				}
				printf("\t\t\t\t------------已恢复------------\n");
				printf("\t\t--------游戏已退出,重新开始--------\n");
				printf("\t\t************************************\n");
				break;
			case 1:
				printf("\t\t\t\t欢迎进入加法游戏中\n");
				int i;
				int result;
				for(i=0;i<p->topicNum;i++){
					srand(time(NULL)); 
					int a = getRandom(1,100);
					int b = getRandom(1,100);
					//产生结果
					int addResult=add(a,b);
					printf("\t\t\t\t当前正在做第%d题,请输入 \n",i+1);
					printf("\t\t\t\t%d+%d=",a,b);
					scanf("%d",&result);
					printf("\t\t\t------当前输入的数为%d-------\n",result);
					if(result==addResult){
						printf("\t\t\t恭喜你做对了,正在加载下一题\n");
						int hah=getRandom(1,5);
						switch(hah){
						case 1:
							printf("\t\t\t\t%s\n",award1.good);
							break;
						case 2:
							printf("\t\t\t\t%s\n",award1.well);
							break;
						case 3:
							printf("\t\t\t\t%s\n",award1.nice);
							break;
						case 4:
							printf("\t\t\t\t%s\n",award1.cheers);
							break;
						case 5:
							printf("\t\t\t\t%s\n",award1.fine);
							break;
								}
					}else{
						printf("\t\t\t“再试一次!”\n");
						int j;
						for (j=0;j<p->chance-1;j++)
						{
							printf("\t\t\t\t请输入 ");
							scanf("%d",&result);
							printf("\t\t\t------当前输入的数为%d-------\n",result);
							if (result==addResult)
							{
								printf("\t\t\t恭喜你做对了,正在加载下一题\n");
								int hah=getRandom(1,5);
								switch(hah){
								case 1:
									printf("\t\t\t\t%s\n",award1.good);
									break;
								case 2:
									printf("\t\t\t\t%s\n",award1.well);
									break;
								case 3:
									printf("\t\t\t\t%s\n",award1.nice);
									break;
								case 4:
									printf("\t\t\t\t%s\n",award1.cheers);
									break;
								case 5:
									printf("\t\t\t\t%s\n",award1.fine);
									break;
								}
								break;
							} else{
								printf("\t\t\t“再试一次!”\n");
							}
						}
						printf("\t\t\t\t第%d题正确答案是%d\n",i+1,addResult);
					}
				}
				break;
			case 2:
				printf("\t\t\t\t欢迎进入减法游戏中\n");
				int g;
				int result1;
				for(g=0;g<(p+1)->topicNum;g++){
					int a,b;
					for(;;){
						srand(time(NULL)); 
						a=getRandom(1,100);
						b=getRandom(1,100);
						if(a>b){
							break;
						}
					}
					//产生结果
					int subResult=a-b;
					printf("\t\t\t\t当前正在做第%d题,请输入 \n",g+1);
					printf("\t\t\t\t%d-%d=",a,b);
					scanf("%d",&result1);
					printf("\t\t\t------当前输入的数为%d-------\n",result1);
					if(result1==subResult){
						printf("\t\t\t恭喜你做对了,正在加载下一题\n");
						int hah=getRandom(1,5);
						switch(hah){
						case 1:
							printf("\t\t\t\t%s\n",award1.good);
							break;
						case 2:
							printf("\t\t\t\t%s\n",award1.well);
							break;
						case 3:
							printf("\t\t\t\t%s\n",award1.nice);
							break;
						case 4:
							printf("\t\t\t\t%s\n",award1.cheers);
							break;
						case 5:
							printf("\t\t\t\t%s\n",award1.fine);
							break;
							}
					}else{
						printf("\t\t\t“再试一次!”\n");
						int v;
						for (v=0;v<(p+1)->chance-1;v++)
						{
							printf("\t\t\t\t请输入 ");
							scanf("%d",&result1);
							printf("\t\t\t------当前输入的数为%d-------\n",result1);
							if (result1==subResult)
							{
								printf("\t\t\t恭喜你做对了,正在加载下一题\n");
								int hah=getRandom(1,5);
								switch(hah){
								case 1:
									printf("\t\t\t\t%s\n",award1.good);
									break;
								case 2:
									printf("\t\t\t\t%s\n",award1.well);
									break;
								case 3:
									printf("\t\t\t\t%s\n",award1.nice);
									break;
								case 4:
									printf("\t\t\t\t%s\n",award1.cheers);
									break;
								case 5:
									printf("\t\t\t\t%s\n",award1.fine);
									break;
								}
								break;
							} else{
								printf("\t\t\t“再试一次!”\n");
							}
						}
						printf("\t\t\t\t第%d题正确答案是%d\n",g+1,subResult);
					}
				}
				break;
			case 3:
				printf("\t\t\t\t欢迎进入乘法游戏中\n");
				int m;
				int result2;
				for(m=0;m<(p+2)->topicNum;m++){
					srand(time(NULL)); 
					int a = getRandom(1,100);
					int b = getRandom(1,100);
					//产生结果
					int mulResult=mul(a,b);
					printf("\t\t\t\t当前正在做第%d题,请输入 \n",m+1);
					printf("\t\t\t\t%d*%d=",a,b);
					scanf("%d",&result2);
					printf("\t\t\t------当前输入的数为%d-------\n",result2);
					if(result2==mulResult){
						printf("\t\t\t恭喜你做对了,正在加载下一题\n");
						int hah=getRandom(1,5);
						switch(hah){
						case 1:
							printf("\t\t\t\t%s\n",award1.good);
							break;
						case 2:
							printf("\t\t\t\t%s\n",award1.well);
							break;
						case 3:
							printf("\t\t\t\t%s\n",award1.nice);
							break;
						case 4:
							printf("\t\t\t\t%s\n",award1.cheers);
							break;
						case 5:
							printf("\t\t\t\t%s\n",award1.fine);
							break;
								}
					}else{
						printf("\t\t\t“再试一次!”\n");
						int n;
						for (n=0;n<(p+2)->chance-1;n++)
						{
							printf("\t\t\t\t请输入 ");
							scanf("%d",&result2);
							printf("\t\t\t------当前输入的数为%d-------\n",result2);
							if (result2==mulResult)
							{
								printf("\t\t\t恭喜你做对了,正在加载下一题\n");
								int hah=getRandom(1,5);
								switch(hah){
								case 1:
									printf("\t\t\t\t%s\n",award1.good);
									break;
								case 2:
									printf("\t\t\t\t%s\n",award1.well);
									break;
								case 3:
									printf("\t\t\t\t%s\n",award1.nice);
									break;
								case 4:
									printf("\t\t\t\t%s\n",award1.cheers);
									break;
								case 5:
									printf("\t\t\t\t%s\n",award1.fine);
									break;
								}
								break;
							} else{
								printf("\t\t\t“再试一次!”\n");
							}
						}
						printf("\t\t\t\t第%d题正确答案是%d\n",m+1,mulResult);
					}
				}
				break;
			case 4:
				printf("\t\t\t\t欢迎进入除法游戏中\n");
				int mm;
				int result3;
				for(mm=0;mm<(p+3)->topicNum;mm++){
					int a,b;
					for(;;){
						srand(time(NULL)); 
						a=getRandom(1,100);
						b=getRandom(1,100);
						if(a%b==0){
							break;
						}
					}
					//产生结果
					int divideResult=a/b;
					printf("\t\t\t\t当前正在做第%d题,请输入 \n",mm+1);
					printf("\t\t\t\t%d/%d=",a,b);
					scanf("%d",&result3);
					printf("\t\t\t------当前输入的数为%d-------\n",result3);
					if(result3==divideResult){
						printf("\t\t\t恭喜你做对了,正在加载下一题\n");
						int hah=getRandom(1,5);
						switch(hah){
						case 1:
							printf("\t\t\t\t%s\n",award1.good);
							break;
						case 2:
							printf("\t\t\t\t%s\n",award1.well);
							break;
						case 3:
							printf("\t\t\t\t%s\n",award1.nice);
							break;
						case 4:
							printf("\t\t\t\t%s\n",award1.cheers);
							break;
						case 5:
							printf("\t\t\t\t%s\n",award1.fine);
							break;
								}
					}else{
						printf("\t\t\t“再试一次!”\n");
						int nn;
						for (nn=0;nn<(p+3)->chance-1;nn++)
						{
							printf("\t\t\t\t请输入 ");
							scanf("%d",&result3);
							printf("\t\t\t------当前输入的数为%d-------\n",result3);
							if (result3==divideResult)
							{
								printf("\t\t\t恭喜你做对了,正在加载下一题\n");
								int hah=getRandom(1,5);
								switch(hah){
								case 1:
									printf("\t\t\t\t%s\n",award1.good);
									break;
								case 2:
									printf("\t\t\t\t%s\n",award1.well);
									break;
								case 3:
									printf("\t\t\t\t%s\n",award1.nice);
									break;
								case 4:
									printf("\t\t\t\t%s\n",award1.cheers);
									break;
								case 5:
									printf("\t\t\t\t%s\n",award1.fine);
									break;
								}
								break;
							} else{
								printf("\t\t\t“再试一次!”\n");
							}
						}
						printf("\t\t\t\t第%d题正确答案是%d\n",mm+1,divideResult);
					}
				}
				break;
			case 5:
				printf("\t\t\t\t------请输入题量大小----\n");
				scanf("%d%d%d%d",&cfg[0].topicNum,&cfg[1].topicNum,&cfg[2].topicNum,&cfg[3].topicNum);
				printf("\t\t\t\t你已修改加减乘除题量大小为%d %d %d %d\n",cfg[0].topicNum,cfg[1].topicNum,cfg[2].topicNum,cfg[3].topicNum);
				/*-----------------修改题量大小---------------*/
				break;
			case 6:
				printf("\t\t\t\t请输入要修改的加减乘除游戏机会次数\n");
				scanf("%d%d%d%d",&cfg[0].chance,&cfg[1].chance,&cfg[2].chance,&cfg[3].chance);
				printf("\t\t\t\t你已修改加减乘除题量大小为%d %d %d %d\n",cfg[0].chance,cfg[1].chance,cfg[2].chance,cfg[3].chance);
				/*-----------------修改机会次数---------------*/
				break;
			}
		}else{
			printf("对不起,请输入正确选项\n");
		}		
	}
	return 0;
}
/*-----------------------函数实现部分-------------------------*/

//获取随机数函数
int getRandom(int a,int b){
	int ran;
	ran = rand()%(b-a+1)+a;
	return ran;
}

//加法函数
int add(int a,int b){
	int sum=0;
	sum = a+b;
	return sum;
}
//乘法函数
int mul(int a,int b){
	int mulResult;
	mulResult=a*b;
	return mulResult;
}
void goto_xy(int x,int y){ //定位光标位置到指定坐标
	HANDLE hOut;
	hOut = GetStdHandle(STD_OUTPUT_HANDLE);
	COORD pos={x,y};
	SetConsoleCursorPosition(hOut,pos);
}

程序员的思维,呵呵!代码很简明。也没写成头文件形式,全部放在一个文件中,方便。

顺便放上程序下载链接,适合C语言学习者!


支持我的朋友请粉个!嘿嘿。谢谢啦!

C语言实现小游戏

标签:

原文地址:http://blog.csdn.net/qq_21004057/article/details/51612293

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!