C语言---分支与循环(下)——猜数字

写一个猜数字游戏

我们可以想想写出这个游戏需要什么?

首先是不是要随机生成数字。

然后玩家进行猜游戏,当猜错了,我们需要提醒玩家猜大了还是猜小了。

当然我们还可以加上猜的次数,次数多了游戏失败。

一.随机数的生成

1.rand函数

c语言给我们提供了一个函数,这个函数可以随机为我们提供一些数字。

这是函数的原型

rand函数的头文件:stdlib.h

这是rand函数的介绍

rand函数的功能就是返回一个伪随机整形(0-RAND_MAX) RAND_MAX在大部分编译器上是32767.

那么什么是伪随机数呢。

在这上面这串代码中,生成的随机数是41.可为什么是伪随机的呢。

我们再次运行上面这串代码我们会发现生成的数字还是41,故这不是真正的的随机数,所以被称为一种伪随机数。

伪随机数不是真正的随机数,是通过算法生成的随机数。

真正的随机数是无法预测的,

我们需要对rand函数进一步了解。

rand函数是对一个叫种子的基准值进行运算生成的随机数。

之所以每次运行的产生的随机数是一样的,那是因为rand函数随机数产生的默认种子是1,也就是()中数字为1

要得到不同的随机数,就是要让种子是变化的。

2.srand函数

这句话的意思是     在调用rand之前,使用srand函数为伪随机数生成器设定种子。

即在使用rand函数前,需要使用srand函数。

srand函数原型        

而我们在使用srand函数时,我们要通过srand函数的参数seed来设置rand函数生成随机数的时候的种子,只要种子在变化,每次生成的随机数就开始变化了。

也就是说如果srand的种子如果是随机的,rand就能生成随机数了;

但是我们回过头来想一想,在生成一个随机数,我们需要一个随机数,那么这就矛盾了。

所以我们需要用到下一个函数。

3.time函数

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

那么time这个函数就可以获得这个时间。

time这个函数的原型:

time这个函数会返回1970年1⽉1⽇0时0分0秒到现在程序运⾏时间之间的

差值,单位是秒。
time函数的参数 timer 如果是⾮NULL的指针的话,函数也会将这个返回的差值放在timer指向的内存 中带回去。
如果 timer 是NULL,就只返回这个时间的差值。
time函数返回的这个时间差也被叫做:时间戳。

time函数需要包含的头文件:time.h

那么我们生成随机数的代码可以这样写:

我们可以发现两次运行结果不一样了,故达到了真正随机的效果。

注:在使用srand函数时是不要频繁调用的,只需要写一次就够了。

4.随机数的范围

在玩游戏的过程中,我们肯定不能在一个很大的范围中进行猜数字;所以我们就需要设置随机数的生成范围

1.生成0-99的随机数

余数是0-99;

2.生成0-100的随机数

3.生成a-b的随机数

生成a-b的随机数,首先我们生成0到b-a的数,即余数需要是0到b-a,故rand()%(b-a+1)

在加上a的时候,就可以生成a-b的随机数。

二,游戏实现

首先,我们根据上述内容写出所需要的头文件。

一款游戏需要很多东西,不仅仅是游戏功能上我们需要写,还有游戏菜单,游戏胜利失败界面等等。

我们可以做一个简单的游戏菜单界面。比如:

menu()

为了使我们可以反复进行游戏,不会使程序退出,我们可以加入循环。

因为后面涉及到了选择,所以我们加入switch语句

game()

当用户选择1时,进行游戏所以我们要写一个函数来进行游戏,我们把这个函数命名为game()

当玩家猜的数字不对时,我们要提醒玩家,猜大了还是猜小了,所以我们又要用到循环,

主函数:

当然我们还可以加上猜数字的次数限制,如果5次猜不出来,就算失败.

这个问题就交给读者自己了,我写的这个肯定不完美,也可以自行进行修改和补充。

游戏源码:

#define _CRT_SECURE_NO_WARNINGS 
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
void menu()
{
    printf("******************************\n");
    printf("*****1.进入游戏***************\n");
    printf("*****2.设置(敬请期待)********\n");
    printf("*****3.退出游戏***************\n");
    printf("******************************\n");
}
void game()
{

    int randomnumber = rand() % 100 + 1;
    int guessnumber = 0;

    while (1)
    {
        printf("请猜数字:");
        scanf("%d", &guessnumber);
        if (guessnumber == randomnumber)
        {
            printf("恭喜你,猜对了\n");
            break;
        }
        else if(guessnumber > randomnumber)
        {
            printf("猜大了\n");
        }
        else
        {
            printf("猜小了\n");
        }
    }
}
int main()
{
    int input = 0;//
    srand((unsigned int)time(NULL));
    do
    {
        menu();
        printf("请选择:\n");
        scanf("%d", &input);//接受玩家的输入
        switch (input)
        {
        case 1:
            system("cls");//清屏,避免字太多了
            game();
            break;
        case 2:
            printf("设置未完成,敬请期待!\n");
            goto jieshu; 
        case 3:
            printf("已退出!\n");
            goto jieshu;
        default:
            printf("请输入恰达选项!\n");
            break;
        }
    } while (input);

    jieshu:
    return 0;
}

点个赞,丘丘了!!!

  • 26
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值