【综合运用分支与循环结构、函数调用以及数组来完成猜数游戏(2)】

 

 

 

前言

嗨嗨,虽然是不同的时间,但是在同一个地点,我码达拉又来了奥。那么这篇呢为大家带来“猜数游戏”的正式过程,在此之前所要掌握的关于随机数的生成等内容,请看我的上一篇:CSDN

整体架构流程

  1.要形成整体思路蓝图:只有事先在脑海里形成程序的框架需求,我们才能朝着正确的方向前进。说到猜数游戏,我认为应该想到以下几点:

   (1)游戏不能只玩一次就结束,而是可以根据玩家意愿选择继续或退出。

   (2)游戏开始时,首先出现菜单提示:开始或退出,玩家输入对应的数字进行选择,若选择不当,应重新选择。

   (3)当玩家选择玩游戏后,进入游戏环节,计算机应生成一个随机数供玩家猜测,并就玩家输入的数字提示偏大或偏小,若猜对或者次数用尽,则终止游戏。

   (4)计算机保留玩家的输入记录,并显示每次距离目标数的误差大小。

2.依照蓝图建高楼:

  (1)顺着思路,我们开始走:首先,我们要保证游戏是循环进行的,那我们直接do while起手:

#include <stdio.h>

int main()
{
	do
	{
		
	} while ();
	return 0;
}

花括号内就是我们的游戏程序,此时先不管循环条件是啥。

(2)进入游戏,首先出现的必然是游戏菜单,不放在{}内放一个menu()函数调用,此函数的功能就是显示出菜单。先入为主,放上后我们再具体定义一下menu函数。顺序如下图:

 

#include <stdio.h>

int main()
{
	do
	{
		menu();//游戏菜单
	} while ();
	return 0;
}

 

#include <stdio.h>

void menu(viod)
{
	puts("*********************************");
	puts("*********************************");
	puts("*******      1.paly    **********");
	puts("*******      0.exit    **********");
	puts("*********************************");
}
int main()
{
	do
	{
		menu();//游戏菜单
	} while ();
	return 0;
}

(3)看到菜单提示了,玩家就该进行选择了:

#include <stdio.h>

void menu(viod)
{
	puts("*********************************");
	puts("*********************************");
	puts("*******      1.paly    **********");
	puts("*******      0.exit    **********");
	puts("*********************************");
}
int main()
{
	int input;
	do
	{
		menu();//游戏菜单

		printf("是否开始游戏?【1…play/0…exit】");
		scanf("%d", &input);//玩家选择
		


	} while ();
	return 0;
}

(4)根据玩家选择,计算机开始执行相应的流程:若玩家输入1则开始游戏,输入0则结束程序,输入其他值则重新选择,这种情况下使用switch语句是一个不错的选择。

#include <stdio.h>

void menu(viod)
{
	puts("*********************************");
	puts("*********************************");
	puts("*******      1.paly    **********");
	puts("*******      0.exit    **********");
	puts("*********************************");
}
int main()
{
	int input;
	do
	{
		menu();//游戏菜单

		printf("是否开始游戏?【1…play/0…exit】");
		scanf("%d", &input);//玩家选择
		
		switch (input)
		{
		case 1:game(); break;

		case 0:puts("退出游戏");

		default:puts("选择错误,请重新选择:");

		}

	} while (input);
	return 0;

  不难发现运用switch语句是非常巧妙的,在这里能够和do while语句相得益彰,我们来剖析一下:

当玩家输入1时,就会进入相应的游戏阶段即game()且结束一次后因为满足循环条件,可以进行下一次选择;而输入0时,玩家是想退出游戏的,电脑会显示“退出游戏”且不满足循环条件,程序不会进行下一次执行,真正地做到了结束游戏!输入0,1以外的数字,道理和输入1相同。这样,游戏的总体框架就完成了

(4)进入游戏,生成随机数:上面说到,玩家输入1后,会进入game()游戏阶段,下面我们就来完善game函数的游戏代码吧。

假定我们要猜一个1~100的数字,首先是要生成随机数,详细内容我已发布过,因此不做赘述,直接声明:

#include <stdio.h>
#include<stdlib.h>
#include<time.h>

void menu(void)
{
	puts("*********************************");
	puts("*********************************");
	puts("*******      1.paly    **********");
	puts("*******      0.exit    **********");
	puts("*********************************");
}
//游戏1程序
void game(void)
{
	int ret = rand() % 100 + 1;//随机数范围
	int gusee;//玩家猜测的数字
}
int main()
{
	int input;
	srand((unsigned int)time(NULL));
	do
	{
		menu();//游戏菜单

		printf("是否开始游戏?【1…play/0…exit】");
		scanf("%d", &input);//玩家选择
		
		switch (input)
		{
		case 1:game(); break;

		case 0:puts("退出游戏");

		default:puts("选择错误,请重新选择:");

		}

	} while (input);
	return 0;
}

  将变量ret作为目标数,值得一提的是,并不是上来就能把所有相关变量都设出来的,而是能想到什么就设什么,有些没想到的在后面编写的过程中都会一一浮出水面,到时候再补上也不迟。

(5)边走边摸索:电脑要先提示我们输入范围数字,并且我们希望,在每次输入前都能提示玩家还有多少次机会,机会可以任意设定,为了方便修改,我们可以用宏定义次数。

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include<stdlib.h>
#include<time.h>

#define NUMBER 5
void menu(void)
{
	puts("*********************************");
	puts("*********************************");
	puts("*******      1.paly    **********");
	puts("*******      0.exit    **********");
	puts("*********************************");
}
//游戏1程序
void game(void)
{
	int ret = rand() % 100 + 1;//随机数范围
	int guess;//玩家猜测的数字
	int count = NUMBER;//机会次数

	printf("请猜一个1~100的数字:");
	

}

游戏开始后,想要结束,只有两种原因:一是玩家猜对了;二是次数用尽了。想要做到这一点,可以用while循环实现,代码如下:

void game(void)
{
	int ret = rand() % 100 + 1;//随机数范围
	int guess;//玩家猜测的数字
	int count = NUMBER;//机会次数

	printf("请猜一个1~100的数字:");
	while (count > 0)
	{
		printf("温馨提示:你还有%d次机会!",count--);
		scanf("%d", &guess);

		if (guess > ret)
			puts("太大了,再小一点试试");
		else if (guess < ret)
			puts("有点子小了,要不再大点?");
		else
		{
			puts("恭喜你,猜对了!");
			break;
		}
	}
	if (count == 0)
		printf("很遗憾,你没有猜对,正确答案是%d.\n", ret);

}

此时,游戏就可以正常玩了

(5)保存输入记录并显示误差:上面在思路里说过,计算机能储存玩家的输入记录,回顾我们之前写的代码,是不能做到的,我们可以用数组来弥补这一缺陷,因为数组是可以存储数据的嘛,只需要把所有的变量guess变成数组guess[NUMBER]即可,相信聪明的你一定能看懂下面的代码:

void game(void)
{
	int ret = rand() % 100 + 1;//随机数范围
	int guess[NUMBER];//玩家猜测的数字
	int count = NUMBER;//机会次数
	int i = 0;
	printf("请猜一个1~100的数字:");
	while (count > 0)
	{
		printf("温馨提示:你还有%d次机会!",count--);
		scanf("%d", &guess[i]);
		

		if (guess[i]> ret)
			puts("太大了,再小一点试试");
		else if (guess[i] < ret)
			puts("有点子小了,要不再大点?");
		else
		{
			puts("恭喜你,猜对了!");
			break;
		}
		i++;
	}
	if (count == 0)
		printf("很遗憾,你没有猜对,正确答案是%d.\n", ret);
	puts("输入记录              误差大小");
	puts("-----------------------------");
	for (i = 0; i < NUMBER - count; i++)
		printf("%3d                   %+d\n", guess[i], ret - guess[i]);

}

 

 

 

游戏技巧

大家知道怎样才能提高游戏的成功率吗?不妨试试每次都取中间值,第一次猜50,后续再根据提示去中间值即可。

5548dae90bde42719bc63526eac7be91.png可见,虽然只有5次机会,我们依然能猜出非常接近答案的数字。只是我太菜了,相信聪明的你们肯定比我会猜,哈哈哈。

小结

ccb4c5768eaf4ccc84f023e9887cd9d0.png

 

蓝图在手,方可建高楼,房子是一点点盖成的,路是一步步探索出来的,程序也是如此!

 

 

  • 56
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值