干票大的(对于我来说),做个猜数字游戏,系统给出一个随机数,你输入一个数,如果大了系统提示你数太大,太小提示你太小,直到你猜到这个数为止
首先肯定是要用到函数的,根据TDD(测试驱动开发)的基本原则,先将主函数的基本框架写出来
我们需要一个游戏菜单,从中选择我们是进入游戏(1)还是退出游戏(0),然后就是游戏的主体函数
所以主体框架如下
int main()
{
int input = 0;
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;
}
一步步来,首先把菜单函数设计出来
void menu()
{
printf("************************************\n");
printf("*********** 1.play **********\n");
printf("*********** 0.exit **********\n");
}
很简单的一个菜单,对于现阶段的我也算够用了
然后就是游戏主体
让我们想想,其实猜的过程不难写,难点在于如何让系统给出一个随机数
这里就要用到随机数函数rand()
但是如果直接调用,那么给出的随机值将会面临范围有限,数值重复,而且直接调用给出的随机值并非完全随机,这不是我们想要的结果,这需要我们调用srand()设置一个随机数种子,这里我们运用时间作为种子来进行操作(因为只会这个),而srand()只需调用一次,所以我们将他置于主函数中,避免其进入循环同时我们给出的随机数必须界定一个范围,不然玩一次不知道要猜多久,这个其实不难,由于rand函数的值范围在0-32767,所以我们只需要对rand()这个整体进行一定的数学运算就可以缩小其产生的随机数范围,综上所述,我们写出完整的game()函数
void game()
{
//生成随机数
int ret=0;//存放我们的随机数
//拿时间设置随机数,因为这是一个时刻变化的数据
int guess=0;//存放猜的数字
ret = rand() % 100 + 1;
while (1)
{
printf("请猜数字:>");
scanf("%d", &guess);
if (guess > ret)
printf("猜大了\n");
else if (guess < ret)
printf("猜小了\n");
else
{
printf("恭喜你,猜对了\n");
break;
}
}
}
将以上部分进行拼装得到最终结果
void game()
{
//生成随机数
int ret=0;//存放我们的随机数
//拿时间设置随机数,因为这是一个时刻变化的数据
int guess=0;//存放猜的数字
ret = rand() % 100 + 1;
while (1)
{
printf("请猜数字:>");
scanf("%d", &guess);
if (guess > ret)
printf("猜大了\n");
else if (guess < ret)
printf("猜小了\n");
else
{
printf("恭喜你,猜对了\n");
break;
}
}
}
void menu()
{
printf("************************************\n");
printf("*********** 1.play **********\n");
printf("*********** 0.exit **********\n");
}
int main()
{
srand((unsigned int)time(NULL));
int input = 0;
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;
}
关于以上函数,还有一个需要解释的就是time()这个函数,这个函数用于取用时间戳,时间戳是当前时间与某个固定时间的差,单位为秒
时间戳可以是从某个参考点(例如 Unix 纪元,即 1970 年 1 月 1 日 0 时 0 分 0 秒)开始计算的,也可以是从某个特定事件(例如某次系统启动)开始计算的
关于以上程序我们需要引用的头文件包括<stdlib.h> <time.h>
如果要更完美一点则是AI的一种解法
int main() {
srand(time(0));
int answer;
int guess;
int attempt;
int choice;
printf("-------- 猜数字游戏 --------\n");
do {
answer = rand() % 100 + 1;
attempt = 0;
guess = 0;
printf("\n菜单:\n");
printf("1. 开始游戏\n");
printf("2. 退出游戏\n");
printf("请选择: ");
scanf("%d", &choice);
switch (choice) {
case 1:
printf("\n猜数字游戏开始!\n");
do {
printf("请输入你的猜测(1到100之间的整数):");
scanf("%d", &guess);
attempt++;
if (guess > answer) {
printf("猜测偏大,请再次尝试。\n");
}
else if (guess < answer) {
printf("猜测偏小,请再次尝试。\n");
}
else {
printf("恭喜你猜对了!答案是 %d。\n", answer);
printf("你一共猜了 %d 次。\n", attempt);
}
} while (guess != answer);
break;
case 2:
printf("\n退出游戏。谢谢参与!\n");
break;
default:
printf("无效的选择,请重新选择。\n");
break;
}
} while (choice != 2);
return 0;
}
当然在这里两种写法并无本质差别,只是AI在细节方面的处理更加完美