创造“真正”的随机数以及C初学者便可掌握的代码:猜数字游戏

文章目录


一.概要

在我们初步了解C语言,掌握了C语言常见概念数据类型和变量以及分支和循环就可以掌握下面这段有趣的小游戏 -- 猜数字游戏

二.整体架构流程

以下是完成猜数字游戏所需要的要素:

1.电脑自动生成一到一百的随机数。 

2.玩家猜数字的过程中,程序需要根据玩家给出的数据大小判断并输出“猜大了”或者“猜小了”,直到猜对,游戏结束。

三.完成代码所需知识

1.C语言中的rand函数概念


在C语言中,rand函数是用于生成伪随机数标准库函数,它定义在<stdlib.h>头文件中。rand函数可以返回一个介于0到RAND_MAX之间的整数,其中RAND_MAX是一个宏,定义了rand函数能够返回的随机数的最大值,其值至少为32767。

2.rand函数的使用方法

以下为rand的函数原型:

int rand(void)


rand函数不接受任何参数,直接调用即可返回一个随机数。在程序中首次调用rand函数之前,通常需要调用srand函数来设置随机数生成器的种子。srand函数接受一个unsigned int类型的种子值,常见的做法是使用当前的时间作为种子,这样可以确保每次程序运行时种子的值不同,从而生成不同的随机数序列。

3.srand函数的作用


srand函数用于初始化随机数生成器,其原型如下:

void srand(unsigned int seed);

通过传递不同的种子值给srand函数,可以控制随机数序列的起始点。如果不调用srand函数或者多次调用srand函数使用相同的种子值,rand函数将产生相同的随机数序列。

4.time函数(时间戳)的配合使用

以下为time的函数原型:

time_t time(time_t* timer)


为了避免重复的随机数序列,通常会使用time函数提供的当前时间作为种子。time函数的原型定义在<time.h>头文件中,它返回一个表示自1970年1月1日以来经过的秒数的time_t类型值。在使用time函数时,可以传入一个指向time_t类型变量的指针,如果不需要修改时间值,可以传入NULL。

有关时间戳的详细内容请于下面网址跳转到我的往期博客:

时间戳(C语言)-CSDN博客

5.“真正”的随机数示例代码


以下是一个简单的示例,展示了如何在C程序中使用rand和srand函数生成随机数:

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

int main() {
    // 使用当前时间作为随机数生成的种子
    srand((unsigned int)time(NULL));
    
    // 生成一个随机数
    int randomNumber = rand();
    
    // 输出随机数
    printf("Generated random number: %d\n", randomNumber);
    
    return 0;
}

在上述代码中,srand函数使用time(NULL)获取的当前时间作为种子,然后rand函数用于生成一个随机数,该随机数随后被打印出来。每次运行程序时,由于当前时间的不同,生成的随机数序列也会不同。


6.如何设置随机数的范围

①生成0~99之间的随机数

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

②生成1~100之间的随机数

rand() % 100 + 1
//余数的范围是1~100

③生成100~200之间的随机数

rand() % (200 - 100 + 1)
//余数的范围是100~200

四.猜数字游戏代码实现

在掌握了以上知识点,相信你对如何写一个真正的猜数字游戏有了一定思路,这里我建议你可以先尝试去实现你的代码,然后再来和我的代码对照,这样你的收获才会真正的落袋为安。

以下为我的猜数字游戏代码:

//猜数字游戏
//请于1~100之间进行猜测

//为了避免在使用某些函数(如scanf等)时可能出现的安全警告,定义这个宏。在某些编译器中,如果不定义这个宏,使用这些函数可能会提示警告信息。
#define _CRT_SECURE_NO_WARNINGS 1

//包含标准输入输出头文件,用于使用printf、scanf等函数
#include <stdio.h>
//包含标准库函数头文件,用于使用rand、srand等函数
#include <stdlib.h>
//包含时间相关的头文件,用于使用time函数来获取时间作为随机数生成的种子
#include <time.h>

//函数声明,声明menu函数,该函数用于显示游戏菜单
void menu();
//函数声明,声明game函数,该函数用于实现猜数字的游戏逻辑
void game();

//主函数,程序的入口点
int main()
{
    //定义一个整型变量input,用于存储用户的菜单选择输入
    int input = 0;
    //使用当前时间作为随机数生成器的种子。time函数返回从1970年1月1日00:00:00到当前时刻的秒数,srand函数根据这个种子来初始化随机数生成器,这样每次运行程序时生成的随机数序列会不同
    srand((unsigned int)time(NULL));
    //使用do - while循环,先执行一次循环体,然后根据循环条件决定是否继续循环
    do
    {
        //调用menu函数,显示游戏菜单
        menu();
        //提示用户进行选择,并接收用户输入的菜单选项数字
        printf("请选择:》");
        scanf("%d", &input);
        //使用switch语句根据用户的输入进行不同的操作
        switch (input)
        {
        case 1:
            //如果用户输入1,调用game函数开始猜数字游戏
            game();
            break;
        case 0:
            //如果用户输入0,打印游戏结束的提示信息
            printf("游戏结束了。");
            break;
        default:
            //如果用户输入的不是0或1,打印选择错误的提示信息,要求用户重新选择
            printf("选择错误,请重新选择。");
            break;
        }
    } while (input);
    //主函数结束,返回0表示程序正常结束
    return 0;
}

//menu函数的定义,用于显示游戏菜单
void menu()
{
    //打印游戏菜单的界面,包括游戏选项
    printf("*********************************\n");
    printf("*****       1.play          *****\n");
    printf("*****       0.exit          *****\n");
    printf("*********************************\n");
}

//game函数的定义,用于实现猜数字的游戏逻辑
void game()
{
    //使用rand函数生成一个1到100之间的随机数。rand函数返回一个介于0到RAND_MAX之间的整数,通过取余100再加1的操作,得到1到100之间的随机数,这个随机数将作为要猜测的目标数字
    int ret = rand() % 100 + 1;
    //定义一个整型变量guess,用于存储用户猜测的数字
    int guess = 0;
    //使用while循环,只要条件为真(这里是永远为真的1)就一直循环,直到猜对数字后通过break语句跳出循环
    while (1)
    {
        //提示用户猜数字,并接收用户输入的猜测数字
        printf("请猜数字:》");
        scanf("%d", &guess);
        //如果用户猜测的数字小于目标数字,打印猜小了的提示信息
        if (guess < ret)
        {
            printf("猜小了\n");
        }
        //如果用户猜测的数字大于目标数字,打印猜大了的提示信息
        else if (guess > ret)
        {
            printf("猜大了\n");
        }
        //如果用户猜测的数字等于目标数字,打印恭喜猜对的提示信息,并通过break语句跳出循环
        else
        {
            printf("恭喜你猜对了。\n");
            break;
        }
    }
}

五.小结

1.创造“真正”随机数方面


  ①伪随机数的局限性


  在C语言中,通常的rand函数产生的是伪随机数。它依赖于一个种子值,在相同种子下会生成相同的随机数序列,这并非真正意义上的随机。


  ②改善随机数生成的方法


      Ⅰ对于C初学者,虽然难以实现完全“真正”的随机数,但可以通过合理设置srand函数的种子来改善。例如,使用time(NULL)作为种子,能在每次程序运行时得到不同的随机数序列。


      Ⅱ可能提及一些高级的、超出初学者范围的方法概念,如利用硬件特性或更复杂的算法来获取更接近真正随机的数。


2.猜数字游戏代码方面


  ①游戏逻辑


  Ⅰ猜数字游戏的核心逻辑是程序生成一个随机数(在一定范围内),玩家尝试猜测这个数字。


  Ⅱ每次玩家猜测后,程序根据玩家输入的数字与随机数的大小关系给出提示(大了、小了或者猜对了)。


  ②代码实现要点


  Ⅰ对于C初学者,这个游戏是很好的练习机会。


  Ⅱ代码会涉及到基本的头文件<stdio.h>(用于输入输出操作),<stdlib.h>和<time.h>(用于随机数相关操作)。


  Ⅲ程序中会有初始化随机数生成的部分(如srand((unsigned int)time(NULL));),然后是循环结构(如while循环)来持续获取玩家的猜测并进行比较判断,还会用到条件判断语句(如if - else)来处理不同的比较结果。


  ③学习意义


  有助于初学者理解C语言中的输入输出、控制结构(循环和条件判断)、函数调用(如rand、srand、time函数)等基本概念,同时体会随机数在实际编程中的应用。

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值