掌握了基本的循环嵌套语句我们就可以尝试自己写出一个猜数字小游戏了。
游戏背景
让计算机为我们生成一个随机数,将我们猜出的数字与此随机数比较从而一步步缩小范围,最终猜出此数字。
代码思路
1.先写出整体循环框架:打印菜单选择玩游戏或退出。
2.在玩家选择玩游戏后则执行程序——生成随机数,玩家输入数字与随机数比较,此过程须循环进行不断与随机数比较大小。
3.玩家猜中后停止循环,再次打印菜单。若须增加游戏难度可设置次数限制。
详细过程
1.函数主体
首先我们要让游戏可以多次玩就得选择一个循环语句,那我们说do while循环有一个特点就是上来就干,就正好符合我们的需要。
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;
}
这里还运用到switch函数。选择1那就开始执行游戏程序,选择0则视为退出游戏,停止循环。若输入错误可用default提示。
2.生成随机数
C语言提供了一个函数rand,这个函数是可以生成随机数的。函数原型如下:
int rand(void);
使用此函数须包含的一个头文件是:stdlib.h
但是这个函数是基于种子生成的伪随机数,种子默认为1,这时每次游戏生成的数都会是同一个,达不到随机的效果。
因此我们还须使用一个srand函数,原型如下:
void srand (unsigned int seed);
我们在使用rand函数前先调用srand函数,通过srand函数的参数seed设置rand生成时的种子,让种子随机,那生成的数也就随机了。
这里我们还要调用time函数,使用时须包含头文件:time.h
原型如下:
time_t time (time_t* timer);
因为时间是不断变化的,我们只须让time函数返回时间戳,如下所示:
time(NULL);
此刻我们就可以生成随机数了
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main()
{
srand((unsigned int)time(NULL));
printf("%d\n", rand());
return 0;
}
3.完善游戏程序
若想让程序看上去更加简洁,使用void函数即可。将菜单和游戏程序放到函数主体外面,需要时引用。
void menu()
{
printf("*************************\n");
printf("*******1.play ********\n");
printf("*******0.exit ********\n");
printf("*************************\n");
printf("*************************\n");
}
void game()
{
int r = rand() % 100 + 1;
int guess = 0;
while (1)
{
printf("请猜数字:");
scanf("%d", &guess);
if (r > guess)
{
printf("猜小了\n");
}
else if (r < guess)
{
printf("猜大了\n");
}
else {
printf("恭喜你,猜对了");
break;//猜对即可跳出循环
}
}
}
那最后的游戏过程编写就比较简单了。因为rand函数生成的随机数范围是0-32767(大部分编译器),那我们只需要将这个数%100(范围是0-99),再+1,即rand()%%100+1,那么生成的随机数范围就是1-100之间了。
具体比较大小判断过程使用while循环就可实现。
如果想增加一点游戏难度可以加上次数限制。具体如下
void game()//游戏程序
{
int count = 0;
int r = rand() % 100 + 1;
int guess = 0;
printf("请猜一个数:");
while (1)
{
scanf("%d", &guess);
if (r < guess)
{
printf("猜大了");
count++;
if (5 - count > 0) //加这层if语句若机会用光则可以不显示剩余机会
{
printf("\n你还有%d次机会:", 5 - count);
}
}
else if (r > guess)
{
printf("猜小了");
count++;
if (5 - count > 0)
{
printf("\n你还有%d次机会:", 5 - count);
}
}
else
{
printf("恭喜你,猜对啦!!\n");
break;
}
if (count == 5)
{
printf("机会用光啦!\n");
break;
}
}
}
用count来记录猜的次数,每次未猜中时count+1,累积达到五次后会显示游戏失败,跳出循环。
最终代码
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>//头文件
#include<time.h>
void menu()//菜单
{
printf("*********************\n");
printf("*********************\n");
printf("*****1.开始游戏******\n");
printf("*****0.退出游戏******\n");
printf("*********************\n");
printf("*********************\n");
printf("共有5次机会哦\n");
}
void game()//游戏程序
{
int count = 0;
int r = rand() % 100 + 1;
int guess = 0;
printf("请猜一个数:");
while (1)
{
scanf("%d", &guess);
if (r < guess)
{
printf("猜大了");
count++;
if (5 - count > 0) //加这层循环若机会用光则不用显示
{
printf("\n你还有%d次机会:", 5 - count);
}
}
else if (r > guess)
{
printf("猜小了");
count++;
if (5 - count > 0)
{
printf("\n你还有%d次机会:", 5 - count);
}
}
else
{
printf("恭喜你,猜对啦!!\n");
break;
}
if (count == 5)
{
printf("机会用光啦!\n");
break;
}
}
}
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;
}
嗯,就这样。