详解猜数字游戏—分支与循环应用实例

前言

        很多同学在学习C语言过程中都会产生一个疑惑,课程听了,代码自己也跟着敲过几遍了,但还是感觉脑袋轻轻的,闭上眼一股脑就忘干净了,根本不知道该如何检验自己是否掌没掌握。同学如果确实是有这种症状,就请跟着我的思路学一下猜数字游戏,学完后试着按照自己的思路自己实践一下,或许能帮你打消一知半解的这种焦虑。另外,如果说你真能自己写出来,那么就表示你对分支与循环这章的内容有个八到九成的理解了。


猜数字游戏

游戏介绍

        猜数字游戏的规则是电脑从数字1~100之间自动生成一个随机数后,玩家通过键盘输入对该数字进行猜测,如果猜对则游戏胜利,如果猜错电脑会给用户以反馈,即猜大了或者猜小了,玩家再以电脑提示为基准再次进行猜测,直到得出正确答案。

游戏设计思路

1.搭建游戏基本框架;

2.生成1~100(包括边界)之间的随机数;

3.将用户输入的数字与随机生成的数字进行比较,并及时反馈给玩家;


一 搭建游戏框架(菜单)
(i)何为游戏框架

       音乐、动画、图片、运行程序等共同组成游戏功能的结构被称为游戏框架。在我们打开任意一款游戏时首先看到的是一个菜单界面,在界面上能看到游戏CG以及游戏设置以及开始结束等选项,同时也能听到响起的音乐,这些都是组成游戏框架的一部分,在进入游戏后运行一系列程序也都是游戏的框架。可以说,游戏的基本框架决定着游戏的玩法以及游戏的风格等。

(ii)如何搭建游戏框架

        该过程主要体现在主函数内部的运行逻辑,主要分为两步。第一步,按照一般游戏逻辑我们首先在屏幕上打印菜单,供玩家选择开始或者退出,这一步比较简单,此处直接以代码形式给大家提供参考,不详细展开说明。

void menu()
{
    printf("********************************\n");
	printf("*********** 1.play *************\n");
	printf("*********** 0.exit *************\n");
	printf("********************************\n");
}

        第二步,玩家选择结束后,对选择结果进行指定操作,即进入游戏或退出。首先我们可以先设一个变量select用于存储玩家输入的信息,并匹配到对应的操作。这时候我们又会出现另外一个问题,就是如何将玩家输入的信息与对应的程序或语句相匹配。分支语句中的switch语句可以将整形常量值为基准执行特定case值底下的语句。因此我们可以用switch语句来对应不同的操作,用代码实现如下所示。

int main() 
{	
	menu();

    int select = 0;
	printf("请选择:>");
	scanf("%d", &select);

	switch (select)
	{
	case 1:
		printf("已进入游戏\n");
		game();
		break;
	case 0:
		printf("已退出游戏\n");
		break;
	default:
		printf("输入错误,请输入0或1\n");
	}
}

至此,我们的游戏框架已经基本搭建完毕,随时准备开始游戏!


二 游戏程序的实现
(a)如何生成1~100之间的随机数(重点)

        要想实现“猜数字”就必须要有随机数,生成随机数就比较麻烦,下面我们逐一讲解生成随机数所需要的函数及其使用方法;

1.rand()函数

        rand()函数是C语言标准库中提供用于生成伪随机数的函数,其返回值为int类型,rand函数被包括在stdlib.h头文件内。标准形式如 int rand(void);需要注意的是:rand函数所生成的随机数是通过算法计算出来的,并不是真正的随机数,这种随机数被称为伪随机数。伪随机数的值由种子控制,如果想要得到不同的就必须时刻改变种子的值,以达到近似随机。有关rand函数的具体信息请自行查看下面网址rand - C++ Reference (cplusplus.com)

         rand函数返回值的范围是0~RAND_MAX(32767)​​​​​​

        如果想要获得1~100之间的随机数就要将rand()%100+1,接着将处理后的返回值赋值给ret即可

拓展:如果想要获得a~b之间的随机数,可以用rand()%(b-a+1)+a 进行变换。

2.srand()函数

        前面说到rand()函数生成的随机数是伪随机的,且随机数的值由种子来决定,种子不同,生成的随机数就不同,所以时刻改变种子的初始值就成了问题。C语言库函数就提供了srand()函数来初始化种子的值,其函数形式为 void srand (unsigned int seed) 被包含在头文件stdlib.h中;其中种子值为unsigned int类型的数据,当未明确输入种子值时,种子默认为1。因此通过改变种子的初始值,就能得到不同的伪随机值,使用起来就这样        srand(2)        srand(100)其中种子值分别被初始化为2和100,当用rand函数生成随机数时二者出现的数字都是不一样的。至此,我们问题就转变为如何获得时刻变化的种子。

3.time()函数

        time函数是C语言获取当前时间的函数。我们知道,时间是时刻变化的,因此将时间包装为种子,这样就能得到时刻得到变化的种子。time函数的表示形式为time_t time(time_t* timer),同时该函数使用时需要包含头文件time.h。另外,time函数会返回一个time_t类型的时间戳,(时间戳是指当前时间与1970年1月1日之间秒数的差值),而参数表示指向类型为 time_t 的对象的指针,用来存储 timer 的值。在该游戏中,不需要存储timer的值,只需要time函数返回一个时刻变化的值来改变种子的初始值即可,因此在参数中输入NULL即可。需要注意,因为time函数的返回值类型是time_t类型的数据,而srand函数需要的参数是unsigned int类型的数据,因此在使用time函数获得种子时应强制类型转换为unsigned int类型。

获取随机值

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

int ret = rand()%100 + 1;//获取1~100之间的随机值

(b)建立判断模型

     运用if语句将用户输入的数字与生成的随机数进行对比,对比后再给用户反馈。代码形式如下:

while(count)
{
    scanf("%d",&input);//获取用户的输入
    count--;//count代表游戏的机会

    if(input > ret)
    {
        printf("猜大了,请重新输入:>\n");
    }
    else if(input < ret)
    {
        printf("猜小了,请重新输入:>\n");
    }
    else
    {
        printf("恭喜你猜对了,随机数是:>%d\n",ret);
        break;
    }
}

至此,游戏函数介绍完毕,接着直接看一遍游戏函数全貌。

void main()
{
    srand((unsigned int)time(NULL));
    int ret = rand()%100 + 1;
    int count = 8;//初始化游戏机会
    
    while(count)
    {
        scanf("%d",&input);
        count--;
        if(count == 0) //用于判断游戏机会
            printf("很遗憾,游戏机会已用尽\n");
        if(input > ret)
        {    
            printf("猜大了,请重新输入:>\n");
        }
        else if(input < ret)
        {
            printf("猜小了,请重新输入:>\n");
        }
        else
        {
            printf("恭喜你猜对了,随机数是:>%d\n",ret);
            break;
        }
    }
}

结语

        以上就是猜数字游戏的所有内容了,希望对大家有用,当然这也只是最基础的版本,你也可以根据需求自行调整。如果你觉得本文对你还有点用处,希望能留下小小的赞。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值