来点C练习题-写一个猜数字游戏,了解rand函数,随机数如何生成?结合分支和循环语句写一个猜数字游戏

写一个猜数字游戏
游戏要求:

  1. 电脑自动生成1~100的随机数
  2. 玩家猜数字,猜数字的过程中,根据猜测数据的大小给出大了或小了的反馈,直到猜对,游戏结束。

一、随机数的生成

如何生成一个随机数?

1.rand函数

让我们来认识一个新函数,C语言中提供的一个函数rand,这个函数是可以生成随机数的,函数原型如下所示:

int rand (void)

rand函数会返回一个伪随机数,这个随机数的范围在0-RAND_MAX之间,这个RAND_MAX的大小是依赖编译器上实现的。

rand函数的使用需要包含头文件是:stdlib.h

现在来测试一下rand函数。

#include 
#include 
int main() {
    printf("%d\n",rand);
    printf("%d\n",rand);
    printf("%d\n",rand);
    printf("%d\n",rand);
    printf("%d\n",rand);
    return 0;
}

来点C练习题-写一个猜数字游戏,了解rand函数,随机数如何生成?结合分支和循环语句写一个猜数字游戏_第1张图片

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

之所以每次运行程序产生的随机数序列是一样的,那是因为rand函数生成随机数的默认种子是1。如果要生成不同的随机数,就要让种子是变化的。

2.srand

C语言中又提供了一个函数叫 srand函数,通过srand函数的参数seed来设置rand函数生成随机数的时候的种子,只要种子在变化,每次生成的随机数序列也就变化起来了。

也就是说srand的种子如果是随机的,rand就能生成随机数;在生成随机数的时候又需要一个随机数,这就矛盾了。

void srand (unsigned int seed);

来点C练习题-写一个猜数字游戏,了解rand函数,随机数如何生成?结合分支和循环语句写一个猜数字游戏_第2张图片

来点C练习题-写一个猜数字游戏,了解rand函数,随机数如何生成?结合分支和循环语句写一个猜数字游戏_第3张图片

3.time

在程序中我们一般是使用程序运行的时间作为种子的,因为时间时刻在发生变化的。

在C语言中有一个函数叫time,就可以获得这个时间,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指向的内存中带回去。
  • 如果timer是NULL(空指针),就只返回这个时间的差值。time函数返回的这个时间差也被叫做:时间戳。时间戳(Unix timestamp)转换工具 - 在线工具 (时间戳Unix 时间戳是从1970年1月1日(UTC/GMT的午夜)开始所经过的秒数,不考虑闰秒。)
//vs2022上的time_t类型的说明

#ifndef _CRT_NO_TIME_T
	#ifndef _USE_32BIT_TIME_T
    	typedef __time32_t time_t;
	#else
    	typedef __time64_t time_t;
	#endif
#endif


typedef long					__time32_t;
typedef __int64					__time64_t;

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

time(NULL);

那我们就可以让生成随机数的代码改写如下:

srand函数是不需要频繁调用的,你的运行结果不一定和这个一样。

#include 
#include 
#include 

int main()
{
    //使用time函数的返回值设置种子
    //因为srand的参数是unsigned int类型,将time函数的返回值强制类型转换
    srand((unsigned int)time(NULL));//使用
    printf("%d\n", rand());
    printf("%d\n", rand());
    printf("%d\n", rand());
    printf("%d\n", rand());
    printf("%d\n", rand());
    return 0;
}

来点C练习题-写一个猜数字游戏,了解rand函数,随机数如何生成?结合分支和循环语句写一个猜数字游戏_第4张图片

4.设置随机数的范围

如果要生成0-99之间的随机数,方法如下:

rand() %100;//余数的范围是0-99

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

rand() %100+1;//%100的余数的范围是0-99,0-99的数字+1,范围是1-100

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

100 + rand() %(200-100+1)
    //余数的范围是0-100,加100后就是100-200

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

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

二、猜数字游戏实现

参考代码:

#define _CRT_SECURE_NO_WARNINGS

#include 
#include 
#include 

void menu()
{
    printf("**********************\n");
    printf("******  1.Play  ******\n");
    printf("******  0.Exit  ******\n");
    printf("**********************\n");
}

void game()
{
    int guess = 0;
    int ret = rand() % 100 + 1;
    while (1)//猜数字是循环多次的,所以使用循环语句
    {
        printf("Please enter a number:>");//由于猜数字也是多次进行的,所以要包含在循环之中
        scanf("%d", &guess);
        if (guess < ret)
        {
            printf("Guess it's too small\n");
        }
        else if (guess > ret)
        {
            printf("Guess it's too big\n");
        }
        else
        {
            printf("Correct answer\n");
            break;//数字猜对后,跳出循环
        }
    }
}

int main()//首先考虑一下游戏的界面和步骤
{
    int input = 0;
    srand((unsigned int)time(NULL));
    do {//考虑到可以多次进行游戏,所以使用循环
        menu();//首先是游戏的菜单界面,显示了游戏的选择项目
        printf("Please select:>");//作为引导显示
        scanf("%d", &input);//输入是否进行游戏
        switch (input) {
        case 1://输入1时,游戏开始
            game();//跳转至游戏的代码
            break;//记得带上break

        case 0://输入0时,退出游戏
            printf("Exit the game\n");
            break;

        default://输入其他字符,显示错误
            printf("Error\n");
            break;
        }
    } while (input);//根据input值,判断是否再次进入循环
    //0为假,非0为真
    return 0;
}

来点C练习题-写一个猜数字游戏,了解rand函数,随机数如何生成?结合分支和循环语句写一个猜数字游戏_第5张图片

还可以加上猜数字的次数限制,如果5次猜不出来,就算失败:


#include 
#include 
#include 

void menu()//菜单设计
{
    printf("**********************\n");
    printf("******  1.Play  ******\n");
    printf("******  0.Exit  ******\n");
    printf("**********************\n");
}

void game()
{
    int guess = 0;
    int ret = rand() % 100 + 1;//随机值的范围是1-100
    int count = 5;
    while (count)//可以猜测的机会
    {
        printf("You have %d opportunities\n",count);//提示给多少次机会
        printf("Please enter a number:>");//由于猜数字也是多次进行的,所以要包含在循环之中
        scanf("%d", &guess);
        if (guess < ret)
        {
            printf("Guess it's too small\n");
        }
        else if (guess > ret)
        {
            printf("Guess it's too big\n");
        }
        else
        {
            printf("Correct answer\n");
            break;//数字猜对后,跳出循环
        }
        count--;//每输入一次,机会减1
    }        
    if (count == 0)
    {
        printf("Unfortunately, the game has ended. The answer is %d\n", ret);
    }
}

int main()//首先考虑一下游戏的界面和步骤
{
    int input = 0;
    srand((unsigned int)time(NULL));
    do {//考虑到可以多次进行游戏,所以使用循环
        menu();//首先是游戏的菜单界面,显示了游戏的选择项目
        printf("Please select:>");//作为引导显示
        scanf("%d", &input);//输入是否进行游戏
        switch (input) {
        case 1://输入1时,游戏开始
            game();//跳转至游戏的代码
            break;//记得带上break

        case 0://输入0时,退出游戏
            printf("Exit the game\n");
            break;

        default://输入其他字符,显示错误
            printf("Error\n");
            break;
        }
        printf("\n");//让每一关游戏之间有间隔隔开,更清晰
    } while (input);//根据input值,判断是否再次进入循环
    //0为假,非0为真
    return 0;
}
 

来点C练习题-写一个猜数字游戏,了解rand函数,随机数如何生成?结合分支和循环语句写一个猜数字游戏_第6张图片

你可能感兴趣的:(C练习题,学习,c语言)