猜数字小游戏的实现

设计一个猜数字的小游戏

  1. 首先利用do……while循环做一个菜单目录
void menu()

{

    printf("*************************************\n");

    printf("************    1.play    ***********\n");

    printf("************    0.exit    ***********\n");

    printf("*************************************\n");



}

int main()

{



    int i = 0;

    do

    {

         menu();

         printf("请选择:>");

         scanf("%d", &i);

         switch (i)

         {

         case 1:

             game();

             break;

         case 0://这里只能是选择0;其他非0的数字如果选了,底下的while逻辑跳不出去。

             printf("退出游戏\n");

             break;

         defult:

             printf("输入错误,请重新输入\n");

             break;

         }

    } while (i);

    return 0;

}

下面就是game函数的使用

void game()

{

    int guess = 0;

    //1.要生成一个随机数

    int ret = rand() % 100 + 1;

    //printf("%d\n", ret);

    //2.猜数字



    while (1)

    {

         printf("请猜数字;>");

         scanf("%d", &guess);

         if (guess < ret)

         {

             printf("猜小了\n");

         }

         else if (guess > ret)

         {

             printf("猜大了\n");

         }

         else

         {

             printf("恭喜你猜对了\n");

             break;

         }

    }

}

要生成随机数要利用rand函数跟srand函数,下面是关于函数的详细介绍

#include<stdlib.h>//这个是rand跟srand函数的头文件

rand函数返回的最大值为32767(10进制),默认返回的随机数的范围为0——32767

函数返回从 0 到 RAND _ MAX 的伪随机整数。在调用 rand 之前,使用 srand 函数生成伪随机数生成器的种子。

Remarks

The srand function sets the starting point for generating a series of pseudorandom integers. To reinitialize the generator, use 1 as the seed argument. Any other value for seed sets the generator to a random starting point. rand retrieves the pseudorandom numbers that are generated. Calling rand before any call to srand generates the same sequence as calling srand with seed passed as 1.

备注

srand 函数设置生成一系列伪随机整数的起点。要重新初始化生成器,请使用 1 作为种子参数。任何其他的种子值都会将生成器设置为随机的起始点。Rand 检索生成的伪随机数。在任何 sr and 调用之前调用 rand 生成的序列与使用种子传递为 1 的 srand 相同。

当输入srand输入100,我们发现每次的值固定在三位数,但是每次都是一样的,但是第二次输入200发现值又变化了,但是还是一样的,所以只要给srand传一个随机数进去那rand会返回一个随机数给你,即我们只需给srand传一个一直在变化的值就行。我们电脑上的时间时刻都发生变化,这里我们就引出时间戳的概念。时间戳简单来说就是这个时间相较于计算机的起始时间之间的一个差值,单位是秒,计算机的起始时间是     1970-1-1-0:00

怎么获得?c语言提供了一个函数time,返回一个时间戳

Time_t转到定义可以看出返回是是int型,而srand函数正好需要的是unsigned int型,所以我们只需要给srand函数传一个time函数,time函数返回的是time_t,,所以我们给time函数强制转换一下就行srand((unsigned int)time());time函数的头文件是time.h,我们不需要将time函数返回的值存起来就使用空指针NULL存入即可。srand((unsignedint)time(NULL));

这是就产生了不同的值,但是如果快速按两个1的话输出的值我们发现还是一样的,此时还有一点问题

随机数的生成确实是在rand函数之前要调用srand,但是这个srand不需要频繁调用,我们只需要在程序运行的时候调用一次就行,如果频繁的设置这个起点,那么这个数就不够随机,解决的方法将srand函数放在main主函数中就行,开始一次游戏调用一次就行,此时就非常随机了,无论快速按还是,都是随机的数。

这时就给了我们一个思路,我们如果想生成随机数首先我们要调用rand生成我们的随机数,rand使用之前调用我们的srand,但rand的范围是0-32767,srand的调用要使用time的时间戳,srand只要调用一次就行。但是范围太大,我们要控制到1-100;我们给rand生成的随机值%(取模)100,任何一个数字%100之后得到的值只可能是0-99,之后再加1就得到了1-100的数字

这是完整代码的实现

#include<stdio.h>

#include<time.h>

#include<stdlib.h>

void menu()

{

    printf("*************************************\n");

    printf("************    1.play    ***********\n");

    printf("************    0.exit    ***********\n");

    printf("*************************************\n");



}





//猜数字游戏的实现

void game()

{

    int guess = 0;

    //1.要生成一个随机数

    int ret = rand()%100+1;

    //printf("%d\n", ret);

    //2.猜数字

   

    while (1)

    {

         printf("请猜数字;>");

         scanf("%d", &guess);

         if (guess < ret)

         {

             printf("猜小了\n");

         }

         else if (guess > ret)

         {

             printf("猜大了\n");

         }

         else

         {

             printf("恭喜你猜对了\n");

             break;

         }

    }

}

int main()

{

    srand((unsigned int)time(NULL));

    int i = 0;

    do

    {

         menu();

         printf("请选择:>");

         scanf("%d", &i);

         switch (i)

         {

         case 1:

             game();

             break;

         case 0://这里只能是选择0;其他非0的数字如果选了,底下的while逻辑跳不出去。

             printf("退出游戏\n");

             break;

         defult:

             printf("输入错误,请重新输入\n");

             break;

         }

    } while (i);

    return 0;

}

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

-Taco-

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值