思路梳理
农场相当于是一个矩阵,我们可以自己设定农场的行数和列数。这里我们就以 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");
}
}