目录
游戏要求
1.电脑自动产生1~100之间的随机数;
2.玩家输入所猜的数字;
3.根据猜测数字的大小给;出反馈
4.一共设置5次猜数机会,次数耗尽前猜出数字则胜利,反之则失败。
游戏设计步骤
初始界面
首先需要设计一个登录界面,提示玩家游戏加载完成。并且这个界面可以多次打印(至少一次),所以需要使用 do while 循环。
#include <stdio.h>
void menu()
{
printf("************************\n");
printf("****** 1. play *******\n");
printf("****** 0. exit *******\n");
printf("************************\n");
}
int main()
{
do
{
menu();
}while ()
return 0;
}
接着玩家会选择是否进入游戏,使用 switch 即可。当输入1时,玩家同意游戏,加载后续界面;当输入0时,玩家拒绝游戏,退出游戏;当玩家输入其他字符时,提示玩家输入错误。代码如下:
int main()
{
int input;
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;
}
生成随机数
想要完成这个游戏,首先得产生随机数,那么该如何产生呢?
rand 介绍
C语言提供了一个可以产生随机数的函数 rand ,产生的随机数的范围在 0~RAND_MAX 之间。RAND_MAX的大小是依赖编译器上实现的,大部分编译器上都是 32767 。rand 函数的使用需要包含一个头文件:stdlib.h 。
注意:rand 函数产生的是伪随机数。rand()函数是依靠一个叫做seed种子的初始值来生成随机数的,既然依靠种子,那只要每次给的种子都不同,生成的随机数就不会是相同的,如果不设置,种子默认为1,从而生成的随机数就会一样。
那么就需要找到一个可变的种子,这样就能保证每次生成的随机数都不一样。
所以什么东西适合作为种子?
时间戳介绍
Unix 时间戳是从1970年1月1日(UTC/GMT的午夜)开始所经过的秒数。换句话说,时间戳是不断变化的且不相等的。
所以,时间戳就可以作为种子使用。
time介绍
在C语言中,time 函数就能获得时间戳,time 函数原型如下:
time_t time (time_t* timer);
函数返回的类型是 time_t 类型,time_t 类型的本质就是32或64位的整型类型。
time 函数的参数 timer 如果是非NULL的指针的话,函数也会将这个返回的差值放在timer指向的内存中带回去。如果timer是NULL,就只返回这个时间的差值。
srand介绍
C语言提供了一个函数 srand ,用于初始化随机数的生成器。其原型如下:
void srand (unsigned int seed);
程序在调用 rand 函数之前要先调用 srand 函数,通过 srand 函数的参数 seed 来设置 rand 函数生成随机数的种子。
在了解了这些概念后,我们可以开始生成随机数。代码如下:
int main()
{
int input = 0;
srand((unsigned int)time(NULL));
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;
玩家猜数字并判断大小,告知结果
一共设置了5次猜数机会,玩家需要不断猜数直至胜利或次数耗尽失败,这便是需要的两种循环。一是玩家胜利后跳出循环,二是次数耗尽跳出循环。代码如下:
void game()
{
int ret = rand() % 100 + 1;//生成随机数1~100
//n % 100 余数的取值范围为 0~99
int guess = 0;
int count = 5;
while (count)
{
printf("请猜数字:>");
scanf("%d", &guess);
if (guess < ret)
{
printf("猜小了\n");
}
else if (guess > ret)
{
printf("猜大了\n");
}
else
{
printf("恭喜你,猜对了\n");
break;
}
count--;
}
if (count == 0)
{
printf("猜失败了,正确的数字是:%d\n", ret);
}
}
最终代码
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void menu()
{
printf("************************\n");
printf("****** 1. play *******\n");
printf("****** 0. exit *******\n");
printf("************************\n");
}
void game()
{
int ret = rand() % 100 + 1;
int guess = 0;
int count = 5;
while (count)
{
printf("请猜数字:>");
scanf("%d", &guess);
if (guess < ret)
{
printf("猜小了\n");
}
else if (guess > ret)
{
printf("猜大了\n");
}
else
{
printf("恭喜你,猜对了\n");
break;
}
count--;
}
if (count == 0)
{
printf("猜失败了,正确的数字是:%d\n", ret);
}
}
int main()
{
int input = 0;
srand((unsigned int)time(NULL));
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;
}