这篇不属于编程之旅系列,但因为某些个人原因,所以先提前写。并且这个主题会出现我很感兴趣的恶作剧环节,所以先插进一篇与正常进度不同的博客。等这篇博客写完,会恢复正常进度。
1、猜数字游戏
函数rand可以生成随机数
rand函数的使⽤需要包含⼀个头文件是:stdlib.h
如果要生成五个随机数,如下:
#
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函数是对⼀个叫“种子”的基准值进行运算生成的随机数,多次运算下,所谓的随机值是不变的,因为种子未变。所以,如果想生成真正的时刻变化的随机数,就需要变化的种子,这里可以用时间time。
(程序中在调用 rand 函数之前也可以先调用 srand 函数,然后通过 srand 函数的参数来设置rand函数生成随机数的时候的种子,种子在变化,每次生成的随机数也就变化。但这又造成了矛盾,因为在生成随机数之前,我们需要先提供一个随机数,这与原想法相悖。)
而时间时刻变化,所以可以用时间作为种子。
time函数需要包含头文件time.h,并需要用到时间戳,time函数返回当前的日历时间的这个时间差叫做时间戳。
time(
NULL
);
//
调⽤
time
函数返回时间戳,这⾥没有接收返回值
NULL是一种指针。
//
因为
srand
的参数是
unsigned int
类型,我们将
time
函数的返回值强制类型转换
srand((
unsigned int
)time(
NULL
));
如下图
#
include
<stdio.h>
#
include
<stdlib.h>
#
include
<time.h>
int
main
()
{
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
;
}
不过这还不够好玩,可以写另一个更好玩的代码,猜数字游戏。
如下:
void game()
{
int r = rand() % 100 + 1;
int guess = 0;
while (1)
{
printf("请猜数字:>");
scanf("%d", &guess);
if (guess > r)
printf("猜大了");
else if (guess < r)
printf("猜小了");
else
{
printf("猜对了");
break;
}
}
}
int main()
{
int a = 0;
srand((unsigned int)time(NULL));
do
{
printf("****************\n");
printf("**** 1, play****\n");
printf("**** 0, exit****\n");
printf("****************\n");
printf("请选择:>");
scanf("%d", &a);
switch (a)
{
case 1:
//printf("猜数字游戏\n");
game();
break;
case 0:
printf("退出游戏\n");
break;
default:
printf("选错重选\n");
break;
}
} while (a);
return 0;
}
{
int r = rand() % 100 + 1;
int guess = 0;
while (1)
{
printf("请猜数字:>");
scanf("%d", &guess);
if (guess > r)
printf("猜大了");
else if (guess < r)
printf("猜小了");
else
{
printf("猜对了");
break;
}
}
}
int main()
{
int a = 0;
srand((unsigned int)time(NULL));
do
{
printf("****************\n");
printf("**** 1, play****\n");
printf("**** 0, exit****\n");
printf("****************\n");
printf("请选择:>");
scanf("%d", &a);
switch (a)
{
case 1:
//printf("猜数字游戏\n");
game();
break;
case 0:
printf("退出游戏\n");
break;
default:
printf("选错重选\n");
break;
}
} while (a);
return 0;
}
最后是我喜欢的关机游戏,也就是可以用来做恶作剧的游戏。
运行程序,就提示:一分钟内关机,如果能输入:**********......(随便怎么损人都可以),就取消关机。
首先得输入一段话吓唬人
printf("请注意,你的计算机将在一分钟后关机,如果输入:我爱喜羊羊,就取消关机\n");
电脑中有一个命令叫“shutdown”(此命令我只试过window系统,其他的不清楚。)
shutdown -s叫设置关机,shutdown -s -t指设置时间关机,shutdown -s -t -60是设置60秒关机。
shutdown -a是取消关机。
两个字符串的比较不能使用==,而应该使用strcmp函数。
strcmp 如果判断两个字符串的内容相同,则返回0。且此函数需要包含头文件<string.h>。
system是系统的意思,此库函数专门用于执行系统命令,需要包含的头文件是<stdlib.h>。
如下图
其实还可以将猜数字游戏与关机游戏结合,组成更好玩的猜数字惩罚游戏。
但是请记住,游戏不要玩的太过火了,适可而止。
尤其不要设置死循环机制的关机游戏,极容易翻车。