C语⾔实现1到100简单猜数字游戏
猜数字游戏就是系统随机⽣成⼀个数字,我们来猜的游戏。
这⾥我们约定 1表⽰玩游戏,0表⽰退出游戏。
那么怎么才能让系统随机⽣成⼀个数字呢?这⾥我们想到⼀个函数:rand()函数。
通过查阅MSDN软件我们可以看到rand()函数是⼀个返回值为int型的⽆参函数 ,⽽其返回的是0到RAND_MAX的⼀个随机整数。那么RAND_MAX是多⼤呢?
在编程软件如VS2013中查看RAND_MAX的定义我们可以看到其是⼀个⼗六进制数
将0x7fff通过程序员计数器转化为⼗进制得32767
那么此时我们知道rand()函数返回的是0到32767的⼀个随机整数。此时系统随机⽣成数字的难题解决了。可是会发现该函数返回的整数可以⼤到上万,⽆疑猜数字的时候会有很⼤困难。
为了让猜数字游戏变得简单有趣,我们可以让其产⽣0到100的随机数。那么怎么才能让rand()函数产⽣0到100的随机整数呢?
可以发现让rand()函数直接产⽣0到100的整数是不可能的。⼜因为任何⼀个数除以100的余数总是在0到99之间,所以只要让rand()的返回值模上100,便可随机产⽣0到100的整数。
此时通过下述代码将系统⽣成的随机整数打印出来我们可以发现,⽣成的整数确实是随机的。但是当再⼀次运⾏程序的时候,我们会惊讶地发现此次运⾏程序所⽣成的随机数跟上⼀次运⾏程序所⽣成的随机数⼀模⼀样。这是为什么呢?
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdlib.h>
#include <stdio.h>
void menu()
{
printf("********************************\n");
printf("********** 1. play ***********\n"); //输⼊1,表⽰玩游戏
printf("********** 0. exit ***********\n"); //输⼊0,表⽰退出游戏
printf("********************************\n");
}
int main()
{
int input = 0;
do{
menu(); //打印菜单
printf("请选择:");
scanf("%d", &input);
int ret = rand() % 100;
switch (input)
{
case 1:
printf("%d\n", ret); //打印⽣成的随机整数
break;
case 0:
printf("退出游戏\n");
break;
default:
printf("输⼊错误,请重新输⼊\n");
break;
}
} while (input);
system("pause");
return 0;
}
这是因为在调⽤rand()函数前,我们并没有设置随机⽣成的开始点。所以在调⽤rand()函数前,我们应该使⽤srand()函数设置随机⽣成数的开始点。
那么srand()函数⼜是什么函数呢?
再次查阅MSDN软件我们可以知道srand()函数是⼀个⽆返回值的参数为⽆符号整数的⼀个函数,其作⽤就是设置⼀个随机数的开始点。那么只要该函数的参数在变化,便可达到⽣成随机数的效果。
所以现在需要做的就是给srand()函数传⼀个时刻在变化的参数。我们发现电脑上的时间⼀直在改变,⽤它作为该函数的参数刚好合适。那么此时⼜引出了⼀个时间函数--->time()函数
可以发现time()函数是⼀个返回值为time_t类型的参数为指针类型的函数,其作⽤就是返回系统时间。
那么time_t类型⼜是什么类型呢?再次将其转到定义我们可以发现time_t是⼀个__time64_t类型,⽽__time64_t⼜是⼀个整型。
所以time()函数返回的是当前程序执⾏时的时间点与计算机起始时间(1970年1⽉1⽇零时零分零秒)之间的差值。将该差值作为srand()函数的参数时需要将其强转成unsigned int类型。此时由于我们只关⼼time()函数的返回值,⽽并不在意其参数,所以可以将time()函数的参数设置为⼀个空指针(NULL)。
到这⾥我们便可以调⽤srand()函数和rand()函数了。
srand((unsigned int)time(NULL)); //设置随机⽣成数的开始点
rand()%100; //⽣成随机数
但是此时如果执⾏下述代码我们会发现,其实⽣成的随机数并不是那么随机。
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
void menu()
{
printf("********************************\n");
printf("********** 1. play ***********\n");
printf("********** 0. exit ***********\n");
printf("********************************\n");
}
int main()
{
int input = 0;
do{
menu();
printf("请选择:");
c语言游戏编程题经典100例scanf("%d", &input);
srand((unsigned int)time(NULL));
int ret = rand() % 100;
switch (input)
{
case 1:
printf("%d\n", ret);
break;
case 0:
printf("退出游戏\n");
break;
default:
printf("输⼊错误,请重新输⼊\n");
break;
}
} while (input);
system("pause");
return 0;
}
这是因为每玩⼀次游戏都会重新设置⼀次随机⽣成起点,导致每次⽣成的起点都很接近。如果在程序执⾏时只设置⼀次随机⽣成起点,此时⽣成的随机数便会更随机。所以将srand()函数放在do{}while();循环之前便可实现。具体实现代码如下:
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论