C语言--猜数字小游戏

游戏菜单设定

 采用input作为while判定条件的逻辑:input为1时,则可以一直进入循环进行菜单内容选择;input为0时,则while判定条件为假,正好退出游戏,程序结束;input为其他值时,while判定结果为真,正好也可以继续进入循环,然后重新选择

随机数的生成

  • 有关rand()函数和srand()函数

rand( )函数:

  1. 通过某种算法,生成伪随机数(不够随机)
  2.  生成的随机数范围:0-RAND_MAX(32767)
  3.  rand函数在生成随机数之前,要使用srand函数设置随机数的生成器

srand( )函数:

  1. ()内的种子数确定后,最后生成的数也就确定了
  2.  要想数是随机的,则应让( )内的种子是随机的

 此时陷入了矛盾:为了生成一个随机数,我需要一个随机数放在srand()里。

这时我们可以想,时间是时刻变化的,因此我们可以通过使用时间的方式来生成随机数

  • C语言中时间函数

运行结果: 

 原因:由于srand()函数在读取菜单的时候都会调用一次,会导致生成的随机数非常接近(参考时间函数中时间戳的解释)

 解决:

 由于游戏是生成1~100内的随机数,所以我们对变量ch进行调整,一个数%100可以获得0~99的数

所以我们+1,最终可获得1~100的数

 运行结果

进行猜数字 

  • 代码逻辑

  • 限制次数(优化程序) 

完整代码 

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
//猜数字游戏实现
//电脑随机产生一个1~100之间的数字
#include <stdlib.h>//srand函数所需头文件
#include <time.h>//time函数所需头文件
void menu( )
{
	printf("*****************************\n");
	printf("**********1. play************\n");
	printf("**********0. exit ************\n");
	printf("*****************************\n");
}
//rand( )函数:通过某种算法,生成伪随机数(不够随机)
// 生成的随机数范围:0-RAND_MAX(32767)
// rand函数在生成随机数之前,要使用srand函数设置随机数的生成器
//srand( )括号内的种子数确定后,最后生成的数也就确定了,
//要想是随机的,则应让( )内的种子是随机的

void game( )
{
	//1.生成随机数
	//时间是随时变化的
	//time()函数的返回类型是time_t,而srand()函数的返回类型是unsigned int,故需要强制类型转换一下
	//time函数可以返回一个时间戳
	//srand((unsigned int)time(NULL));放在这里会让生成的随机数很接近就不够随机


	int ch = rand()%100+1;//保证生成的随机数在1~100之间
	//后面为了玩游戏只需要调动rand()函数就可以了
	//printf("%d\n", ch);
	 
	
	//2.进行猜数字
	int input2 = 0;
	int i = 0;
	while (i<3)
	{
		printf("请开始猜数字:> ");
		scanf("%d", &input2);
		if (input2 < ch)
			printf("猜小了\n");
		else if (input2 > ch)
			printf("猜大了\n");
		else
		{
			printf("恭喜你,猜对了!\n");
			break;
		}
		i++;
	}
	if (i == 3)
		printf("欧呦,没猜中哦~\n");
}
int main( )
{
	int input = 0;
	srand((unsigned int)time(NULL));//放在这里,调用一次就好了
	do
	{
		menu( );
		printf("请选择:>");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			printf("开始猜数字\n");
			game( );
			break;
		case 0:
			printf("退出游戏\n");
			break;
		default :
			printf("选择错误,重新选择 \n");
			break;
		}
	}while(input);
	return 0;
}

  总结:以上是我对代码的一些整理及理解,希望能帮助到大家

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

胡闹的猫.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值