【嵌入式学习记录_C语言项目】四则运算小游戏项目

前  言

        这是我在嵌入式学习的第一阶段——C语言基础的学习过程中完成的一个项目,如果对您有帮助的话,可以点赞,收藏,关注哦,有其他问题可以私聊交流。

        项目还有需要改进优化的地方,也可以添加其他有趣的功能,期待各位大佬的指点和交流。

目  录

前  言

一、项目简介

二、功能介绍

1.可以选择加减乘除四则运算之一练习

2.可以退出程序

 3.回答正确积分,回答错误扣分,并在回答后显示当前积分

4.连续练习

三、技术实现

1.界面设计

2.代码设计

2.1设计思路

2.2预处理头文件

2.3搭建主函数框架

2.4四则运算界面函数

2.5按键选择和识别函数

2.6运算规则函数

2.7获取随机数函数

2.8函数声明

3.遇到的问题及解决方案

四、整体代码

五、总结      


一、项目简介

项目名:四则运算小游戏

功    能:1.可以选择加减乘除四则运算之一 练习

                2.可以退出程序

                3.回答正确积分,回答错误扣分,并在回答后显示当前积分

                4.连续练习

介    绍:这个项目的主要作用是为用户提供一个用来练习100以内的四则运算的工具,同时也作为一个C语言学习阶段前期的实践项目。它支持用户通过选择四则运算法则来进行相对应的练习。

二、功能介绍

1.可以选择加减乘除四则运算之一练习

        进入程序后,可以根据界面通过输入 ‘ + ’(加号)选择加法, ‘ - ’(减号)选择减法, ‘ * ’(星号)选择乘法,‘ / ’(反斜杠)选择除法

2.可以退出程序

         进入程序后,可以根据界面通过‘ 0 ’(零)选择退出程序

3.回答正确积分,回答错误扣分,并在回答后显示当前积分

        在回答后,程序会判断答案的正确与否,正确则加10分,错误则减10分,同时打印出当前积分值

4.连续练习

        在回答完成后,提示用户输入按键,输入按键‘ y ’或者' Y '则继续练习,输入其他按键则退出程序

三、技术实现

1.界面设计

        运行界面包含了题号,选择,题目,答案,回答正确与否,积分,按键提示

2.代码设计

2.1设计思路

①四则运算界面函数:页面设计需要显示题号,以及提示用户输入键值

②按键选择和识别函数:因为有按键输入,所以需要识别按键值

③获取随机数函数:用时间做种子,使每次产生的随机数不同

④运算规则函数:输入键值后需要进行相对应的运算

⑤判断:根据用户输入答案的正确与否,并显示在界面上

⑥积分:根据用户输入答案的正确与否进行积分加减,并显示在界面上

⑦询问是否继续

2.2预处理头文件
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <time.h>
2.3搭建主函数框架

运算规则函数这里我通过在按键选择和识别函数去调用

int main(void)
{
	while(1)
	{
	show();			//界面
	key_scan();		//按键选择和识别

	}

	return 0;
}
2.4四则运算界面函数
void show(void)
{
	static int cont = 0;
	cont++;
	system("cls");   //清屏
	printf("**********************************************\n");
	printf("*                                            *\n");
	printf("*            欢迎来到四则运算小游戏          *\n");
	printf("*                   第%d题                    *\n",cont);
	printf("**********************************************\n");
	printf("**【+】    【-】    【*】    【/】    【0】 **\n");
	printf("**********************************************\n");
	printf("请选择:");
}

tips: ①system("cls");  是库函数<stdlib.h>中的清屏函数,它的作用就是清除控制台窗口的内容。

          ②static                当 static 用于一个函数内部的局部变量时,这个变量的生命周期会被延长至整个程序的执行期间,而不是只在定义它的函数执行期间。同时,这个变量只会被初始化一次,即使包含它的函数被多次调用。

2.5按键选择和识别函数
void key_scan(void)
{
	char key;
STAR:
	key = getch();	
	switch(key)
	{
		case '+':printf("您选择的是加法运算!\n");Rules_Operation(key);break;
		case '-':printf("您选择的是减法运算!\n");Rules_Operation(key);break;
		case '*':printf("您选择的是乘法运算!\n");Rules_Operation(key);break;
		case '/':printf("您选择的是除法运算!\n");Rules_Operation(key);break;
		case '0':printf("正在退出程序!\n");exit(1);break;
		default:printf("输入有误,请重新输入!\n");goto STAR;break;
	}
}

tips: ①getch();        getch();的特点是它立即返回用户输入的字符,不需要用户按下回车键。

          ②exit(1);         exit(1);用于退出程序

          ③goto STAR   跳转到标签STAR的地方继续执行代码

2.6运算规则函数
void Rules_Operation(char ru)
{
	int data1,data2;
	int user_data,sys_data;
	char k;
	static int score = 0;
	static int n = 1;
	//产生两个随机数
STAR:
	data1 = get_randata();
	data2 = get_randata();
	if(ru=='/')
	{
		if(data2 == 0 || data1%data2!=0)
		{
			goto STAR;
		}
	}
	//显示两个随机数,并提醒用户输入答案
	printf("请计算:%d %c %d\n",data1,ru,data2);
	printf("请输入您的答案:");
	//scanf输入答案
	scanf("%d",&user_data);
	//根据用户输入 的运算符计算答案,并与用户输入的答案进行比较
	if(ru=='+')
	{
		sys_data = data1 + data2;
	}
	else if(ru=='-')
	{
		sys_data = data1 - data2;
	}
	else if(ru=='*')
	{
		sys_data = data1 * data2;
	}
	else if(ru=='/')
	{
		sys_data = data1 / data2;
	}
	printf("正确答案是:%d\n",sys_data);
	//显示用户输入的答案的正确与否
	if(user_data==sys_data)
	{
		printf("恭喜你,回答正确\n");
		score+=10;
		printf("(第%d题)目前总得分:%d\n",n,score);
	}
	else
	{
		printf("很遗憾,回答错误\n");
		score-=10;
		printf("(第%d题)目前总得分:%d\n",n,score);
	}
	n++;
	//询问是否继续
	printf("是否继续,继续请按【y】或【Y】,退出请按【任意键】\n");
	k = getch();
	if(k!='y' && k!='Y')
	{
		//退出程序
		exit(1);
	}
}

tips:这里将2.1设计思路中④到⑦的内容都封装到了一个函数中

2.7获取随机数函数
int get_randata(void)
{
	int number;
	static int flag = 1;//保留之前的赋值,只用一个时间节点
	if(flag==1)
	{
	srand((unsigned) time(NULL)); //用时间做种子,每次产生随机数不一样
	flag = 0;
	}
	number = rand() % 100;
	return number;
}

tips:①因为做的是100以内的四则运算,所以   %100

2.8函数声明
//函数声明
void show(void);
void key_scan(void);
void Rules_Operation(char ru);
int get_randata(void);

tips:放在预处理(2.1)下面

3.遇到的问题及解决方案

3.1

问        题:获取随机数每次出来都是同一个数

解决方案:通过锁标志位思想,用同一个时间起始节点

3.2

问        题:除法运算中,产生的随机数不一定可以整除,这就导致答案不一定正确

解决方案:增加判断语句,只有产生的两个随机数能够整除,程序才继续执行下去

四、整体代码

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <time.h>

//函数声明
void show(void);
void key_scan(void);
void Rules_Operation(char ru);
int get_randata(void);



int main(void)
{
	while(1)
	{
	show();			//界面
	key_scan();		//按键选择和识别

	}

	return 0;
}

/*********************************************************
*函数名    :show
*函数功能  :四则运算界面函数
*函数参数  :无
*函数返回值:无
*函数描述  :【0】 退出功能
*程序版本  :v1.0
*********************************************************/
void show(void)
{
	static int cont = 0;
	cont++;
	system("cls");   //清屏
	printf("**********************************************\n");
	printf("*                                            *\n");
	printf("*            欢迎来到四则运算小游戏          *\n");
	printf("*                   第%d题                    *\n",cont);
	printf("**********************************************\n");
	printf("**【+】    【-】    【*】    【/】    【0】 **\n");
	printf("**********************************************\n");
	printf("请选择:");
}


/*********************************************************
*函数名    :key_scan
*函数功能  :按键选择和识别函数
*函数参数  :无
*函数返回值:无
*函数描述  :
*程序版本  :v1.0
*********************************************************/
void key_scan(void)
{
	char key;
STAR:
	key = getch();	
	switch(key)
	{
		case '+':printf("您选择的是加法运算!\n");Rules_Operation(key);break;
		case '-':printf("您选择的是减法运算!\n");Rules_Operation(key);break;
		case '*':printf("您选择的是乘法运算!\n");Rules_Operation(key);break;
		case '/':printf("您选择的是除法运算!\n");Rules_Operation(key);break;
		case '0':printf("正在退出程序!\n");exit(1);break;
		default:printf("输入有误,请重新输入!\n");goto STAR;break;
	}
}

/*********************************************************
*函数名    :Rules_Operation
*函数功能  :运算规则函数
*函数参数  :char ru
*函数返回值:无
*函数描述  :通过传入 + - *  / 运算符  决定运算规则
*程序版本  :v1.0
*********************************************************/

void Rules_Operation(char ru)
{
	int data1,data2;
	int user_data,sys_data;
	char k;
	static int score = 0;
	static int n = 1;
	//产生两个随机数
STAR:
	data1 = get_randata();
	data2 = get_randata();
	if(ru=='/')
	{
		if(data2 == 0 || data1%data2!=0)
		{
			goto STAR;
		}
	}
	//显示两个随机数,并提醒用户输入答案
	printf("请计算:%d %c %d\n",data1,ru,data2);
	printf("请输入您的答案:");
	//scanf输入答案
	scanf("%d",&user_data);
	//根据用户输入 的运算符计算答案,并与用户输入的答案进行比较
	if(ru=='+')
	{
		sys_data = data1 + data2;
	}
	else if(ru=='-')
	{
		sys_data = data1 - data2;
	}
	else if(ru=='*')
	{
		sys_data = data1 * data2;
	}
	else if(ru=='/')
	{
		sys_data = data1 / data2;
	}
	printf("正确答案是:%d\n",sys_data);
	//显示用户输入的答案的正确与否
	if(user_data==sys_data)
	{
		printf("恭喜你,回答正确\n");
		score+=10;
		printf("(第%d题)目前总得分:%d\n",n,score);
	}
	else
	{
		printf("很遗憾,回答错误\n");
		score-=10;
		printf("(第%d题)目前总得分:%d\n",n,score);
	}
	n++;
	//询问是否继续
	printf("是否继续,继续请按【y】或【Y】,退出请按【任意键】\n");
	k = getch();
	if(k!='y' && k!='Y')
	{
		//退出程序
		exit(1);
	}
}

/*********************************************************
*函数名    :get_randata
*函数功能  :获取随机数函数
*函数参数  :无
*函数返回值:int 
*函数描述  :产生100以内的随机数
*程序版本  :v1.0
*********************************************************/
int get_randata(void)
{
	int number;
	static int flag = 1;//保留之前的赋值,只用一个时间节点
	if(flag==1)
	{
	srand((unsigned) time(NULL)); //用时间做种子,每次产生随机数不一样
	flag = 0;
	}
	number = rand() % 100;
	return number;
}

五、总结      

        这个四则运算小游戏项目是在他人带领下完成的,只是作为一个练手的实践项目,这里面用到了C语言基础中的基本数据类型,printf函数的使用,scanf函数的使用,运算符,结构化编程,函数。这并不是一个已经完全完善了的代码,需要补足的地方还有很多,如可以将四则法则打乱练习,也可以通过代码写入其他功能,你也可以根据自己需要写入合适的功能。

         你们的支持和反馈对我来说非常重要。如果你有任何问题或建议,请通过私聊随时与我联系。别忘了点赞,收藏,关注哦!

  • 14
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值