【方法】猜数字游戏程序的实现

    • 代码实现

#include<stdio.h>
#include<string.h>
#include<math.h>
#include<stdlib.h>
#include<time.h>
#include<windows.h>
void menu()
{
    printf("\t\t\t\t\t***********************************\n");
    printf("\t\t\t\t\t************1.开始游戏*************\n");
    printf("\t\t\t\t\t************2.结束游戏*************\n");
    printf("\t\t\t\t\t***********************************\n");
    Sleep(500);
    printf("\t\t\t\t\t请输入你的选择:");

}

void game()
{
    system("cls");
    int b, c, t;
    printf("\t\t\t\t\t********Let's go!**********\n");
    printf("\t\t\t\t\t********Let's go!**********\n");
    printf("\t\t\t\t\t********Let's go!**********\n");
    printf("\t\t\t\t\t********Let's go!**********\n");
    printf("\t\t\t\t\t********Let's go!**********\n");
    printf("\t\t\t\t\t********Let's go!**********\n");
    printf("\t\t\t\t\t********Let's go!**********\n");
    Sleep(1000);
    printf("\t\t\t\t\t数字在1~100之间,来,试试看!\n");
    Sleep(2000);
    system("cls");
    
    b = rand() % 100 + 1;
    while (1)
    {
        printf("请输入:");
        scanf_s("%d", &t);
        if (t > b)
        {
            printf("猜大了\n");
        }
        else if (t < b)
        {
            printf("猜小了\n");
        }
        else
        {
            printf("哇,你猜对了!\n");
            printf("数字是%d\n", b);
            break;
        }
    }
    
    Sleep(3000);
    system("cls");
    printf("是否再来一局?(1 or 2):");
    scanf_s("%d", &c);
    if (c == 1)
    {
        system("cls");
        printf("加载中");
        printf("...");
        Sleep(800);
        system("cls");
        game();
    }
    if (c == 2)
    {
        printf("下次再见啦\n");
        system("pause");
    }
}

int main()
{
    unsigned char a;
    srand((int unsigned)time(NULL));
    menu();
    scanf_s("%c", &a,1);
    system("cls");
    while (a !='1' && a != '2')
    {
        printf("您输入的选择无效,请重新输入:");
        scanf_s("%c", &a,1);
    }
    switch (a)
    {
    case '1':
        game();
        break;
    case '2':
        printf("下次再见啦");
        break;
    }
    return 0;
}
    • 方法详解

随机数生成部分

猜数字游戏的核心在于运用rand和srand函数生成的随机数达到目的,其他的主菜单等不过是对于程序进行的修饰,提升观感。我们先来看看随机数的生成。

随机数的生成需要用到rand,srand,time函数,运用MSDN可以知道使用rand和srand需要设置头文件stdlib.h

设置完毕后我们发现,似乎rand本身就可以生成随机数,也就是说,当我们打印如下代码:

#include "stdio.h"
#include "stdlib.h"
int main()
{
    int ret = rand();
    while (scanf("%d",&b))
    { printf ("%d",ret);}
    return 0;
}

输出结果可以得知rand会产生0——rand_max(即32767)之间的随机数,但是,当我们下一次该代码时我们会发现,第二次运行和第一次运行产生的随机数相同,那游戏就变成了一次性游戏,没得玩了,所以我们要用到srand,在调用rand之前为伪随机数生成器种子

那我们就调用他试试

#include "stdio.h"
#include "stdlib.h"
int main()
{
    srand(1);
    int ret = rand();
    while (scanf("%d",&b))
    { printf ("%d",ret);}
    return 0;
}

运行后发现,输出的数成为了一个数循环,如果srand里的数值发生改变,rand输出的值也会改变,也就是说,如果srand调用值是随机的,那么rand的值就是随机的,可是我们又要用srand让rand随机,生成随机数需要随机数,这里似乎陷入了一个死循环,没关系,试想一下,srand需要一个变化的值,那么什么是变化的呢?没错,时间是变化的!我们只需要在srand里调用时间,就可以达到生成随机数的目的,也就是说,调用时间戳到srand函数使他让rand函数产生随机数!因此,我们可以用到time函数:

显然,time函数需要使用time.h的头文件,他可以返回一个时间戳,time函数的运用需要指针,但是我们在这里并不需要,因此,我们可以写time(NULL),同时我们发现,srand的使用是需要一个unsigned int的值,可是time不是啊?没关系,我们强制转换一下,写成:srand((unsigned int)time(NULL)),到此为止,我们设置了一个随机数的生成器,接下来,让我们生成随机数:

#include "stdio.h"
#include "stdlib.h"
#include"time.h"
int main()
{
    srand((unsigned int)time(NULL));
    int ret = rand();
    while (scanf("%d",&b))
    { printf ("%d",ret);}
    return 0;
}

运行后发现,我们已经可以正常生成随机数了,这里有个小知识点:随机数生成器(即srand)只需要设置一次,如果设置多次,比如套进循环,会出现错误:如果我们的输入频率过快,也就是说设置生成器的频率过快,会出现每次输出的随机数大小相近甚至相等的情况,因此,我们只需要也只能设置一次随机数生成器!

随机数已经可以生成了,那怎么设定他的范围呢?我们可以通过对rand函数取余数来达到效果。比如:我想让他生成1——100的随机数,我们可以让rand模100,即int ret = rand()%100;我们可以得到0——99的余数,我们再加个1,就得到了1——100的随机数:

#include "stdio.h"
#include "stdlib.h"
#include"time.h"
int main()
{
    srand((unsigned int)time(NULL));
    int ret = rand()%100+1;
    while (scanf("%d",&b))
    { printf ("%d",ret);}
    return 0;
}

到此,随机数部分我们写完了,接下来是猜数字的部分。

猜数字部分

while (1)
    {
        printf("请输入:");
        scanf_s("%d", &t);
        if (t > b)
        {
            printf("猜大了\n");
        }
        else if (t < b)
        {
            printf("猜小了\n");
        }
        else
        {
            printf("哇,你猜对了!\n");
            printf("数字是%d\n", b);
            break;
        }
    }

代码在这自己看

猜数字部分其实很简单,说白了就是一个循环套个判断,我们输入数字,用if语句对我们输入的数字进行判断,如果输入的数字比随机生成数大,那么打印“猜大了”,如果小了便打印“猜小了”,如果猜对了,便输出数字顺便鼓励。

当然了,不可能只输入一次吧?所以我们可以用while循环,讲条件设定为无限循环,如果猜对了就break结束,没猜对就继续猜。

修饰部分

修饰部分主要指的是对于主菜单,提示话语,是否再来一次等这些小细节的处理和编译。

这个部分会用到Sleep函数和system("cls");清屏指令,这里对system()和清屏函数不做过多介绍,只需要知道system("cls");可以清除当前会话框中的全部内容即可。Sleep函数在这里主要用于界面美观,他可以做到延时输出

 system("cls");
        printf("加载中");
        printf("...");
        Sleep(800);
        system("cls");
        game();

在这一段中,我们先清空屏幕,然后打印加载中,我们给Sleep函数设置了800毫秒的延时,使上面的“。。。”可以以每800毫秒的速度打印,达到了美观性,之后再次清屏,调用game函数以进行下一轮游戏的输出。而关于主菜单和游戏之间,主要运用自定义函数的调用。

    • 总结

猜数字游戏程序的主要难点其实在于如何生成随机数,其实利用rand可以做到生成随机验证码,但博主仍是代码苦手所以。。剩下的修饰部分只需要运用好sleep和cls就可以,不过值得注意的是当我们在使用选择语句进行函数调用,需要清楚自己的变量和调用的函数是否需要用到这边的变量,对于不同函数之间的数据处理应该小心。

最后

祝您生活愉快,再见!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值