游戏要求:
printf("******************\n");
printf("*****1.猜字游戏***\n");
printf("*****0.退出*******\n");
printf("******************\n");
可以将菜单封装起来(meau())然后使用switch语句;
switch (i)
{
case 1:
game();
break;
case 0:
printf("退出\n");
break;
default:
printf("输入有误\n");
break;
}
因为该菜单至少要执行一次(即运行代码就要自动执行一次),因此使用do...while循环,完成框架;
do {
meau();
printf("请选择:>");
scanf("%d", &i);
switch (i)
{
case 1:
game();
break;
case 0:
printf("退出\n");
break;
default:
printf("输入有误\n");
break;
}
}
while (i);
meau()函数中封装的就是菜单页面,直接引用就行;
game()函数中封装游戏中主要代码;
想要解决游戏代码问题,需要先解决随机数问题,首先C语言中提供了rand()函数,该函数是随机生成一个伪随机数的.....(具体在个人的gitee仓库2023-10-22中讲过rand、srand以及time函数)first: 学习C语言的终极版本——第一个仓库(first) (gitee.com)
srand((unsigned int)time(NULL));为rand()函数确定一个“种子”,由于srand参数类型是unsigned int而time的返回值是time_t,因此使用了强制类型转换;
解决随机生成的数字问题,剩下的问题就可以轻松化解了,代码如下:
void game() {
int ret = rand()%100+1;
int guess = 0;
while (count)
{
printf("请猜数字>:");
scanf("%d", &guess);
if (guess > ret) {
printf("猜大了\n");
}
else if (guess < ret) {
printf("猜小了\n");
}
else{
printf("猜对了\n");
break;
}
}
}
因此,便完成该有趣的小游戏,下面来总结一下重点:
(1)srand((unsigned int)time(NULL));这句代码的位置,是放在main函数里面呢,还是game里面呢;这也是一个易错点,大家可以通过自己运行代码感受一下,如果放在game函数里面,每次生成的随机数ret会非常相近,而且如果手速很快,生成的甚至可能是一样的数。这是因为如果放在game函数中,每次循环都会调用game函数,因此会每次都重新赋一次种子,每次没有必要的,我们只需要给rand函数赋一次种子即可,因此将该代码放在main函数中,在gam函数中直接调用rand函数就行;
(2)添加猜数的次数(增加游戏的趣味性);
大家可以想一想怎么在源代码上修改可以添加该功能;代码如下:
void game() {
int ret = rand()%100+1;
int guess = 0;
int count = 5;
//printf("%d", ret);
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", ret);
}
}
(3)随机数范围;rand的范围是0~RAND_MAX;
该游戏中要求的是0~100,怎么解决的呢,ret%100(任何数%100,都在0~99,因为+1,范围就就变成了0~100);同理得ret%(200-100+1);即可得到规律,ret%(b-a+1),范围是a~b;
易错点:
do...while循环中的while的循环条件是i(即为输入的数字),大家可以进行思考一下.....