先给上代码:(加sleep函数纯粹为了好玩)
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <Windows.h>
void menu()
{
printf("*************************************************************\n");
printf("******************* 开始(请输入1)****************************\n");
printf("******************* 退出(请输入0)****************************\n");
printf("*************************************************************\n");
}
//rand的函数16进制代码:0x7fff,说明rand给出的随机数是0~32767(转换为十进制)
void game()
{
int ret = 0;//1.生成一个随机数
//拿时间戳来设置随机数的生成起始点
//time_t
//问题:计算机只能生成伪随机数,即离散型随机数,所以我们应当找到一个随时都在变化的量
//这个量就是时间戳
ret = rand()%100+1;
Sleep(500);
printf("随机数已生成完毕\n");
int guess;//1.生成一个随机数,1至100
//printf("%d\n", ret);
//2.猜数字:
Sleep(500);
while (1)
{
printf("请猜数字:");
scanf("%d", &guess);
if (guess > ret)
{
Sleep(500);
printf("猜大了\n");
}
else if (guess < ret)
{
Sleep(500);
printf("猜小了\n");
}
else
{
Sleep(500);
printf("恭喜你,猜对了\n");
break;
}
}
}
int main()
{
int input = 0;
srand((unsigned int)time(NULL));//放在主函数里面防止频繁调用
menu();
printf("请选择:");
scanf("%d", &input);
do {
switch (input)
{
case 1:
game();//游戏本体
break;
case 0:
break;
default:
printf("出现错误,请重新选择\n");
break;
}
} while (input);
return 0;
}
这个猜数字小游戏代码的整体逻辑是较简单的:
1:设置游戏开始项
2:设置一个随机数
3:用户开始猜数
4:简单的while+if语句完成游戏主过程
但重点是第二步:我们如何让电脑生成随机数?
首先想到的是rand函数,这个函数可以在默认0~32767范围内生成随机数,
但这种随机数严格意义上来说并不是真正完全随机的数,而是伪随机数
rand的函数16进制代码:0x7fff,说明rand给出的随机数是0~32767(转换为十进制)
要想创造在短时间内使正常人无法探测到的循环规律,那就可以引入一个随时可以变化的量,来使rand函数变化规律无法被轻易观测;
这里就引入了时间戳:表示距离时间(1970-1-1, 00:00:00)的秒数(在Linux系统下)
时间戳是一直在不断改变的量
要想使用时间戳,我们要调用一个库函数srand:
void srand(unsigned int seed)
seed是种子
在这里只给出最简单的写法:srand((unsigned int)time(NULL))
并将srand函数放在主函数里面调用:防止srand仅根据时间顺序改变。
最后,C语言实现猜数字小游戏的核心其实是随机数的生成
如有错误或者更好的方法,欢迎在评论区指出。