大家好!今天来设计一个猜数字游戏!!!
一、前言
对于猜数字游戏,印象让我最深的是小时候在商店里猜价格,猜的最准便可以获得奖品,当时是胡乱猜的,没有任何技巧,不过现在有二分法就很简便了,自己也可以设计之后玩一玩,我上瘾了😊
二、创建菜单
首先对于猜数字游戏来说,一个游戏的界面是不可少的,开始游戏还是退出游戏,这是很重要的,就像这样:
void menu()//我们可以在main函数中调用这个函数
{
printf(" 1. play \n");
printf(" 0. exit \n");
}
那么设计完菜单后就要进行选择玩还是不玩?通常进入游戏时首先进入的是游戏菜单界面,不管玩还是不玩,所以这里用到do while语句。
int main()
{
int input = 0;
do
{
//这里input放到do while之外是因为while中要判断input的条件
//输入1开始游戏,输入0退出游戏,放到do while语句中的话
//input被初始化为0,while中的条件不符合,不会执行的,
//而且我们要输入input值
menu();
printf("请选择:");
scanf("%d", &input);
} while (input);
return 0;
}
这个是时候输入1的话,要进入游戏,输入0退出游戏,输入其它的话进行报错,所以这里用switch语句来执行。
switch (input)
{
case 1:
game();
//这里调用一个游戏函数,待会会在后面提到,慢慢理解。
break;
case 0:
printf("退出游戏");
break;
default:
//这里要说明输入其它的数时报错!!!
printf("给你机会你也不中用啊!!!(😜)");
break;
//不要忘记加上break!!!
}
然后基本上菜单就完毕了,展示代码:
void menu()
{
printf(" 1. play \n");
printf(" 0. exit \n");
}
int main()
{
int input = 0;
do
{
menu();
printf("请选择:");
scanf("%d", &input);
switch (input)
{
case 1:
game();
break;
case 0:
printf("退出游戏");
break;
default:
printf("给你机会你也不中用啊!!!");
break;
}
} while (input);
return 0;
}
//建议:设计游戏或者项目时,最好先写一部分代码停下来,调试一下,出现错误
//也很好解决,要不然全部写完去调试会有点麻烦。
三、设计随机数
既然菜单设计完了,开始设计随机数了。随机数怎么设置呢?这里用到一个库函数:rand
上面的意思是产生一个伪随机数,并不是真的随机数,引用的头文件为<stdlib.h>,并且还是整型类型。
返回的值是是一个伪随机数,没有错误返回,那么就可以用一个变量接收rand的返回值了。
void game()
//创建一个game函数,作为游戏执行的部分
{
int ret = rand();//rand函数,记住要引头文件,这里不展示了。
printf("%d", ret);//我们可以先看看会产生什么随机数?
//让我们运行一下
}
确实产生了不一样的数,但是如果再运行一下呢?
还是一样的,所以这就是伪随机数。
此时要使用到库函数:srand和时间戳(随机种子)。
就是将一堆数字转换成对应的年月日。
意思:放置一个随机的初始数,无类型,里面是无定义的int 类型加上种子,这个库函数是没有返回值的。
srand与rand有什么区别吗?
定义RAND_MAX为0x7fff,这个是上限最大的数,转换成10进制为32767,rand会检测srand的值,进而设计随机数。
时间戳:
意思:得到系统的时间,头文件为<time.h>
在过去的时间返回这个时间,没有错误返回。
在srand中放上一个随机种子,使得rand检测srand的值在变,随机数也在变,不会相等。
所以,代码如下:
void game()
{//time中放个NULL就行,NULL代表0
srand((unsigned int) time(NULL));
int ret = rand();
printf("%d\n", ret);
//接下来可以运行了
}
可以看到,虽然产生了随机数,但是都很接近,并且有的还一模一样。这是因为每一次执行game()函数时,都让srand函数回到起点,不是接着上次继续下去,所以把它放到main函数中就行了,因为main函数只执行一次。
放到main函数中就产生了完全不一样的数了,这样很好!但是,我们猜数字难道猜几万的吗?那样还不如买彩票去,我们只要1~100就行了,如何让随机数在1 ~ 100呢?
思考思考,一个数除以100,它的余数是不是在0 ~ 99之间?对啊,那么我们可以模100加1,是不是1 ~ 100呢?实在精妙啊!!!
int ret = rand() % 100 + 1;//修改这样再运行一下
是不是非常好?好,设计随机数完成了,最后的如何去猜呢?看下面:
四、猜数字
随机数设计完了,那么开始猜数字了。我们首先输入一个数,判断猜大了还是猜小了,可以分三种情况:猜大了,猜小了,猜对了。
void game()
{
int num = 0;
int ret = rand() % 100 + 1;
//基本的框架就是这样,我们可以用到一个while循环
while(1)
{
printf("请猜数字:");
scanf("%d", &num);
if (num < ret)
{
printf("猜小了\n");
}
else if (num > ret)
{
printf("猜大了\n");
}
else
{//猜对的时候跳出循环
printf("猜对了\n");
break;
}
}
}
五、总体测试
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int num = 0;
void game()
{
int num = 0;
int ret = rand() % 100 + 1;
while (1)
{
printf("请猜数字:");
scanf("%d", &num);
if (num < ret)
{
printf("猜小了\n");
}
else if (num > ret)
{
printf("猜大了\n");
}
else
{
printf("猜对了\n");
break;
}
}
}
void menu()
{
printf(" 1. play \n");
printf(" 0. exit \n");
}
int main()
{
int input = 0;
srand((unsigned int) time(NULL));
do
{
menu();
printf("请选择:");
scanf("%d", &input);
switch (input)
{
case 1:
game();
break;
case 0:
printf("退出游戏");
break;
default:
printf("给你机会你也不中用啊!!!");
break;
}
} while (input);
return 0;
}
程序正确的运行了。但是,这样看的话有点冗杂,我们可以稍微改进一点:再while循环中加一个Sleep和system
void game()
{
int num = 0;
int ret = rand() % 100 + 1;
while (1)
{
printf("请猜数字:");
scanf("%d", &num);
if (num < ret)
{
printf("猜小了\n");
}
else if (num > ret)
{
printf("猜大了\n");
}
else
{
printf("猜对了\n");
break;
}
Sleep(500);
system("cls");
}
}
关于Sleep与system的介绍我之前讲过,可以看看:
http://t.csdn.cn/hD0fM
六、结语
希望对你有所帮助!!!^ _ ^
好问则裕,自用则小。
----------《尚书正义·卷八·仲虺之诰》