今天我们来实现一个简单的游戏:猜数字游戏。
没有冗乱复杂的逻辑,也没有图形化界面的实现,我们用C语言最简单最基础的代码来实现它。
写代码最重要的是写代码的思路,而不是写出来的代码,所以我注重讲解写作思路。
首先,明确游戏的步骤。
1.程序会随机生成一个1—100之间的随机数。
2.猜数字
- 猜小了,程序会告诉你“猜小了,继续猜”
- 猜大了,程序会告诉你“猜大了,继续猜”
- 猜对了,程序会告诉你“恭喜你,猜对了”
3.游戏可以反复玩
然后,我们开始一步步完成游戏的具体实现
1.先写出main函数
我们先打印一个菜单,当做游戏的入口。
菜单我们设计出两个选项:
- 输入0:表示退出游戏(exit)
- 输入1:表示开始游戏(play)
- 其他: 表示选择错误,需要重新输入
菜单中有输入,我们定义一个input变量,运用scanf函数让input从键盘端接收数据。
代码实现 :
#include<stdio.h>
void menu() //游戏菜单的具体实现
{
printf("**********************************\n");
printf("********** 1.play **********\n");
printf("********** 0.exit **********\n");
printf("**********************************\n");
}
int main()
{
int input = 0; //创建变量的同时最好给一个初始值
menu(); //打印菜单
printf("请选择>:"); //选择是否开始游戏
scanf("%d", &input); //input从键盘端接收值,注意地址符
switch(input)
{
case 1: //输入1:表示开始游戏
game(); //game函数中是猜数字的整个逻辑,此处还未实现
break;
case 0: //输入0:表示退出游戏
break;
default: //其他:表示选择错误,需要重新输入
printf("选择错误,请重新输入!\n");
break;
}
return 0;
}
2.实现游戏的反复
反复,表示循环,我们先挑选哪一种循环游戏最适合猜数字游戏的实现。
用户点开游戏直接打印菜单,选择是否开始游戏,说明至少会打印一次菜单,选择do while语句。
我们用do while语句实现游戏的反复:
#include<stdio.h>
void menu()
{
printf("**********************************\n");
printf("********** 1.play **********\n");
printf("********** 0.exit **********\n");
printf("**********************************\n");
}
int main()
{
int input = 0;
do{ //实现循环
menu();
printf("请选择>:");
scanf("%d", &input);
switch(input)
{
case 1:
game();
break;
case 0:
break;
default:
printf("选择错误,请重新输入!\n");
break;
}
}while(input);
return 0;
}
//用户输入1,表示进行一次游戏,同时循环不会结束,还会再打印一次菜单,用户需再进行一次输入。
//用户输入0,表示退出游戏,同时循环结束,直接退出程序。
//用户输入其他数字,不会进行游戏,同时循环不会结束,还会再打印一次菜单,用户需再进行一次输入。
3.游戏的具体实现
上述代码已经完成了反复进入游戏的功能,接了来我们来进行游戏的实现。
用户输入1时表示开始游戏,我们在switch语句中的case1中的game函数中完成游戏的具体实现。
游戏是猜数字,我们得先生成一个随机数才能够进行猜的步骤。
1.生成随机数:
void game()
{
srand((unsigned)time(NULL));
int random_num = rand()%100+1; //生成1—100之间的随机数
//不可以写成rand()%101,这样生成的是0—100之间的随机数
}
//rand函数是专门用来生成随机数的
//rand函数返回的是0~RAND_MAX(32767)之间的一个随机数
//#define RAND_MAX 0x7fff(32767)
//rand函数在使用之前要使用一个srand函数来设置随机数的生成器
//srand函数在程序中只要调用一次就可以了,不需要频繁调用
因为srand不需要频繁调用,我们把srand函数放到主函数中:(主函数只会执行一次)
#include<stdio.h>
#include <stdlib.h> //使用rand函数和srand函数需要调用stdlib.h文件
#include <time.h> //使用time函数需要调用time.h头文件
void menu()
{
printf("**********************************\n");
printf("********** 1.play **********\n");
printf("********** 0.exit **********\n");
printf("**********************************\n");
}
int main()
{
srand((unsigned)time(NULL));
//时间戳
//C语言中,time函数会返回时间戳
//time返回time_t -> time 64_t -> int64 -> long long
int input = 0;
do{
menu();
printf("请选择>:");
scanf("%d", &input);
switch(input)
{
case 1:
game();
break;
case 0:
break;
default:
printf("选择错误,请重新输入!\n");
break;
}
}while(input);
return 0;
}
2.猜数字
猜数字也是一个循环的过程,直到猜对循环结束:
void game()
{
int num = 0;
int ret = rand()%100+1;
while (1)
{
printf("请猜数字:>");
scanf("%d", &num);
if (num < ret)
{
printf("猜小了\n");
}
else if (num > ret)
{
printf("猜大了\n");
}
else
{
printf("恭喜你,猜对了\n");
break;
}
}
}
最后,猜数字游戏就实现了
#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 num = 0;
int ret = rand() % 100 + 1;
while (1)
{
printf("请猜数字:>");
scanf("%d", &num);
if (num < ret)
{
printf("猜小了\n");
}
else if (num > ret)
{
printf("猜大了\n");
}
else
{
printf("恭喜你,猜对了\n");
break;
}
}
}
int main()
{
srand((unsigned)time(NULL));
int input = 0;
do {
menu();
printf("请选择>:");
scanf("%d", &input);
switch (input)
{
case 1:
game();
break;
case 0:
break;
default:
printf("选择错误,请重新输入!\n");
break;
}
} while (input);
return 0;
}