前言
数字炸弹是笔者学习c语言的这一个多月以来,最具挑战性的一套完整项目,也是笔者独立开发的第一套项目。即使它真的很简单,无论是代码长度还是逻辑,但它对笔者的意义是非凡的——因为它很完整。也许各位读者无法共情这份心情或已经忘了第一个项目带来的喜悦感和成就感,就像一个随时随地能登上美洲的人无法共情哥伦布发现美洲的心情一样。但就像C语言的第一句话一样“Hello,World!”,它是我的第一个项目,这是我的第一篇博客,不是为了去证明什么,只是想喊出那句话:
“Hello,World!”
“你好,世界!”
数字炸弹开发背景及项目简介
数字炸弹的开发来源于一次热血澎湃的尝试。笔者想依靠自己的所学开发一款小游戏,并检验将所学的知识实践的能力,碍于能力有限,简单的小游戏数字炸弹在这样的背景下应运而生。
数字炸弹项目的开发目的是将现实的炸弹游戏在计算机上运行,炸弹由计算机随机生成。先简介数字炸弹的游戏规则,在范围内把其中一个数字定为炸弹,猜中这个数,即为输。
数字炸弹1.0
#include <stdio.h> //标准头文件
#include <stdlib.h> //srand()函数 rand()函数 头文件
#include <time.h> //time()函数 头文件
int main()
{
int ks = 0; //变量 ks 表示菜单变量
printf("数字炸弹:\n");
printf("在1~100内,其中一个数字定为炸弹,猜中这个数,即为输。\n");//以上两行对游戏进行简单说明
KS: //ks 表示菜单栏,同时为goto做准备
{ printf("输入“1”开始游戏,或输入“0”退出游戏:");
scanf("%d", &ks);
}
if (1 == ks)
{
YX: //yx 表示游戏,代表游戏运行逻辑,同时为goto做准备
srand((unsigned int)time(NULL)); //利用时间戳time()函数随机生成rand()函数起点,以达到随机数生成的目的
//其中srand()以无符号整形为参数,利用强制类型转换
//将time()函数的返还类型由有符号整形转换为无符号整形
//NULL 为time()函数的空指针
int zd = rand() % 100 + 1; //变量 zd 表示炸弹数
//注:rand()函数 范围为0~RABD_MAX,即0~32767 对rand()函数 % 100
// 即可得到0~99,+1在实现1~100的目的
printf("游戏开始,");
int left = 1, right = 100; //left表示合法数字最小值,right表示合法数字最大值
while (1) //进入循环,猜数加验证答案
{
int cai = 0;
printf("请输入一个合法的数字(%d~%d):", left, right);
scanf("%d", &cai);
if (cai < zd)
{
printf("猜小了,");
left = cai + 1;
}
else if (cai > zd)
{
printf("猜大了,");
right = cai - 1;
}
else
{
printf("猜对了,炸弹是%d。\n", zd);
goto ZJ;
}
}
if (0)
{
ZJ: //zj表示中间过渡选择页,同时为goto做准备
{
int z = 0;
printf("游戏结束。\n");
printf("输入“1”再来一把,或输入“0”退出游戏:");
scanf("%d", &z);
if (1 == z)
{
printf("数字炸弹游戏重新开始。\n");
goto YX; //goto 游戏,游戏重新开始
}
else
goto TC; //goto 退出,退出游戏
}
}
}
else if (0 == ks)
{
TC: //tc 表示退出页,同时为goto做准备
{
printf("游戏结束,感谢游玩!");
return 0;
}
}
else //菜单栏输错,重返页面
{
printf("输入错误,请重新输入一个合法的数字。\n");
goto KS;
}
}
数字炸弹1.0更新日志
纯按个人想法的代码,很多变量命名随意做不到见名只意,很随意的逻辑,有待改进。
数字炸弹2.0
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void game()
{
int ret = rand() % 100 + 1;
printf("游戏开始,");
int left = 1, right = 100;
int guess = 0;
while (1)
{
printf("请输入一个合法的数字(%d~%d):", left, right);
scanf("%d", &guess);
if (guess < ret)
{
printf("猜小了,");
left = guess + 1;
}
else if (guess > ret)
{
printf("猜大了,");
right = guess - 1;
}
else
{
printf("猜对了,炸弹是%d。\n", ret);
printf("游戏结束,");
break;
}
}
}
int main()
{
int input = 0;
srand((unsigned int)time(NULL));
printf("数字炸弹:\n");
printf("在1~100内,其中一个数字定为炸弹,猜中这个数,即为输。\n");
do
{
printf("输入“1”开始游戏,或输入“0”退出游戏:");
scanf("%d", &input);
switch (input)
{
case 1:
game();
break;
case 0:
printf("游戏已成功退出,感谢游玩!\n");
break;
default:
printf("输入错误,请重新输入一个合法的数字\n");
break;
}
} while (input);
return 0;
}
数字炸弹2.0更新日志
摒弃goto指令,保留原先功能的基础上,突出C语言的结构性,不破坏C语言原先的结构,代码可读性增强。
逻辑更严谨,高效。
数字炸弹2.0暂停跟新和维护,后期会配合HTML开发2.1的网游版本。
敬请期待~
结语
编程世界的小比特,希望与大家一起无限进步。
感谢阅读!