猜数字小游戏的实现

  1. 引言
  2. 相关库函数介绍
  3. 生成一个随机数
  4. 猜数字代码实现

1. 引言

       在介绍猜数字小游戏之前,我会先讲解一些游戏中所要用到的一些库函数,方便大家理解。

2. 相关库函数介绍

2.1 rand 

int rand(void);

       rand是标准库<stdlib.h>里的库函数,会返回一个伪随机数,伪随机数的范围是0~RAND_MAX之间,RAND_MAX 的大小是根据编译器来确定的。但大多数编译器的值是32767。

为什么说是一个伪随机数呢

rand生成随机数是以一个名为“种子”的基数为基础根据一种算法获得的随机数,不是真正的随机数,而这个“种子”的基数默认值是 1 。因此每次编译生成的随机数都是一样的。

下面是两次编译的结果,你会发现生成的随机数是一样,因为“种子”默认值是1没有变化,所以两次生成的随机数也是一样的,只有这个“种子”不断变化,生成的随机数才每次都不一样。

这就要介绍下面的函数:

2.2 srand

void stand(unsigned  int  seed);

       srand函数也是标准库<stdlib.h>里面的库函数,用来初始化生成随机数的“种子”。

rand函数每次调用前都要先从stand函数这里获得“种子”值(“种子”的默认值是1),然后根据某种算法生成随机数,因此要想得到真正的随机数就要让“种子”不断变化,才能让每次编译生成的随机数是不同的。

想想计算机里什么东西是不断变化的:时间

因此就涉及到下面的函数:

2.3 time

time_t   time(time_t   *timer);

         time是标准库<time.h>里面的库函数,返回值类型是 time_t(实际上是一个32位或者64位的整型类型),而这个返回值也被称为 时间戳,是不断变化的一个值。

什么是时间戳?

       时间戳也就是从1970年1月1日0时0分0秒到现在的时间差值,单位是秒。

        time函数的参数为空时:则只会返回时间戳的值

        time函数的参数不为空时:则会将时间戳的值放到timer所指向的内存中,并返回时间戳的值。

  而我们生成随机数只需用到时间戳的值,因此就可以使time函数的参数设置为空(NULL):

time(NULL);

3.生成一个随机数

学完上面的函数知识后,我们就可以生成随机数了。

srand( (unsigned  int)time(NULL) );

int  rdom = rand();

         首先通过调用time函数生成一个时间戳(这个时间戳是整型类型),而srand接收的参数应是time函数返回的一个 无符号整型,而srand函数应该接收的参数为无符号整型(unsigned int),因此要将 time函数返回的时间戳强制类型转换成(unsigned int)类型 ,srand接收后就生成一个 种子 ,由rand函数接收,生成一个随机数赋值给定义的变量rom,这样一个随机数就生成了。

下面便是“种子”不断变化,两次编译后生成的随机数:

很明显这两次编译后生成的随机数是不同的。

4.猜数字代码实现

了解完上面三个函数后,你就可以自己动手去尝试编写 猜数字小游戏 的代码了。

下面是(博主自己写的)猜数字的完整代码(仅供参考):

#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()
{

    int rdom = 0;
    int guess = 0;
    rdom = rand() % 100 + 1;
    while (1)
    {
        printf("请输入你要猜的数->");
        scanf("%d", &guess);
        if (guess < rdom)
        {
            printf("猜小了\n");
        }
        else if (guess > rdom)
        {
            printf("猜大了\n");
        }
        else
        {
            printf("猜对了\n");
            break;
        }
    }
}

int main()
{
    srand((unsigned int)time(NULL));
    int input = 0;
    do
    {
        menu();
        printf("请选择->");
        scanf("%d", &input);
        switch(input)
        {
            case 1:
            {
                game();
                break;
            }
            case 0:
            {
                printf("退出游戏\n");
                break;
            }
            default:
            {
                printf("输入错误,请重新输入!");
                break;
            }
        }
    }while (input);

    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值