游戏菜单设定
采用input作为while判定条件的逻辑:input为1时,则可以一直进入循环进行菜单内容选择;input为0时,则while判定条件为假,正好退出游戏,程序结束;input为其他值时,while判定结果为真,正好也可以继续进入循环,然后重新选择
随机数的生成
-
有关rand()函数和srand()函数
rand( )函数:
- 通过某种算法,生成伪随机数(不够随机)
- 生成的随机数范围:0-RAND_MAX(32767)
- rand函数在生成随机数之前,要使用srand函数设置随机数的生成器
srand( )函数:
- ()内的种子数确定后,最后生成的数也就确定了
- 要想数是随机的,则应让( )内的种子是随机的
此时陷入了矛盾:为了生成一个随机数,我需要一个随机数放在srand()里。
这时我们可以想,时间是时刻变化的,因此我们可以通过使用时间的方式来生成随机数
-
C语言中时间函数
运行结果:
原因:由于srand()函数在读取菜单的时候都会调用一次,会导致生成的随机数非常接近(参考时间函数中时间戳的解释)
解决:
由于游戏是生成1~100内的随机数,所以我们对变量ch进行调整,一个数%100可以获得0~99的数
所以我们+1,最终可获得1~100的数
运行结果
进行猜数字
-
代码逻辑
-
限制次数(优化程序)
完整代码
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
//猜数字游戏实现
//电脑随机产生一个1~100之间的数字
#include <stdlib.h>//srand函数所需头文件
#include <time.h>//time函数所需头文件
void menu( )
{
printf("*****************************\n");
printf("**********1. play************\n");
printf("**********0. exit ************\n");
printf("*****************************\n");
}
//rand( )函数:通过某种算法,生成伪随机数(不够随机)
// 生成的随机数范围:0-RAND_MAX(32767)
// rand函数在生成随机数之前,要使用srand函数设置随机数的生成器
//srand( )括号内的种子数确定后,最后生成的数也就确定了,
//要想是随机的,则应让( )内的种子是随机的
void game( )
{
//1.生成随机数
//时间是随时变化的
//time()函数的返回类型是time_t,而srand()函数的返回类型是unsigned int,故需要强制类型转换一下
//time函数可以返回一个时间戳
//srand((unsigned int)time(NULL));放在这里会让生成的随机数很接近就不够随机
int ch = rand()%100+1;//保证生成的随机数在1~100之间
//后面为了玩游戏只需要调动rand()函数就可以了
//printf("%d\n", ch);
//2.进行猜数字
int input2 = 0;
int i = 0;
while (i<3)
{
printf("请开始猜数字:> ");
scanf("%d", &input2);
if (input2 < ch)
printf("猜小了\n");
else if (input2 > ch)
printf("猜大了\n");
else
{
printf("恭喜你,猜对了!\n");
break;
}
i++;
}
if (i == 3)
printf("欧呦,没猜中哦~\n");
}
int main( )
{
int input = 0;
srand((unsigned int)time(NULL));//放在这里,调用一次就好了
do
{
menu( );
printf("请选择:>");
scanf("%d", &input);
switch (input)
{
case 1:
printf("开始猜数字\n");
game( );
break;
case 0:
printf("退出游戏\n");
break;
default :
printf("选择错误,重新选择 \n");
break;
}
}while(input);
return 0;
}
总结:以上是我对代码的一些整理及理解,希望能帮助到大家