用C语言实现猜数字游戏


一、基本知识

1、随机数生成

【1】rand函数

.在C语言中,rand函数是一个用于生成随机数的标准库函数,该函数声明和定义位于头文件stdlib.h中,该函数原型为:

int rand (void);

用以下代码进行测试:

#include<stdio.h>
#include<stdlib.h>
int main()
{
	printf("%d\n", rand());
	printf("%d\n", rand());
	printf("%d\n", rand());
	printf("%d\n", rand());
	return 0;
}

运行结果如下(多运行几次):
在这里插入图片描述
可以发现,每次结果是一样的。
这是因为:rand函数生成的随机数是伪随机数,即将基准值通过某种算法生成的随机数,这个基准值可以称为“种子”。并且rand函数默认“种子”为1。

【2】srand函数

为了生成不同的随机数,就要让“种子”变化,这就需要srand函数,该函数头文件也为stdlib.h
函数原型如下:

void srand(unsigned int seed);

srand函数也是C语言提供的库函数,用来初始化随机数的生成器,在使用rand之前先调用srand函数,通过srand函数的参数seed来设置“种子”,只要seed变化,随机数序列就会变化。换句话说,srand函数设置了随机数的生成起点。
需要注意的是:srand函数在猜数字游戏这个程序中调用一次就够了,无需频繁调用。
测试如下:

#include<stdio.h>
#include<stdlib.h>
int main()
{
	srand(2);//seed为2
	printf("%d\n", rand());
	printf("%d\n", rand());
	printf("%d\n", rand());
	printf("%d\n", rand());
	return 0;
}

在这里插入图片描述
改变seed:

#include<stdio.h>
#include<stdlib.h>
int main()
{
	srand(6);//这里seed改为6
	printf("%d\n", rand());
	printf("%d\n", rand());
	printf("%d\n", rand());
	printf("%d\n", rand());
	return 0;
}

在这里插入图片描述
可以看出两次结果不同,但如何让seed自行改变,而非一个固定值呢?这时候就需要time函数

【3】time函数

我们可以将时间作为seed,因为时间时刻变化。
头文件:time.h
原型:

time_t time(time_t* timer);
这里我们引入一个新的概念:时间戳。
计算机起始时间和当前时间的差值,换算成秒,就是时间戳。
当timer为NULL时,就返回这个差值,也就是时间戳。

这样,代码就可以写为:

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int main()
{
  srand((unsigned int)time(NULL));
  //srand函数返回值类型为unsigned int,所以需要强制类型转换
  printf("%d\n", rand());
  printf("%d\n", rand());
  printf("%d\n", rand());
  printf("%d\n", rand());
  return 0;
}

运行多次,结果不同:
在这里插入图片描述
在这里插入图片描述

2、设置随机数的范围

【1】实现0~99之间的随机数
rand()%100;//余数范围0~99
【2】实现1~100之间的随机数
rand()%100+1;//余数范围0~99,再加1
【3】实现100~200之间的随机数
100+rand()%(200-100+1);
【4】实现a~b之间的随机数
a+rand()%(b-a+1);

二、代码实现

1、设计要求

【1】电脑自动生成1~100随机数
【2】玩家猜数字,猜数字过程中,根据猜测数字大小,电脑给出反馈
【3】限定10次以内猜对,否则失败

2、设计思路

1、为了美化,先设计一个菜单,选择是否开始游戏
2、用循环实现一场游戏结束后是否选择开始下一场游戏
3、用自定义函数编写游戏过程,使代码看起来更清晰
4、记得提醒玩家剩余猜数字的次数

3、最终呈现

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
void game()//生成随机数+猜数字
{
	int num=rand() % 100 + 1;
	int guess = 0;
	int count = 10;
	while (count)
	{
		printf("你还有%d次机会",count);
		printf("请猜数字:");
		scanf("%d",&guess);
		if (guess > num)
		{
			printf("猜大了\n");
		}
		else if (guess < num)
		{
			printf("猜小了\n");
		}
		else
		{
			printf("恭喜你,猜对了!\n");
			break;
		}
		count--;
	}
	if (count == 0)
	{
		printf("你失败了,正确答案是:%d\n", num);
	}
}
void menu()//菜单
{
	printf("****************\n");
	printf("*****1.play*****\n");
	printf("*****0.exit*****\n");
	printf("****************\n");
}
int main()
{
	int input = 0;
	srand((unsigned int)time(NULL));//只调用一次srand
	do
	{
		menu();
		printf("请选择:\n");
		scanf("%d",&input);//选择是否进入游戏
		switch (input)
		{
		case 1:
			game();//调用执行游戏过程的自定义函数
			break;
		case 0:
			printf("退出游戏\n");
			break;
		default:
			printf("选择错误,请重新选择\n");
			break;
		}
	} while (input);
	//该循环实现一次游戏结束后下一场游戏的选择
	return 0;
}

运行结果:
在这里插入图片描述


如有问题,欢迎指正!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值