C语言——猜数字游戏

目录

猜数字游戏

一、猜数字判定

二、重复猜数字,直到猜中停止

三、随机生成一个目标数字

四、保存输入记录


猜数字游戏

一、猜数字判定

首先,我们需要做一个测试版本,我们事先设置好一个目标数字,然后由玩家输入数字与目标数字进行比较,并且显示比较后的结果。

代码1:

#include<stdio.h>
int main()
{
	int n = 0;    \\玩家输入的数字
	int ans = 7;   \\这是事先设置好的目标数字
	printf("请输入1个0 - 9 间的一个数字:");
	scanf("%d", &n);

	if (n > ans)
	{
		printf("\a猜大了!\n");
	}
	else if (n < ans)
	{
		printf("\a猜小了!\n");
	}
	else
	{
		printf("恭喜你,猜对了!\n");
	}
	return 0;
}
在现在的测试版本中,我们设置的目标数字为  7 ,而由玩家输入的值则用变量 n 来表示。
if (n > ans)
	{
		printf("\a猜大了!\n");
	}
	else if (n < ans)
	{
		printf("\a猜小了!\n");
	}
	else
	{
		printf("恭喜你,猜对了!\n");
	}

而这一段代码就是用来判断 n 和 ans 两个变量之间大小关系,并且输出相应的结果。

输出的字符串中包含了两种转义字符:

\n : 换行

\a : 表示警报,输出的时候会响起蜂鸣音。

二、重复猜数字,直到猜中停止

如果玩家只能进行一次猜数字,那么想要才猜对数字可能就需要重新运行多次程序,就过于繁琐了,所以我们可以给我们的程序加上循环。

代码2: 

#include<stdio.h>
int main()
{
	int n = 0;    //玩家输入的数字
	int ans = 7;   //这是事先设置好的目标数字
	printf("请输入1个0 - 9 间的一个数字:");
	scanf("%d", &n);

	do {
		if (n > ans)
		{
			printf("\a猜大了!\n");
		}
		else if (n < ans)
		{
			printf("\a猜小了!\n");
		}
	} while (n != ans);
		printf("恭喜你,猜对了!\n");
	
	return 0;
}

在代码2中,我们删除了代码1中,if语句的后半截,并在此基础上增加了 do语句

do语句先循环,后判断的语句。

dowhile 围起来的语句叫做循环体。只要()中的表达式不为0,循环体就会一直重复运行下去,直到表达式的结果为0,才会停止工作。

运算符 != 是对左右两边操作数值是否不相等这一条件进行判断。如果条件成立,表达式的值为1,程序继续运行;若条件不成立,则为0,跳出循环。

在这段代码中,当n和ans是同一个数时,表达式的值结果就是0,循环结束,将在屏幕上打印“恭喜你,猜对了!”。

补充 :

(1)判断两个操作数是否相等的操作符有::"==" 、 “!=”。

(2)判断两个操作数的大小关系的操作符有:">"、"<"、"<="、“>=”。

三、随机生成一个目标数字

代码3:

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
int main()
{
	int n = 0;    //玩家输入的数字
	srand(time(NULL));	//设计随机数的种子
	int ans = rand()%1000;   //随机生成一个0~999之间的一个数字
	printf("请输入1个0 - 999 间的一个数字:");

	do {
		printf("请输入:");
		scanf("%d", &n);
		if (n > ans)
		{
			printf("\a猜大了!\n");
		}
		else if (n < ans)
		{
			printf("\a猜小了!\n");
		}
	} while (n != ans);	//重复到猜对为止
		printf("恭喜你,猜对了!\n");
	
	return 0;
}

仅仅是把目标数字从我们自己预设的,变成随机生成的,这个游戏的趣味性就增加了。大家可以将代码多运行几次感受一下。

 补充:

(1)生成随机数之前需要设定一个“种子”。

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

/*·····*/
srand(time(NULL));    /*设定随机数的种子*/

在调用rand()函数之前需要先调用srand函数(至少调用一次,调用次数不限制)。如果没有上述代码,那么生成的数字是相同且有规律的。

(2)生成随机数

一旦调用 rand 函数,就会得到一个大于等于0且小于等于 RAND_MAX 的随机数。RAND_MAX的值取决于编程环境,即大于等于32767。

如果想要设置随机数的范围,可以这样操作:

rand() % (a+1);    //这是大于等于 0 且 小于等于 a 的随机数
b + rand() % (a+1)    //这是大于等于 b 且 小于等于 b+a 的随机数

 为了增加游戏的紧迫感,可以限制猜数字的次数

代码4:

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
int main()
{
	int n = 0;    //玩家输入的数字
	const int max_stage = 10;	//最多可以猜测的次数
	int remain = max_stage;	//还可以猜测几次

	srand(time(NULL));	//设计随机数的种子
	int ans = rand()%1000;   //随机生成一个0~999之间的一个数字

	printf("请输入1个0 - 999 间的一个数字:");

	do {
		printf("还剩%d次机会,请继续输入:",remain);
		scanf("%d", &n);
		remain--;	//	减少可输入次数

		if (n > ans)
		{
			printf("\a猜大了!\n");
		}
		else if (n < ans)
		{
			printf("\a猜小了!\n");
		}
	} while (n != ans && remain > 0);	//重复到猜对为止
	if (n != ans)
		printf("\a很遗憾,正确答案是:%d\n", ans);
	else {
		printf("恭喜你,猜对了!\n");
		printf("你用了%d次猜中了\n", max_stage - remain);
	}
	return 0;
}

变量 max_stage 表示玩家最多可输入的次数,这上述代码中是10。

变量remain 表示还可以输入的次数,当这个值为0的时候游戏就结束了,因为在 do 语句的判断中不仅有 n!=ans ,还有remain > 0这个条件。

&&操作符的两边都不为0时,表达式的值为1,反之,则为0。

所以,上述代码中,如果玩家输入10次数字均为猜中,即remain的值为0,则游戏结束。

最后用 max_stage - remain 就可以知道玩家是第几次猜中的数字。


四、保存输入记录

我们希望程序可以记录下玩家输入过的数字,并且在游戏结束的时候知道自己猜的数字和目标数字的差距有多大。

代码5:

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

#define MAX_STAGE 10	//最多可输入的次数

int main()
{
	int stage = 0;		//已经输入的次数 
	int n = 0;			//输入的数字
	int ans = 0;		//目标数字
	int num[MAX_STAGE] = { 0 };		//输入过的数字,历史记录

	srand(time(NULL));	//设置随机数的种子
	ans = rand() % 1000;	//生成0~999的随机数

	printf("请输入一个0~999之间的一个数字:  \n");
	do {
		printf("还剩下%d次机会。请输入: ", MAX_STAGE - stage);
		scanf("%d", &n);
		num[stage++] = n;	//将输入过的数字,存到数组中去

		if (n > ans)
			printf("猜大了!\n");
		else if (n < ans)
			printf("猜小了!\n");
	} while (n != ans && stage < MAX_STAGE);

	if (n != ans)
		printf("\a很遗憾!,正确答案是:%d\n", ans);
	else
	{
		printf("恭喜你猜对了!\n");
		printf("你一共猜了%d次。\n", stage);
	}
	puts("--- 输入记录 ---\n");
	int i = 0;
	for (i = 0; i < stage; i++)
	{
		printf("%2d : %4d %+4d\n", i + 1, num[i], num[i] - ans);
	}
	return 0;
}

 在代码5中,没有采用变量 max_stage ,而是定义了一个宏 MAX_STAGE

并创建了数组 num 用于储存玩家输入过的数字。

因为在编译的时候,这个 int num[MAX_STAGE],会被替换成 int num[10],所以程序不会报错。

在代码5中,新引入变量 stage 。这个变量用于代替代码4中表示剩余输入次数的变量remain

游戏开始时,stage的初始值为0,之后玩家每输入一次,stage的值都会逐次增加,当值等于MAX_STAGE时,也就是等于10的时候,游戏结束。

 在数组的声明中,[]里的值是元素个数,也可以用于访问各个元素。

首个元素的下标为0,之后的下标逐一递增,因此可以用 num[0],num[1],...,num[9],依次访问数组的元素。由于最后一个元素的下标等于元素个数-1,所以不存在num[10]这个元素。

 这里共有3个操作符,分别是

[ ] ——声明int[10]中的[ ]是用于声明的符号;用于访问a[5]中的[ ]是下标运算符号。

++ ——增量运算符(递增运算符),又分为前置形式的 ++a,和后置形式的a++。

前置增量运算符 ++a:会在整个表达式进行求值之前,先对操作数的值进行增量。

后置增量运算符a++:会在整个表达式进行求值之后,再对操作数的值进行增量。

 这样,一个简单的猜数字游戏就完成了。

  • 55
    点赞
  • 223
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值