思路梳理

农场相当于是一个矩阵,我们可以自己设定农场的行数和列数。这里我们就以 10 * 10的矩阵为例来作为农场。

农场布置完之后怎么表示空地,作物,成熟作物?这里我们就用ASCII码里的符号来表示:

用“ . ”代表空地,用“ * ”代表已种植的作物,用“ # ”代表已成熟的作物。

把基本的内容确定之后,怎么实现农场图画?

定义一个二维数组,遍历数组中的每个元素,这个操作将农场布置出来

模拟农作物成熟过程需要时间间隔,这时我们就需要Sleep()函数来实现时间间隔。

而现实中农作物不可能有百分百的种植率和成熟率,这时我们就需要用随机数种子来模拟概率问题

思路梳理完成,下面开始代码环节

封装农作物生长指标函数

void print_farm(int farm[][COLS])
{
	for (int i = 0; i < ROWS; i++)
	{
		for (int j = 0; j < COLS; j++)
		{
			switch (farm[i][j])
			{
			case EMPTY :
				printf(". ");			//.代表空地
				break;
			case PLANTED :
				printf("* ");			//*代表已种植作物
				break;
			case MATURED :
				printf("# ");			//#代表已成熟作物
				break;
			}
		}
		printf("\n");
	}
}

打印函数不需要返回类型,默认void即可

这里两层for循环嵌套就是遍历二维数组的每一个元素

利用switch语句来选择农作物的状态

这里打印时多加个空格更加美观

生成农场并指定田地状态

在这之前我们需要宏定义一些常量

#define ROWS 10				//行数
#define COLS 10				//列数
#define EMPTY 0				//未种植
#define PLANTED 1			//已种植作物
#define MATURED 3			//已经成熟作物

这样在后续使用中就不会乱

int farm[ROWS][COLS];	//用二维数组定义农场
srand((unsigned int)time(NULL));			//生成随机种子

for (int i = 0; i < ROWS; i++)				//生成农场的行
{
	for (int j = 0; j < COLS; j++)			//生成农场的列
	{
		farm[i][j] = (rand() % 2 == 0) ? EMPTY : PLANTED;
		//农场一块土地是空的还是已种植作物各自有百分之五十的概率
	}
}

我们生成农场并规定田地状态的概率

语句1 ? 语句2 :  语句3

这是三目操作符

语句1如果为真,执行语句2

语句1如果为假,执行语句3

两层for循环嵌套是常规的数组遍历方式

模拟作物成长过程,并不断更新农场地图

for (int time = 0; time < 10; time++)
	{
		system("cls");
		for (int i = 0; i < ROWS; i++)
		{
			for (int j = 0; j < COLS; j++)
			{
				if (farm[i][j] == PLANTED)
				{
					if (rand() % 10 < 3)
					{	//假设每个时间段农作物成熟的机率为30%
						farm[i][j] = MATURED;
					}
				}
			}
		}
		print_farm(farm);
		Sleep(1000);

这里用到三层循环嵌套

第一层模拟成熟时间,这里我定义程序运行时间为10s,大家可以自己选择程序运行时间来观察具体变化,而且在每个循环阶段时,我们需要更新农场地图数据,将之前为“ . “和” * “的部分有概率地进行变化。

第二层和第三层就是实现农场行和列有概率地成熟,大家可以自己定义成熟概率并观察变化过程,三层循环结束之后调用农作物生长指标函数进行模拟

以下是完整代码

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

#define ROWS 10				//行数
#define COLS 10				//列数
#define EMPTY 0				//未种植
#define PLANTED 1			//已种植作物
#define MATURED 3			//已经成熟作物

void print_farm(int farm[][COLS]);

int main() 
{

	int farm[ROWS][COLS];	//用二维数组定义农场
	srand((unsigned int)time(NULL));			//生成随机种子

	for (int i = 0; i < ROWS; i++)				//生成农场的行
	{
		for (int j = 0; j < COLS; j++)			//生成农场的列
		{
			farm[i][j] = (rand() % 2 == 0) ? EMPTY : PLANTED;
			//农场一块土地是空的还是已种植作物各自有百分之五十的概率
		}
	}
	print_farm(farm);
	Sleep(1000);


	//模拟作物成长过程,并不断更新农场地图
	for (int time = 0; time < 10; time++)
	{
		system("cls");
		for (int i = 0; i < ROWS; i++)
		{
			for (int j = 0; j < COLS; j++)
			{
				if (farm[i][j] == PLANTED)
				{
					if (rand() % 10 < 3)
					{	//假设每个时间段农作物成熟的机率为30%
						farm[i][j] = MATURED;
					}
				}
			}
		}
		print_farm(farm);
		Sleep(1000);
	}

	return 0;
}

//封装打印农场模拟作物成熟的函数
void print_farm(int farm[][COLS])
{
	for (int i = 0; i < ROWS; i++)
	{
		for (int j = 0; j < COLS; j++)
		{
			switch (farm[i][j])
			{
			case EMPTY :
				printf(". ");			//.代表空地
				break;
			case PLANTED :
				printf("* ");			//*代表已种植作物
				break;
			case MATURED :
				printf("# ");			//#代表已成熟作物
				break;
			}
		}
		printf("\n");
	}
}