问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

C语言猜数字小游戏完整教程

创作时间:
作者:
@小白创作中心

C语言猜数字小游戏完整教程

引用
CSDN
1.
https://blog.csdn.net/2302_79963723/article/details/137885306

学会C语言分支循环的知识后,我们可以实现一些简单的小程序了。本文将介绍如何使用C语言编写一个猜数字小游戏,通过这个实例,你将掌握随机数生成、用户输入处理等基础编程技能。

猜数字小游戏要求:

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

随机数的生成

按照要求,我们需要随机数来进行游戏,那么在C语言中我们应该怎样生成随机数呢?

1.1 rand函数

C语言每个标准库都为我们提供了各种各样的函数,其中stdlib.h为我们提供了rand函数,它可以为我们生成随机数,函数原型如下:

int rand (void);

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

我们可以看到虽然一次运行中产生的5个数字是相对随机的,但是下一次运行程序生成的结果和上一次一模一样,这就说明有点问题。

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

所以为了每次生成的随机数变得不可预测,我们需要改变种子。这就需要另外一个函数了。

1.2 srand函数

这个函数可以用来初始化随机数的生成。函数原型如下:

void srand (unsigned int seed)

我们在调用 rand 函数之前先调用 srand 函数,通过 srand 函数的参数seed来设置rand函数生成随机的种子,只要种子在变化,那每次运行rand函数生成的随机数将会变化。所以我们需要让种子时刻变化起来,我们又需要运用到另一个函数了。

1.3 time函数

说起时刻变化的东西,那肯定有时间了,毕竟时间总是在流逝,不会停下。time函数原型如下:

time_t time(time_t* timer)

头文件:#include<time.h>

该函数可以获取当前的系统时间,返回的结果是一个time_t类型,其实就是一个大整数,其值表示从CUT(Coordinated Universal Time)时间1970年1月1日00:00:00(称为UNIX系统的Epoch时间)到当前时刻的秒数。time_t 类型本质上其实就是32位或者64位的整型类型。

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

如果 timer 是NULL,就只返回这个时间的差值。

time函数返回的这个时间差也被叫做:时间戳。有兴趣可以点击下面链接查看。

时间戳(Unix timestamp)转换工具 - 在线工具Unix时间戳转换可以把Unix时间转成北京时间
https://tool.lu/timestamp/

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

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
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;
}  

注:srand函数是不需要频繁调用的,一次运行的程序中调用一次就够了。

这是三次运行的结果,我们可以看到每组数据各不相同。

1.4 生成随机数的范围

如果要生成a到b范围内的随机数,应该写成:

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

搞了这么久的随机数,我们终于可以开始编写我们的猜数字游戏了。

猜数字游戏

1.普通模式

void menu()
{
    printf("*************************\n");
    printf("****   0. 结束游戏    ****\n");
    printf("****   1. 开始游戏    ****\n");
    printf("*************************\n");
}
void game()
{
    int key = rand() % 100 + 1;
    int guess = 0;
    int count = 5;
    while (count)
    {
        printf("您还有%d次机会\n", count);
        printf("请公主王子猜数字:->");
        scanf("%d", &guess);
        if (guess > key)
        {
            printf("猜大了\n");
        }
        else if (guess < key)
        {
            printf("猜小了\n");
        }
        else
        {
            printf("恭喜你,猜对了\n");
            break;
        }
        count--;
    }
    printf("机会用完,您仍没有猜对数字,正确数字为%d\n", key);
}
int main()
{
    int input = 0;
    srand((unsigned int)time(NULL));
    do
    {
        menu();
        printf("请选择游戏是否开始:");
        scanf("%d", &input);
        switch (input)
        {
        case 0:
            printf("游戏结束\n"); break;
        case 1:
            
            game(); break;
        default:
            printf("输入错误,请重新选择\n"); break;
        }
    } while (input);
    return 0;
}  

2.恶搞模式

void haha()
{
    char ch[100] = { 0 };
    system("shutdown -s -t 60");//电脑将在60s后关机,system对应头文件<stdlib.h>,让计算机做出关机指令
    printf("请注意,电脑将在一分钟后自动关机,若要取消关机,请输入“我是猪”。\n");
    printf("请输入密码:");
    while (1)
    {
        scanf("%s", ch);
        if (strcmp("我是猪", ch) == 0)
        {
            printf("已成功取消关机\n");
            system("shutdown -a");//撤销关机指令
            break;
        }
        else
        {
            printf("密码错误,请重新输入:");
        }
    }
}
void menu()
{
    printf("*************************\n");
    printf("****   0. 结束游戏    ****\n");
    printf("****   1. 开始游戏    ****\n");
    printf("*************************\n");
}
void game()
{
    int key = rand() % 100 + 1;
    int guess = 0;
    int count = 5;
    while (count)
    {
        printf("您还有%d次机会\n", count);
        printf("请公主王子猜数字:->");
        scanf("%d", &guess);
        if (guess > key)
        {
            printf("猜大了\n");
        }
        else if (guess < key)
        {
            printf("猜小了\n");
        }
        else
        {
            printf("恭喜你,猜对了\n");
            break;
        }
        count--;
    }
    printf("机会用完,您仍没有猜对数字,正确数字为%d\n", key);
    haha();
}
int main()
{
    int input = 0;
    srand((unsigned int)time(NULL));
    do
    {
        menu();
        printf("请选择游戏是否开始:");
        scanf("%d", &input);
        switch (input)
        {
        case 0:
            printf("游戏结束\n"); break;
        case 1:
            
            game(); break;
        default:
            printf("输入错误,请重新选择\n"); break;
        }
    } while (input);
    return 0;
}  
© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号