分支和循环(下)------简单猜数字游戏的实现

本文介绍了如何使用C语言实现猜数字游戏,涉及rand函数生成伪随机数、srand函数设置随机数种子、time函数获取时间戳以确保种子变化,以及如何规定随机数范围。通过time和求余操作,实现1~100之间的随机数生成。

  猜数字游戏就是程序给出一个数但不告诉你,我们需要去猜,根据我们给出的答案,程序还能够告诉我们是猜对了还是猜错了,是猜大了还是猜小了。今天我们就要用简单C语言来实现一个猜数字游戏。

  因为是猜数字游戏,所以需要的数字是随机的,如果想生成随机数字,我们就需要用到以下几个函数。

1.rand函数

这个函数的原型是:

int rand (void);

引用这个函数需要包含头文件stdlib.h

  这个函数会返回一个大小在0~RAND_MAX之间的整数,这个RAND_MAX的大小取决于编译器,不同的编译器大小可能会有所不同,大部分的编译器中RAND_MAX的值是32767。

  以下是其随机数的生成结果。

  

 但这个函数返回的数是伪随机数,并不是真正的随机数。什么意思呢?让我们把上方的代码再次运行一次看看,如下

  是不是发现运行的结果和第一次运行的结果是相同的,这时我们就很奇怪了,我们不是要实现猜数字游戏吗,那如果每次生成的数字一样,那这个游戏只能玩一次了。

  伪随机数不是真正的随机数,伪随机数是通过某种算法得出来的随机数,而rand函数是对一个叫“种子”的基准值进行运算生成的随机数。之所以上面的程序每次的结果一样,是因为rand函数生成随机数的默认种子是1,如果想要生成不同的随机数,就要让种子是变化的。

  于是我们就需要用到另一个函数srand

2.srand

这个函数的原型是:

void srand (unsigned int seed);

引用这个函数需要包含头文件stdlib.h

  srand函数是用来初始化随机数的生成器的,程序中在调用rand函数前先调用srand函数,通过srand函数的参数seed来设置rand函数生成随机数的时候的种子,只要种子在变化,rand函数每次生成的随机数也就变化起来了。

  但我们是为了生成一个随机数,可是现在我们又需要srand函数中的参数seed是随机变化的,这就变得冲突矛盾了。

  这时候就要引入第三个函数time了。

3.时间戳

  在介绍time函数之前,我们先要了解一下什么是时间戳

  时间戳是指格林威治时间1970年01月01日00时00分00秒(即北京时间1970年01月01日08时00分00秒)起至现在的总秒数。

4.time

这个函数的原型是:

time_t time (time_t* timer);

引用这个函数的时候需要包含头文件time.h

  time函数会返回当前的日历时间,其实返回的是1970年1月1日0时0分0秒到现在运行时间之间的差值,单位是秒。返回的类型是time_t类型的,time_t类型本质上是32位或者64位的整型类型。

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

  如果timer是NULL,就会返回这个时间的差值。time函数返回的这个时间差就是”时间戳“。

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

  因为时间是会时刻变化的,所以我们就可以把time函数所返回的时间戳当作seed的值。

   现在让我们写一段代码看看是否能生成随机数:

大家可以看到,我将这段代码运行了两次,所出现的结果是不一样的,因此我们实现了随机数的生成。

5.如何规定生成随机数的范围

  因为rand函数生成的随机数范围是在0~RAND_MAX之间的(RAND_MAX的值在大部分编译器上是32767),这个范围太大了,我们很难猜到随机数,这时候我们就可以利用求取来规定范围了

这里我们可以利用一些方法生成a~b的随机数

6.猜数字游戏的实现

  知道了以上3个函数rand、srand、time后我们知道了如何生成随机数,使用求余的方法我们又可以规定生成的随机数的范围,知道了这些后我们就可以写一个代码来实现猜数字游戏了(猜1~100之间的随机数)。以下是我写的代码,大家可以参考一下。

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<time.h>

void menu()
{
    printf("********************\n");
    printf("**** 1:开始游戏 ****\n");
    printf("**** 0:退出游戏 ****\n");
    printf("********************\n");
    printf("请选择1或0:\n");
}

void game()
{
    int r = rand() % 100 + 1;
    int guess = 0;
    int count = 10;//一共有count次猜数字的机会
    printf("你一共有 %d 次机会来猜数字,数字范围在1~100之间\n",count);
    while (count)
    {
        scanf("%d", &guess);
        if (guess > r)
            printf("猜大了,请再猜一次\n");
        else if (guess < r)
            printf("猜小了,请再猜一次\n");
        else
        {
            printf("恭喜你,猜对了\n");
            break;
        }
        count--;
        printf("你还有 %d 次机会猜数字\n",count);
    }
}
int main()
{
    srand((unsigned int)time(NULL));
    int input = 0;
    do
    {
        menu();
        scanf("%d", &input);
        switch (input)
        {
        case 1:
            game();
            break;
        case 0:
            printf("游戏结束\n");
            break;
        default:
            printf("输入错误,请输入1或0\n");
        }
    } while (input);
    return 0;
}

以下是这个游戏的实际效果:

感谢大家的阅读,如果感兴趣的话可以给博主来个三连,谢谢~

### 三、JavaScript 实现 1 到 10 猜数字游戏 使用 JavaScript 开发一个简单的 1 到 10 猜数字游戏,可以通过 `Math.random()` 生成随机整数,并结合 `while` 循环实现持续猜测功能。游戏的核心逻辑包括生成随机数、获取用户输入、比较输入值与目标值,并根据比较结果提示用户继续猜测,直到猜中为止。 以下是一个完整的实现示例: ```javascript function getRandom(min, max) { return Math.floor(Math.random() * (max - min + 1)) + min; } var random = getRandom(1, 10); while (true) { var num = prompt('请输入 1 到 10 之间您猜的数字:'); if (num > random) { alert('猜大了'); } else if (num < random) { alert('猜小了'); } else { alert('恭喜你,猜对了!正确数字是 ' + random); break; } } ``` 该代码首先定义了一个 `getRandom` 函数,用于生成指定范围内的随机整数。然后通过 `while(true)` 构建一个无限循环,不断提示用户输入猜测值,并使用 `if-else if-else` 多分支结构判断用户输入是否大于、小于或等于目标值,直到用户猜中后通过 `break` 退出循环[^5]。 ### 三、优化与扩展 为了提升用户体验代码可维护性,可以将猜数字逻辑封装为独立函数,便于在多个地方调用。例如,通过递归调用函数替代 `while` 循环结构,实现更清晰的控制流程: ```javascript let times = 0; let getNumber = Math.floor(Math.random() * 10) + 1; function numberIs() { if (times >= 10) { alert("10次机会用完了,正确数字是 " + getNumber); return; } let guess = prompt("请输入1 - 10之间的数字"); if (guess == getNumber) { alert("猜对了"); return; } else if (guess < getNumber) { alert("猜小了"); } else { alert("猜大了"); } times++; numberIs(); } numberIs(); ``` 该实现通过函数递归调用替代传统的 `while` 循环结构,限制最多猜测 10 次,并在每次猜测后更新提示信息。这种封装方式不仅使代码更简洁,也增强了可读性可复用性[^2]。 ### 三、结合 HTML 的实现方式 如果希望在网页中运行该游戏,可以结合 HTML 提供用户交互界面。例如: ```html <!DOCTYPE html> <html> <head> <title>猜数字游戏</title> </head> <body> <script> function getRandom(min, max) { return Math.floor(Math.random() * (max - min + 1)) + min; } var random = getRandom(1, 10); while (true) { var num = prompt('请输入 1 到 10 之间您猜的数字:'); if (num > random) { alert('猜大了'); } else if (num < random) { alert('猜小了'); } else { alert('恭喜你,猜对了!正确数字是 ' + random); break; } } </script> </body> </html> ``` 该 HTML 页面中嵌入了 JavaScript 代码,用户通过浏览器弹出的 `prompt` 输入猜测值,程序根据输入值与目标值的比较结果给出提示,直到用户猜中为止[^5]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值