是否会深夜突然心潮汹涌思路来袭对着电脑一顿输出,结果对着五十多个错误陷入社会的重大思考,不知从何下笔
我认为对于一个代码从无到实现某种功能时,需要有以下这几个方法:
- 框架思维
- 分块思维
- 及时调试
- 不断优化整体思维结构
以猜数字游戏为例:
想要实现的猜数字游戏主要由以下这几个部分组成:
- 游戏初始页面菜单可供玩家选择
- 游戏内容
- 随机生成1—100的数字
- 猜数字反馈内容
-猜小了重新猜
-猜大了重新猜
-正确游戏结束 、
-游戏功能
-支持反复玩
#首先我们构建菜单
因为要保证游戏至少开始一次(刚开始我们就要出现菜单,之后反复玩还要再来到菜单进行选择,那么循环结构我们可以采用do while结构来实现:
//由于不需要函数返回任何东西只需打印所以函数返回类型用void来代替
void menu() {//游戏初始菜单
printf("*********************\n");
printf("*****1.play game*****\n");
printf("*****0.exit**********\n");
printf("*********************\n");
}
int main() {
do {
printf(" 猜数字游戏\n");
menu();//方便代码的清晰明了我们可以选择自定义函数来构建菜单
} while ();//先把整体框架搭建出来,先不用管条件是什么
return 0;
}
##玩家选择是否玩游戏
我们可以用switch来表达
int main() {
int num = 0;//之所以把它设定为全局变量是为了后面while的判断
do { //条件来服务的
printf(" 猜数字游戏\n");
menu();
scanf("%d",&num);
switch (num) {
case 1:
printf("游戏开始\n");
game();//这里代表我们即将要完成的game函数游戏实现
//游戏实现的主体部分
break;
case 0:
printf("游戏结束\n");
break;
default:
printf("输入错误,请重新选择>:\n");
break;
}
} while (num);//只有当选择0时游戏结束刚好再这里就是跳出循环
return 0;
}
###猜数字游戏内容
-
自定义函数game()不需要任何返回值和前者menu相同
-
游戏重点在于两个步骤
-生成随机数
-猜数字 -
生成随机数:
我们需要生成随机数的函数,在C语言所提供的库函数中rand()就能帮我们解决这个问题,让它随机返回一个int类型的值就是我们想要的随机数
void game() { int num2=0; int ret = rand(); printf("%d", ret); }
看似没有什么问题,但是当我们退出程序时再次进入开始玩时会发现,还是这几个数字,那么游戏的可玩性就大大降低了,随机数不随机了,所以我们需要另一个函数srand()来辅助,它可以用来初始化生成数的起点,但是使用srand()函数我们需要在里面传一个变化值,但是问题不就来了:
我不是要生成随机值吗?怎么要传随机值,套娃了可还行,那么我们就要思考什么是不断变化的:
时间。
这时候我们引入一个新的量:时间戳
时间戳:某个时间点到初始时间的一个时间差值,它在不断变化,所以我们可以利用time函数返回时间戳
time函数,我们可以利用网站对其进行查询
返回的是time_t一个64位的整型,通俗来说就是一个整数,它需要传一个指针,因为我们只是想要它的返回值所以传一个空指针NULL即可(如果编译器中对于time_t不认识我们可以强制类型转化:
void game() {
int num2=0;
int ret = rand();
srand((unsigned int)time(NULL));
printf("%d", ret);
}
此时我们会发现如果随机数生成过快,他们的值非常接近,还是不够随机,所以我们要优化,srand作为随机数的生成起点,只需要调用一次就行了没必要每次起点都重新设置,所以把它放进主函数即可:
因为我们猜数字的数字过大并不是很好猜,如果想要随机生成1—100的数字呢?
思考一下,任何一个数我们去求除以100的余数,我们会知道余数都不可能超过100,余数只可能是0-100的数字那我们再加1,不就恰好得到了1-100的数字了吗,这时我们随机数的生成就实现了:
在这里插入图片描述
-猜数字实现
我们可以利用while循环和if语句来实现,此时我们完整的代码就出现了:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>//这是rand库函数的头文件
#include<time.h>
void menu() {//游戏初始菜单
printf("*********************\n");
printf("*****1.play game*****\n");
printf("*****0.exit**********\n");
printf("*********************\n");
}
void game() {
int num2=0;
int ret = rand()%100+1;
while (1) {
scanf("%d", &num2);
if (num2 > ret) {
printf("猜大了,重新选择\n");
}
else if (num2 < ret) {
printf("猜小了,重新选择\n");
}
else {
printf("恭喜你,猜对了!\n");
break;
}
}
printf("%d", ret);
}
int main() {
int num = 0;
srand((unsigned int)time(NULL));
do {
printf(" 猜数字游戏\n");
menu();
scanf("%d",&num);
switch (num) {
case 1:
printf("游戏开始\n");
game();
break;
case 0:
printf("游戏结束\n");
break;
default:
printf("输入错误,请重新选择>:\n");
break;
}
} while (num);
return 0;
}
输出结果:
以上就是猜数字游戏的完整实现,其实就是在不断调试不断发现问题,解决问题中完成的,所以也希望以后的自己在遇到问题时是保持好奇想要探索的心态而不是一度的畏难情绪,进步往往就是在不断的发现错误进行改正的循环中产生的
——————————————————————————————
如有不对,欢迎各位大佬批评指正