分支和循环(下)------简单猜数字游戏的实现

本文介绍了如何使用C语言实现猜数字游戏,涉及rand函数生成伪随机数、srand函数设置随机数种子、time函数获取时间戳以确保种子变化,以及如何规定随机数范围。通过time和求余操作,实现1~100之间的随机数生成。
摘要由CSDN通过智能技术生成

  猜数字游戏就是程序给出一个数但不告诉你,我们需要去猜,根据我们给出的答案,程序还能够告诉我们是猜对了还是猜错了,是猜大了还是猜小了。今天我们就要用简单C语言来实现一个猜数字游戏。

  因为是猜数字游戏,所以需要的数字是随机的,如果想生成随机数字,我们就需要用到以下几个函数。

1.rand函数

这个函数的原型是:

int rand (void);

引用这个函数需要包含头文件stdlib.h

  这个函数会返回一个大小在0~RAND_MAX之间的整数,这个RAND_MAX的大小取决于编译器,不同的编译器大小可能会有所不同,大部分的编译器中RAND_MAX的值是32767。

  以下是其随机数的生成结果。

  

 但这个函数返回的数是伪随机数,并不是真正的随机数。什么意思呢?让我们把上方的代码再次运行一次看看,如下

  是不是发现运行的结果和第一次运行的结果是相同的,这时我们就很奇怪了,我们不是要实现猜数字游戏吗,那如果每次生成的数字一样,那这个游戏只能玩一次了。

  伪随机数不是真正的随机数,伪随机数是通过某种算法得出来的随机数,而rand函数是对一个叫“种子”的基准值进行运算生成的随机数。之所以上面的程序每次的结果一样,是因为rand函数生成随机数的默认种子是1,如果想要生成不同的随机数,就要让种子是变化的。

  于是我们就需要用到另一个函数srand

2.srand

这个函数的原型是:

void srand (unsigned int seed);

引用这个函数需要包含头文件stdlib.h

  srand函数是用来初始化随机数的生成器的,程序中在调用rand函数前先调用srand函数,通过srand函数的参数seed来设置rand函数生成随机数的时候的种子,只要种子在变化,rand函数每次生成的随机数也就变化起来了。

  但我们是为了生成一个随机数,可是现在我们又需要srand函数中的参数seed是随机变化的,这就变得冲突矛盾了。

  这时候就要引入第三个函数time了。

3.时间戳

  在介绍time函数之前,我们先要了解一下什么是时间戳

  时间戳是指格林威治时间1970年01月01日00时00分00秒(即北京时间1970年01月01日08时00分00秒)起至现在的总秒数。

4.time

这个函数的原型是:

time_t time (time_t* timer);

引用这个函数的时候需要包含头文件time.h

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

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

  如果timer是NULL,就会返回这个时间的差值。time函数返回的这个时间差就是”时间戳“。

  如果只是想让time函数返回时间戳,我们可以这样写:

  因为时间是会时刻变化的,所以我们就可以把time函数所返回的时间戳当作seed的值。

   现在让我们写一段代码看看是否能生成随机数:

大家可以看到,我将这段代码运行了两次,所出现的结果是不一样的,因此我们实现了随机数的生成。

5.如何规定生成随机数的范围

  因为rand函数生成的随机数范围是在0~RAND_MAX之间的(RAND_MAX的值在大部分编译器上是32767),这个范围太大了,我们很难猜到随机数,这时候我们就可以利用求取来规定范围了

这里我们可以利用一些方法生成a~b的随机数

6.猜数字游戏的实现

  知道了以上3个函数rand、srand、time后我们知道了如何生成随机数,使用求余的方法我们又可以规定生成的随机数的范围,知道了这些后我们就可以写一个代码来实现猜数字游戏了(猜1~100之间的随机数)。以下是我写的代码,大家可以参考一下。

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<time.h>

void menu()
{
    printf("********************\n");
    printf("**** 1:开始游戏 ****\n");
    printf("**** 0:退出游戏 ****\n");
    printf("********************\n");
    printf("请选择1或0:\n");
}

void game()
{
    int r = rand() % 100 + 1;
    int guess = 0;
    int count = 10;//一共有count次猜数字的机会
    printf("你一共有 %d 次机会来猜数字,数字范围在1~100之间\n",count);
    while (count)
    {
        scanf("%d", &guess);
        if (guess > r)
            printf("猜大了,请再猜一次\n");
        else if (guess < r)
            printf("猜小了,请再猜一次\n");
        else
        {
            printf("恭喜你,猜对了\n");
            break;
        }
        count--;
        printf("你还有 %d 次机会猜数字\n",count);
    }
}
int main()
{
    srand((unsigned int)time(NULL));
    int input = 0;
    do
    {
        menu();
        scanf("%d", &input);
        switch (input)
        {
        case 1:
            game();
            break;
        case 0:
            printf("游戏结束\n");
            break;
        default:
            printf("输入错误,请输入1或0\n");
        }
    } while (input);
    return 0;
}

以下是这个游戏的实际效果:

感谢大家的阅读,如果感兴趣的话可以给博主来个三连,谢谢~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值