c语言项目实践-猜数字大小

掌握了我之前说的那些代码知识,接下来,我们就可以写一些基本的小游戏,例如-猜数字的游戏。

游戏要求:

1. 电脑⾃动⽣成1~100的随机数

2. 玩家猜数字,猜数字的过程中,根据猜测数据的⼤⼩给出⼤了或⼩了的反馈,直到猜对,游戏结束

随机数的生成

想要完成猜数字的游戏,首先我们要生成1-100的随机数,那。该怎么生成嘞

rand函数

在C语言中,有一个专门生成随机数的语句-rand语句,它的格式如下:

int rand (void); 

rand会生成一个伪随机数,这个伪随机数的值在0~RAND_MAX之间,这个RAND_MAX是依据编译器来实现的,大多数编译器的这个值都是32767

rand使用的时候有一个头文件stdlib.h

那接下来我们展示一下rand函数的功能

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

 

结果如下 你会发现,每次循环的结果都是如上图所示,是一样的,这是为什么呢

这就是我们说的rand函数生成的是一个伪随机数,为什么叫伪随机数呢,因为他是基于一个叫种子

的基准值用算法计算生成的,之所以前面的每个数都一样,就是因为rand()中默认种子为1,而想要产生变化的值,就要让种子也产生相应的变化。

srand函数

srand函数在C语言当中是初始化随机数的生成器的,它的格式如下:

void srand( unsigned int seed);

我们在调用sand函数之前,要先调用srand函数来生成种子的随机值,当种子在变化的时候,那么生成的随机数的值也就会发生相应的变化。

time函数

在C语言我们常用程序运行的时间来作为种子,因为程序运行的时间是时刻在发生变化的。

在C语言中有一个函数叫time,就可以获得这个时间,time函数的具体格式如下:

time_t time (time_t *timer); 

time函数会返回当前的日历时间,实际返回的是1970年1月1日0分0秒到现在的时间差,单位是秒,返回的类型是time_t类型的,而time_t实际上是32位或64位的整数类型。

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

timer如果是NULL的指针的话,就只返回这个时间的差值,time函数返回的这个时间差也叫:时间戳

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

time(NULL);//调用time函数返回时间戳,这里没有接收值 

那么,我们就可以将生成随机数的代码改写成:

 #include<stdio.h>
#include<stdlib.h>
#include<time.h>
int main()
{
    srand((unsigned int)time(NULL));//使用time函数的返回值接收种子,srand的接收类型是unsigned int,所以对time用强制类型转换。
    printf("%d\n", rand());
    printf("%d\n", rand());
    printf("%d\n", rand());
    printf("%d\n", rand());
    printf("%d\n", rand());
    printf("%d\n", rand());
    return 0;
}

 

srand函数是不用频繁调用的,一次程序调用一次就好

设置随机数的范围

如果我们要生成0~99的随机数,方法如下:

sand()%100; 

如果我们要生成1~100的随机数,方法如下:

sand()%100+1; 

如果要生成100~200之间的随机数,方法如下:

100+sand()%(200-100+1); 

如果要生成a~b之间的随机数,方法如下:

a+sand()%(b-a+1);  

游戏代码

  那么,完成之后,我们就可以完成游戏的完整代码啦!!

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
void game()
{
    int r = rand() % 100 + 1;
    int guess;
    while (1)
    {
        printf("猜猜数字:");
        scanf("%d", &guess);
        if (guess < r)
        {
            printf("猜小了\n");
        }
        else if (guess > r)
        {
            printf("猜大了\n");
        }
        else
        {
            printf("恭喜你,猜对了");
            break;
        }
    }
}
void menu()
{
    printf("*************************\n");
    printf("********1.play***********\n");
    printf("********2.exit***********\n");
    printf("*************************\n");
}
int main()
{
    int input;
    srand((unsigned int)time(NULL));
    do
    {
        menu();
        printf("请输入你的选择");
        scanf("%d", &input);
        switch (input)
        {
        case 1: game();
            break;
        case 2:
            printf("游戏结束");
            break;
        default:
            printf("输入错误,请输入正确数字");
            break;
        }
    } while (input);
    return 0;
}

此外,我们还可以给游戏加上一个次数限制,要是超过五次,就没机会了。

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
void game()
{
    int r = rand() % 100 + 1;
    int guess;
    int num = 5;
    while (1)
    {
        printf("你还有%d次机会", num);
        printf("猜猜数字:");
        scanf("%d", &guess);
        if (guess < r)
        {
            printf("猜小了\n");
        }
        else if (guess > r)
        {
            printf("猜大了\n");
        }
        else
        {
            printf("恭喜你,猜对了");
            break;
        }
        num--;
    }
    if (num == 0)
    {
        printf("你失败了");
    }
}
void menu()
{
    printf("*************************\n");
    printf("********1.play***********\n");
    printf("********2.exit***********\n");
    printf("*************************\n");
}
int main()
{
    int input;
    
    srand((unsigned int)time(NULL));
    do
    {
        menu();
        printf("请输入你的选择");
        scanf("%d", &input);
        switch (input)
        {
        case 1: game();
            break;
        case 2:
            printf("游戏结束");
            break;
        default:
            printf("输入错误,请输入正确数字");
            break;
            
        }
    } while (input);
    return 0;
}