0、总结
掌握C语言的基础语法,可以实现一些有趣的东西。比如:
写一个猜数字游戏
游戏要求:
1、电脑自动生成1~100的随机数。
2、玩家猜数字,猜数字的过程中,根据猜测数字的大小给出大了或小了的反馈,直到猜对,游戏结束。
1、随机数生成
1、rand:随机数
完成猜数字游戏之前,需要实现随机数。
在C语言中,有一个函数rand
,头文件stdlib.h
,可以实现生成随机数。函数原型如下:
int rand(void);
rand
函数会返回一个伪随机数,这个随机数范围是0~RAND_MAX
之间,RAND_MAX
的大小是依赖编译器上实现的,大部分的编译器是32767
。
例1:产生5个随机数
#include <stdio.h>
#include <stdlib.h>
int main()
{
printf("%d\n", rand());
printf("%d\n", rand());
printf("%d\n", rand());
printf("%d\n", rand());
printf("%d\n", rand());
return 0;
}
对比运行几次的结果,可以发现无论运行多少次,产生的随机数和第一次运行的结果是一样。
rand
函数生成的随机数是伪随机,是通过算法生成的随机数,真随机是无法预测下一个值是多少。而rand
函数基于一个种子的基准值进行生成的随机数,只要种子不变,每次运行程序,产生的随机数是一样的。如果要让每次运行生成的随机数是不同的,就需要让种子变化。
2、srand:种子
C语言提供了一个函数srand
,用来初始化随机数生成器,srand
的原型如下:
void srand(unsigned int seed);
程序调用
rand
函数之前,先调用srand
函数,通过srand
函数的参数seed
来设置rand
函数生成随机数的时候的种子,只要种子在变化,每次生成的随机数序列也就变化了。可以通俗的想象,把算法(随机数生成器)看作一个黑盒,把准备好的种子扔到黑盒里,黑盒会给你随机数。如果这个种子不变,无论扔多少次,给的随机数始终不变。把新的种子扔黑盒里,会得到新的随机数。
目前而言,为了让rand
生成随机数,在生成随机数的时候srand
函数的参数seed
又需要一个随机数,这就矛盾了。但仔细思考,参数seed
能做到不断变化即可。
什么东西可以时时刻刻变化呢?不难想到,时间。
3、time:时间
C语言提供了一个函数time
,头文件time.h
,就可以得到时间,time
函数原型如下:
time_t time(time_t* timer)
time
函数会返回当前的日历时间的差值,具体是返回1970年1月1日0时0分0秒
到现在程序运行时间之间的差值,单位是秒。返回类型是time_t
,time_t
类型本质上是32位或者64位的整型类型。
time
函数的参数timer
,如果是非NULL的指针
,会把返回的差值放在timer指向的内存中带回去。如果是NULL
,只返回这个时间的差值,这个差值称之为时间戳。
例2:返回非NULL的time函数
#include <stdio.h>
#include <time.h>
int main() {
time_t a = 0;
time_t* pa = &a;
printf("%d\n", time(pa));
}
例3:返回时间戳
#include <stdio.h>
#include <time.h>
int main()
{
printf("%d\n", time(NULL));
return 0;
}
例4:生成随机数,保证每次运行的随机数是不一样
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main()
{
// seed(种子):time(NULL)
// srand的参数是unsigned int类型,需要对time函数的返回值进行强制类型转换
srand((unsigned int)time(NULL));
printf("%d\n", rand());
printf("%d\n", rand());
printf("%d\n", rand());
printf("%d\n", rand());
printf("%d\n", rand());
return 0;
}
值得一提,
srand
函数是不需要频繁调用,一次运行的程序中调用一次就够了。
只要保证rand
函数调用srand
函数的参数seed
是有变化的即可。
4、指定随机数的范围
1、如果要生成0~99之间的随机数,如下:
// 余数的范围是0~99
rand() % 100
2、如果要生成1~100之间的随机数,如下:
// 对余数范围0~99的数字加1
// 范围是1~100
rand() % 100 + 1
3、如果要生成100~200的随机数,如下:
// 对余数的范围0~100的数字加100
// 范围是100~200
100 + rand() % (200 - 100 + 1)
4、对以上归纳总结,如果要生成a~b的随机数,如下:
a + rand() % (b - a + 1)
2、猜数字游戏实现
1、代码1.0
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void menu()
{
printf("***********************\n");
printf("***** 1、开始游戏 *****\n");
printf("***** 0、退出游戏 *****\n");
printf("***********************\n");
}
void game()
{
int guess = 0;
int r = rand() % 100 + 1;
printf("猜一个数字,范围1~100\n");
while (1)
{
printf("请猜数字:>");
scanf("%d", &guess);
if (guess < r) {
printf("猜小了\n");
}
else if (guess > r)
{
printf("猜大了\n");
}
else
{
printf("猜对了\n");
break;
}
}
}
int main()
{
srand((unsigned int)time(NULL));
int input = 0;
do
{
menu();
printf("请选择:>");
scanf("%d", &input);
switch (input) {
case 1:
game();
break;
case 0:
printf("游戏结束\n");
break;
default:
printf("输入错误,重新输入数字\n");
break;
}
} while (input);
return 0;
}
2、代码2.0
可对game
函数进行改造,比如次数限制、没猜对最后告诉随机数,增加游戏的乐趣。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void menu()
{
printf("***********************\n");
printf("***** 1、开始游戏 *****\n");
printf("***** 0、退出游戏 *****\n");
printf("***********************\n");
}
void game()
{
int guess = 0;
int r = rand() % 100 + 1;
printf("猜一个数字,范围1~100\n");
int count = 5;
while (count)
{
printf("你还有%d机会\n", count);
printf("请猜数字:>");
scanf("%d", &guess);
if (guess < r) {
printf("猜小了\n");
}
else if (guess > r)
{
printf("猜大了\n");
}
else
{
printf("猜对了\n");
break;
}
count--;
}
if (count == 0)
{
printf("你失败了,正确值是%d\n", r);
}
}
int main()
{
srand((unsigned int)time(NULL));
int input = 0;
do
{
menu();
printf("请选择:>");
scanf("%d", &input);
switch (input) {
case 1:
game();
break;
case 0:
printf("游戏结束\n");
break;
default:
printf("输入错误,重新输入数字\n");
break;
}
} while (input);
return 0;
}
完。