⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.cpp

📁 生态系统模拟
💻 CPP
📖 第 1 页 / 共 2 页
字号:
/*************************************************************
*	生态系统模拟,草原、羊、狼
*		Copyright@Arthur
*			2008-12-24
**************************************************************/
#include <stdio.h>
#include <iostream>
#include <vector>

using namespace std;

#define MaxNM 500		
#define MaxR 5000		//羊的最大数量
#define MaxW 100		//狼的最大数量

//羊的结构
typedef struct SRam
{
	int x,y;	//位置坐标
	double hunger;
	int childDays;
	bool female;
	bool death;	//是否死亡
}SRam;

//狼的结构
typedef struct SWolf
{
	int x,y;	//位置坐标
	double hunger;
	int childDays;
	bool female;
	bool death;	//是否死亡
}SWolf;

//草原的单元结构
typedef struct SGrassUnit
{
	int ramIndex[10],wolfIndex[10];		//羊和狼的序号
	double ramNum,wolfNum;				//此处狼羊的数量,可以为小数
	double belongTo;
	double ate;
	double grass;	//草的状态 0-1
}SGrassUnit;

//模拟系统
class CEcosystem
{
public:
	CEcosystem();
	~CEcosystem();

	int Run();

protected:
	int Init();
	int Simulating();
	int Release();

	void Usage();
	void PrintInfor(int day = 0);

protected:
	int m_days;				//模拟的总天数

	int m_grassM,m_grassN;	//草原的大小
	double m_grassRate;		//草的增长率

	//模拟生物数据
	SGrassUnit	**m_grass;
	SRam		*m_rams;
	SWolf		*m_wolves;
	int m_nRam;				//羊的数量
	int m_nWolf;			//狼的数量

	bool m_ready;
};

int main()
{
	CEcosystem ecosystemS;

	ecosystemS.Run();

	return 0;
}

CEcosystem::CEcosystem()
{
	m_grass = NULL;
	m_rams = NULL;
	m_wolves = NULL;
}

CEcosystem::~CEcosystem()
{
}

int CEcosystem::Init()
{
	char y;

	m_ready = false;

	//打印应用
	Usage();

	cout<<"开始模拟?y/n?\n";
	cin>>y;
	if (y != 'y')
	{
		//退出系统
		cout<<"按任意键退出模拟程序……";
		getchar();
		getchar();

		return 1;
	}

	//读入数据
	cout<<"输入草原的大小(10..500) n m\n";
	cin>>m_grassN>>m_grassM;
	if (m_grassN < 9 || m_grassN > 501 && m_grassM < 9 || m_grassM > 500)
	{
		cout<<"错误输入!";
		return -1;
	}
	cout<<"输入草的增长率(0..1) rate\n";
	cin>>m_grassRate;
	if (m_grassRate <= 0 || m_grassRate > 1 )
	{
		cout<<"错误输入!";
		return -1;
	}
	cout<<"输入羊(0..1000)狼(0..50)的初始量 n m\n";
	cin>>m_nRam>>m_nWolf;
	if (m_nWolf < 0 || m_nWolf > 50 || m_nRam < 0 || m_nRam > 1000)
	{
		cout<<"错误输入!";
		return -1;
	}
	cout<<"输入模拟的天数(1..1000) rate\n";
	cin>>m_days;
	if (m_days <= 0 || m_days > 1000 )
	{
		cout<<"错误输入!";
		return -1;
	}

	//数据的初始化
	m_grass = new SGrassUnit* [m_grassN];
	for (int i = 0 ; i < m_grassN ; i++)
	{
		m_grass[i] = new SGrassUnit[m_grassM];
	}

	for (int i = 0 ; i < m_grassN ; i++)
	{
		for (int j = 0 ; j < m_grassM ; j++)
		{
			m_grass[i][j].ate = 0;
			m_grass[i][j].belongTo = 1;
			m_grass[i][j].grass = 0;
			m_grass[i][j].ramNum = 0;
			m_grass[i][j].wolfNum = 0;
			for (int k = 0 ; k < 10 ; k++)
			{
				m_grass[i][j].ramIndex[k] = m_grass[i][j].wolfIndex[k] = -1;
			}
		}
	}

	m_rams = new SRam[MaxR];
	m_wolves = new SWolf[MaxW];

	for (int i = 0 ; i < MaxR ; i++)
	{
		m_rams[i].childDays = 101;	//成年羊
		m_rams[i].death = true;
		m_rams[i].female = i % 2 == 1;
		m_rams[i].hunger = 0;
		m_rams[i].x = 0;
		m_rams[i].y = 0;
	}
	for (int i = 0 ; i < MaxW ; i++)
	{
		m_wolves[i].childDays = 0;	//表示不带孩子的狼
		m_wolves[i].death = true;
		m_wolves[i].female = i % 2 == 1;
		m_wolves[i].hunger = 0;
		m_wolves[i].x = 0;
		m_wolves[i].y = 0;
	}

	for (int i = 0 ; i < m_nRam  ; i++)
	{
		m_rams[i].death = false;
		m_rams[i].x = (int)((double)rand() / ((double)RAND_MAX + 1) * m_grassN);
		m_rams[i].y = (int)((double)rand() / ((double)RAND_MAX + 1) * m_grassM);
		m_grass[m_rams[i].x][m_rams[i].y].ramNum++;
		for (int j = 0 ; j < 10 ; j++)
		{
			if (m_grass[m_rams[i].x][m_rams[i].y].ramIndex[j] < 0)
			{
				m_grass[m_rams[i].x][m_rams[i].y].ramIndex[j] = i;
				break;
			}
		}
	}
	for (int i = 0 ; i < m_nWolf  ; i++)
	{
		m_wolves[i].death = false;
		m_wolves[i].x = (int)((double)rand() / ((double)RAND_MAX + 1) * m_grassN);
		m_wolves[i].y = (int)((double)rand() / ((double)RAND_MAX + 1) * m_grassM);
		m_grass[m_wolves[i].x][m_wolves[i].y].wolfNum++;
		for (int j = 0 ; j < 10 ; j++)
		{
			if (m_grass[m_wolves[i].x][m_wolves[i].y].wolfIndex[j] < 0)
			{
				m_grass[m_wolves[i].x][m_wolves[i].y].wolfIndex[j] = i;
				break;
			}
		}
	}

	m_ready = true;

	return 0;
}

int CEcosystem::Release()
{
	if (m_grass)
	{
		for (int i = 0 ; i < m_grassN ; i++)
			delete [](m_grass[i]);
		delete []m_grass;
	}
	if (m_rams)
		delete []m_rams;
	if (m_wolves)
		delete []m_wolves;

	return 0;
}

int CEcosystem::Run()
{
	int flag ;
	while (1)
	{
		//初始化数据
		flag = Init();
		if (flag == -1)
		{
			continue;
		}else if (flag == 1)
		{
			break;
		}
		//模拟过程
		if (Simulating() == -1)
		{
			cout<<"模拟过程中错误!\n";
			getchar();
			getchar();
			continue;
		}

		//模拟结束打印最后结果,并释放空间
		PrintInfor();
		Release();
	}

	return 0;
}

int CEcosystem::Simulating()
{
	int currDay = 0;
	int i,j,x,y,index;
	//double food;
	//int count;

	if (!m_ready)
	{
		return 1;
	}

	while (currDay < m_days)
	{
		//每天增加
		currDay++;
		//每隔10天输出当前状态
		if (currDay % 10 == 0)
			PrintInfor(currDay);

		//草生长
		for (i = 0 ; i < m_grassN ; i++)
		{
			for (j = 0 ; j < m_grassM ; j++)
			{
				m_grass[i][j].grass -= m_grass[i][j].ate;
				m_grass[i][j].ate = 0;
				if (m_grass[i][j].grass < 1)
				{
					m_grass[i][j].grass += m_grassRate;
				}
			}
		}

		//羊捕食
		for (index = 0 ; index < MaxR ; index++)
		{
			if (!m_rams[index].death )
			{
				//没有死亡的羊
				if (m_rams[index].childDays <= 100)
				{
					m_rams[index].childDays++;
				}
				x = m_rams[index].x;
				y = m_rams[index].y;

				m_rams[index].hunger += 10;
				
				for (int i = x - 5 ; i < x + 5 ; i++)
				{
					for (int j = y - 5 ; j < y + 5 ; j++)
					{
						if (i >= 0 && j >= 0 && i < m_grassN && j < m_grassM )
						{
							m_rams[index].hunger -= m_grass[i][j].grass/m_grass[i][j].belongTo;
							m_grass[i][j].ate = m_grass[i][j].grass/m_grass[i][j].belongTo;
							if (m_rams[index].hunger < 0 )
							{
								break;
							}
						}
					}
					if (m_rams[index].hunger < 0 )
					{
						break;
					}
				}
				//饿死死亡
				if (m_rams[index].hunger > 10 * 4)
				{
					m_rams[index].death = true;
					//对草原的信息进行更新
					m_grass[m_rams[index].x][m_rams[index].y].ramNum--;
					for (j = 0 ; j < 10 ; j++)
					{
						if (m_grass[x][x].ramIndex[j] == index)
						{
							m_grass[x][y].ramIndex[j] = -1;
							break;
						}
					}
				}
				
			}
		}

		//狼捕食
		for (index = 0 ; index < MaxW ; index++)
		{
			if (!m_wolves[index].death)
			{
				if (m_wolves[index].childDays > 0 && m_wolves[index].childDays < 100)
				{
					m_wolves[index].childDays++;
				}
				x = m_wolves[index].x;
				y = m_wolves[index].y;

				if (m_wolves[index].hunger < 0)
				{
					//五天不用捕食
					m_wolves[index].hunger++;
					continue;
				}

				m_wolves[index].hunger += 0.5;
				if (m_wolves[index].childDays > 0)
				{
					m_wolves[index].hunger += 0.5;
				}
				for (int i = x - 20 ; i < x + 20 ; i++)
				{
					if (i < 0 || i > m_grassN )
						continue;
					for (int j = y - 20 ; j < y + 20 ; j++)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -