C语言 猜数字游戏

大家好!今天来设计一个猜数字游戏!!!

一、前言

对于猜数字游戏,印象让我最深的是小时候在商店里猜价格,猜的最准便可以获得奖品,当时是胡乱猜的,没有任何技巧,不过现在有二分法就很简便了,自己也可以设计之后玩一玩,我上瘾了😊

二、创建菜单

首先对于猜数字游戏来说,一个游戏的界面是不可少的,开始游戏还是退出游戏,这是很重要的,就像这样:

void menu()//我们可以在main函数中调用这个函数
{
	printf("     1. play     \n");
	printf("     0. exit     \n");
}

那么设计完菜单后就要进行选择玩还是不玩?通常进入游戏时首先进入的是游戏菜单界面,不管玩还是不玩,所以这里用到do while语句。

int main()
{
	int input = 0;
	do
	{
//这里input放到do while之外是因为while中要判断input的条件
//输入1开始游戏,输入0退出游戏,放到do while语句中的话
//input被初始化为0,while中的条件不符合,不会执行的,
//而且我们要输入input值		
		menu();
		printf("请选择:");
		scanf("%d", &input);
		
	} while (input);
	return 0;
}

这个是时候输入1的话,要进入游戏,输入0退出游戏,输入其它的话进行报错,所以这里用switch语句来执行。

switch (input)
		{
		case 1:
			game();
//这里调用一个游戏函数,待会会在后面提到,慢慢理解。
			break;
		case 0:
			printf("退出游戏");
			break;
		default:
//这里要说明输入其它的数时报错!!!
			printf("给你机会你也不中用啊!!!(😜)");
			break;
//不要忘记加上break!!!
		}

然后基本上菜单就完毕了,展示代码:

void menu()
{
	printf("     1. play     \n");
	printf("     0. exit     \n");
}

int main()
{
	int input = 0;
	do
	{
		
		menu();
		printf("请选择:");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			game();
			break;
		case 0:
			printf("退出游戏");
			break;
		default:
			printf("给你机会你也不中用啊!!!");
			break;

		}
	} while (input);
	return 0;
}
//建议:设计游戏或者项目时,最好先写一部分代码停下来,调试一下,出现错误
//也很好解决,要不然全部写完去调试会有点麻烦。

三、设计随机数

既然菜单设计完了,开始设计随机数了。随机数怎么设置呢?这里用到一个库函数:rand
在这里插入图片描述上面的意思是产生一个伪随机数,并不是真的随机数,引用的头文件为<stdlib.h>,并且还是整型类型。
在这里插入图片描述返回的值是是一个伪随机数,没有错误返回,那么就可以用一个变量接收rand的返回值了。

void game()
//创建一个game函数,作为游戏执行的部分
{
	
	int ret = rand();//rand函数,记住要引头文件,这里不展示了。
	printf("%d", ret);//我们可以先看看会产生什么随机数?
	//让我们运行一下
}

在这里插入图片描述
确实产生了不一样的数,但是如果再运行一下呢?
在这里插入图片描述
还是一样的,所以这就是伪随机数。
此时要使用到库函数:srand和时间戳(随机种子)。
在这里插入图片描述
就是将一堆数字转换成对应的年月日。
在这里插入图片描述
意思:放置一个随机的初始数,无类型,里面是无定义的int 类型加上种子,这个库函数是没有返回值的。
srand与rand有什么区别吗?
在这里插入图片描述

定义RAND_MAX为0x7fff,这个是上限最大的数,转换成10进制为32767,rand会检测srand的值,进而设计随机数。
时间戳:
在这里插入图片描述
意思:得到系统的时间,头文件为<time.h>
在这里插入图片描述
在过去的时间返回这个时间,没有错误返回。
在srand中放上一个随机种子,使得rand检测srand的值在变,随机数也在变,不会相等。
所以,代码如下:

void game()
{//time中放个NULL就行,NULL代表0
	srand((unsigned int) time(NULL));
	int ret = rand();
	printf("%d\n", ret);
	//接下来可以运行了
}

在这里插入图片描述
可以看到,虽然产生了随机数,但是都很接近,并且有的还一模一样。这是因为每一次执行game()函数时,都让srand函数回到起点,不是接着上次继续下去,所以把它放到main函数中就行了,因为main函数只执行一次。
在这里插入图片描述
放到main函数中就产生了完全不一样的数了,这样很好!但是,我们猜数字难道猜几万的吗?那样还不如买彩票去,我们只要1~100就行了,如何让随机数在1 ~ 100呢?
思考思考,一个数除以100,它的余数是不是在0 ~ 99之间?对啊,那么我们可以模100加1,是不是1 ~ 100呢?实在精妙啊!!!

int ret = rand() % 100 + 1;//修改这样再运行一下

在这里插入图片描述
是不是非常好?好,设计随机数完成了,最后的如何去猜呢?看下面:

四、猜数字

随机数设计完了,那么开始猜数字了。我们首先输入一个数,判断猜大了还是猜小了,可以分三种情况:猜大了,猜小了,猜对了。

void game()
{
	int num = 0;
	int ret = rand() % 100 + 1;
//基本的框架就是这样,我们可以用到一个while循环
		while1{
		printf("请猜数字:");
		scanf("%d", &num);
		if (num < ret)
		{
			printf("猜小了\n");
		}
		else if (num > ret)
		{
			printf("猜大了\n");
		}
		else
		{//猜对的时候跳出循环
			printf("猜对了\n");
			break;
		}
	}

	
}

五、总体测试

#define _CRT_SECURE_NO_WARNINGS

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

int num = 0;
void game()
{
	int num = 0;
	int ret = rand() % 100 + 1;
	while (1)
	{
		printf("请猜数字:");
		scanf("%d", &num);
		if (num < ret)
		{
			printf("猜小了\n");
		}
		else if (num > ret)
		{
			printf("猜大了\n");
		}
		else
		{
			printf("猜对了\n");
			break;
		}
		
	}
}

void menu()
{
	printf("     1. play     \n");
	printf("     0. exit     \n");
}

int main()
{
	int input = 0;
	srand((unsigned int) time(NULL));
	do
	{
		
		menu();
		printf("请选择:");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			game();
			break;
		case 0:
			printf("退出游戏");
			break;
		default:
			printf("给你机会你也不中用啊!!!");
			break;

		}
	} while (input);
	return 0;
}

在这里插入图片描述
程序正确的运行了。但是,这样看的话有点冗杂,我们可以稍微改进一点:再while循环中加一个Sleep和system

void game()
{
	int num = 0;
	int ret = rand() % 100 + 1;
	while (1)
	{
		printf("请猜数字:");
		scanf("%d", &num);
		if (num < ret)
		{
			printf("猜小了\n");
		}
		else if (num > ret)
		{
			printf("猜大了\n");
		}
		else
		{
			printf("猜对了\n");
			break;
		}
		Sleep(500);
		system("cls");
	}
}

关于Sleep与system的介绍我之前讲过,可以看看:
http://t.csdn.cn/hD0fM

六、结语

希望对你有所帮助!!!^ _ ^

好问则裕,自用则小。
----------《尚书正义·卷八·仲虺之诰》

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值