猜数字游戏

前言

掌握前面的学习知识后,我们就可以适当的写一些稍微有趣的代码,比如猜数字游戏


游戏要求:

  1. 随机生成1~100的生成数
  2. 猜数字的过程中,我们在猜数字的过程中,电脑会提示猜大了,还是猜小了,直到猜对,游戏结束

1.随机数生成

想要完成猜数字游戏,首先就要想如何产生随机数字呢?

rand:

C语言提供了一个函数叫做rand,这个函数是可以生成随机数的

函数原型如下

int rand(void);

rand函数会返回一个伪随机数,这个伪随机数的范围是在0~rand_max之间,这个rand_max的大小是依赖编译器上实现的,但是大部分的编译器上面为32767。

在使用rand()函数之前必须包含一个头文件<stdlib.h>

接下来我代码测试一下

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

int main() {
	//rand()会随机出一个伪随机数
	//rand生成的随机数默认种子数为1
	int r = rand();
	printf("%d\n",r);

	r = rand();
	printf("%d\n", r);

	r = rand();
	printf("%d\n", r);

	r = rand();
	printf("%d\n", r);

	return 0;
}

运行一次结果:                                                            运行二次结果:

我们会发现这两次调试随机数都是相对随机的,但是第一次运行和第二次运行没有变化,这是为什么呢? 

其实rand函数其实返回的是一个伪随机数,伪随机数不是真正的随机数,是通过某种算法生成的随机数,真正的随机数是不会预测到下一个值是多少的,而rand函数是对一个叫“ 种子 ”的基准值进行运算的随机值。

每次运行结果都是一样的,rand()函数默认的种子数为1

srand:

C语言又提供另一种函数叫做srand,它是用来初始化随机数的生成器

函数原型如下

void srand(unsigned int send);

程序中在调⽤rand函数之前先调⽤srand函数,通过srand函数的参数seed来设置rand函数⽣成随 机数的时候的种⼦,只要种⼦在变化,每次⽣成的随机数序列也就变化起来了。

那也就是说将srand的种子随机,我们就能做到真正能实现生成随机数

time:

在程序中我们⼀般是使⽤程序运⾏的时间作为种⼦的,因为时间时刻在发⽣变化的

C语言提供了一个函数叫做time,在使用前必须包含一个头文件<time.h>

函数形式如下

time_t time(time_t*timer);

time函数会返回当前的⽇历时间,其实返回的是1970年1⽉1⽇0时0分0秒到现在程序运⾏时间之间的差值,单位是秒。返回的类型是time_t类型的,time_t类型本质上其实就是32位或者64位的整型类型

time函数的参数timer如果是⾮NULL的指针的话,函数也会将这个返回的差值放在timer指向的内存 中带回去

如果返回的值是NULL,那么只就返回这个时间的差值。time函数返回的这个时间也叫做:时间戳

如果只是让time函数返回时间按戳,就直接写成

time(NULL);

那么我们现在就可以写些代码来测下

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

int main() {
	int r;
	// srand(unsigned int send)
	// 可改变rand生成的随机数默认的种子数
	srand((unsigned int)time(NULL));
	r = rand() % 100 + 1;
	printf("%d\n",r);
	r = rand() % 100 + 1;
	printf("%d\n",r);
	r = rand() % 100 + 1;
	printf("%d\n",r);
	r = rand() % 100 + 1;
	printf("%d\n",r);
	return 0;
}

运行多次:

 运行多次后,发现不会在重复了

注意:截图只是当前运行结果,会和你的运行结果不符


设置随机数的范围

如果我们要生成0~99的随机数

rand() % 100 //余数范围是0~99

如果我们要生成0~100的随机数

rand() % 100 + 1  // 余数是0~100

如果我们要生成a~b的随机数

a + rand() % (b - a + 1)

 猜数字游戏实现

参考代码:

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

//猜数字游戏

void menu() {
	printf("*************************\n");
	printf("*******  1.PLAY  ********\n");
	printf("*******  0.EXIT  ********\n");
	printf("*************************\n");
}

void game() {
	//生成1~100的随机数
	int guess = 0;
	int r = rand() % 100 + 1;

	int count = 5; 

	while(count) {
		
		// 只有5次机会
		printf("还有%d次机会\n", count);
		printf("请猜数字=>");
		scanf("%d", &guess);

		if (guess > r) {
			printf("猜大了!\n\n");
		
		}
		else if (guess < r) {
			printf("猜小了!\n\n");
		
		}
		else {
			printf("恭喜你猜对了!!!正确的数字是: %d\n",r);
			break;
		}
		count--;
		continue;
	}
	if (count == 0) {
		printf("你的次数已经用完了,你失败了,正确数字是: %d\n ",r);
	}
}

int main() {
	int option = 0;
	srand((unsigned int)time(NULL));
	do {
		//生成简易的菜单
		menu();// 调用函数

		printf("请选择=> 1 or 0\n");

		scanf("%d", &option);
		switch(option)
		{
		case 1:
			//开始游戏
			game();//调用函数
			break;
		case 0:
			printf("退出游戏\n");
			break;
		default:
			printf("输入错误,请重新选择。\n");
			break;
		}
	} while (option);
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值