C语言实现猜数字游戏

今天,跟大家分享如何使用C语言来创造一个有趣的猜数字小游戏,本人使用的程序软件是VS2010。

猜数字游戏游戏的具体逻辑:由电脑生成一个随机值,然后供玩家去猜这个数字,猜大了,系统提示猜大了,猜小了,系统提示猜小了,猜对了提示祝贺词。

首先,当你执行这个游戏的时候,最开始会至少进入一次游戏界面,进入界面后提供一份游戏菜单供玩家进行选择(开始游戏、退出游戏等),而游戏既然分有选项,那就可以使用switch分支来将不同的选项分成不同的情况,这就是游戏开始框架的设计思路

代码实现如下:

#include 

void menu()//菜单建立
{
    printf("*******************\n");
    printf("***1.play 2.exit***\n");
    printf("*******************\n");
}

int main()
{
    int select = 0;
do//这里使用do-while是因为游戏进入就需要进行提示,至少执行一次
    {
        menu();//建立一个菜单函数,为游戏提供选项
        printf("请选择是否进行游戏\n");
        scanf("%d",&select);//接收选项
        switch(select)//分支
        {
        case 1://如果选择1
            game();//进行游戏,在game()中建立游戏逻辑
            break;
        case 2:
            printf("退出游戏\n");//如果选择2
            break;
        default://如果输入其他
            printf("输入错误,请重新输入\n");
            break;
        }

    }while(select != 2);//当用户选择了2时,就跳出主循环,结束游戏

    return 0;
}

其中game()就是存放我们要设计的猜数字游戏本体的函数。

关于游戏本体的设计,我们可以在游戏的设计规则方面来获取游戏的设计思路:

由电脑生成一个随机值,然后供玩家去猜这个数字,猜大了,系统提示猜大了,猜小了,系统提示猜小了,猜对了提示祝贺词。

我们可以分成两个部分去设计,1.获得随机值 2.猜数字

如何生成一个随机数?当你没有尝试过生成随机数的时候会不会觉得随机数的生成是一件非常简单的事情很简单呢?接下来看看我是如何让电脑生成随机值的。

生成随机数,需要使用到rand()函数

rand()是库函数,作用是生成一个随机数,该数为int类型,范围在0-RAND_MAX之间。RAND_MAX=0x7FFF=32767

rand()函数如果单独使用,每次运行程序输出的随机数都会在同一个数开始,达不到真正的随机

单独使用rand()函数运行两次,两次运行得到一样的答案(如图):

C语言实现猜数字游戏_第1张图片

如何实现真正的随机呢?真正的随机需要使用到另外两个知识点:srand()函数和时间戳

其实在C语言的函数说明中,rand()函数一般需要搭配srand()函数一起使用。

srand()是库函数,作用是提供一个随机的起点

这里的srand()函数括号里面,需要提供一个unsigned int类型的随机数,但我们设计的游戏本身本来就需要获得一个随机数,所以需要获取随机数,我们可以使用系统给予的随机数—时间戳。

关于时间戳的概念,三言两语是不好解释的,需要仔细了解的小伙伴可以自行百度,这里大概的解释一下时间戳的概念,时间戳就是 当前计算机的时间-计算机的起始时间(1970.1.1.0:0:0) = (xxxx)秒其中xxxx就是当前的时间戳,当前的计算机时间是持续增加的,所以系统得到的时间戳是随机化的。

在C语言中,可以通过time函数来获取时间戳。

通过time来获取时间戳,实现数的真正随机化。

time函数的整体为 time_t time(time* timer)。

其中time_t是类型,是time函数的默认类型,写成定义方式(int i的写法)即time_t time

time()的括号里面需要存放一个time* timer指针。

srand()函数里面需要存放一个unsigned int类型的数,但time_t属于long类型,所以我们需要通过强制类型转换将,将long转换成unsigned int,即(unsigned int)time,把long类型进行强制转换,将long变为符合srand()函数使用的类型。

最后time(time* time)需要存放一个指针,但我们这里不需要使用指针,所以我们在()里面存放一个NULL(空)指针。这样,使用rand()、srand()和时间戳就可以生成一个随机值了(如下)。

int ret = 0;//用于接收随机值
ret = rand();//生成随机数
srand((unsigned int)time(NULL));//生成随机起点

这里的rand()取值范围太大,范围在0-32767,我们可以将这个范围缩小至适合进行猜数字游戏的范围。

还有这里的srand((unsigned int)time(NULL)),这是一个起点,所以我们最好不要放在存放游戏本体的函数里面,因为如果输入答案太快,起点还没有产生变化,将会导致短时间内答案是同一个值,所以时间起点我们生成一次就好了,后面获取的值会不断变化,将时间起点放在进入游戏之前是最好的选择。

#include 
#include//rand()、srand()函数都需要该头文件
#include//time()函数需要该头文件

void menu()//菜单建立
{
    printf("*******************\n");
    printf("***1.play 2.exit***\n");
    printf("*******************\n");

}

void game()//游戏逻辑设计
{
    //生成随机数
    int ret = 0;//定义一个数用来存放随机数(游戏的真正答案)
    ret = rand()%100+1;//因为随机数太大了,这里的rand()%100+1是把随机数的范围调整成0-100(0-32767模100的余数在0-99之间(32767%100=67,9999%100=99)),所以还要+1
    //猜数字

}

int main()
{
    int select = 0;
    srand((unsigned int)time(NULL));//在do-while循环外面先建立好一个srand()随机起点,该随机起点随时间变化,然后在游戏里面rand()就可以通过该起点的变化生成随机不同的数

    do//这里使用do-while是因为游戏进入就需要进行提示,至少执行一次
    {
        menu();//建立一个菜单函数,为游戏提供选项
        printf("请选择是否进行游戏\n");
        scanf("%d",&select);//接收选项
        switch(select)//分支
        {
        case 1://如果选择1
            game();//进行游戏,在game()中建立游戏逻辑
            break;
        case 2:
            printf("退出游戏\n");//如果选择2
            break;
        default://如果输入其他
            printf("输入错误,请重新输入\n");
            break;
        }

    }while(select != 2);//当用户选择了2时,就跳出主循环,结束游戏

    return 0;
}

这里再提示一下,在do-while循环外面建立srand()的好处是,每次进入游戏产生的起点都不同,避免随机数在短时间内生成相同的数字

知道了这些生成随机数的概念,我们再来整理剩下的逻辑,玩家去猜这个数字,猜大了,系统提示猜大了,猜小了,系统提示猜小了,猜对了提示祝贺词。

这又是一个分支语句,这次我们用if-else就可以实现它,到这里就变得很简单了,这里增加一些趣味性,我们可以把供玩家猜答案的次数也设置一下。

最后总体的代码实现如下

#include 
#include//rand()、srand()函数都需要该头文件
#include//time()函数需要该头文件

void menu()//菜单建立
{
    printf("*******************\n");
    printf("***1.play 2.exit***\n");
    printf("*******************\n");

}

void game()//游戏逻辑设计
{
    //生成随机数
    int ret = 0;//定义一个数用来存放随机数(游戏的真正答案)
    ret = rand()%100+1;//因为随机数太大了,这里的rand()%100+1是把随机数的范围调整成0-100(0-32767模100的余数在0-99之间(32767%100=67,9999%100=99)),所以还要+1
   
    //猜数字
    int i = 0;
    int guess = 0; //定义一个数存放玩家的答案
   
    printf("请输入你的答案\n");
    
    while(i<5)//给予玩家五次机会
    {
        scanf("%d",&guess);//接收玩家的答案,放在while循环内接收,可以让玩家答错之后继续答题
        if(guess>ret)
        {
            printf("猜大了\n");
            i++;
            printf("你还有%d次机会\n",5-i);
        }
        else if(guess

最终运行结果如下(本人将答案打印,方便观察结果):

C语言实现猜数字游戏_第2张图片

源代码本人放在git上,可自取:https://github.com/lixianlon/Guess-Nembers-Game

你可能感兴趣的:(c语言,游戏,开发语言)