Показать сообщение отдельно
Старый 14.07.2010, 22:22   #1
den
Дэвелопер
 
Аватар для den
 
Регистрация: 13.02.2010
Сообщений: 1,645
Написано 620 полезных сообщений
(для 2,419 пользователей)
Смущение Волчий остров

Вот захотел решить эту задачку:
Разработать имитационную модель системы “хищник–жертва” по следующей схеме.
“Остров” размером 20 на 20 заселен дикими кроликами, волками и волчицами. Имеется по нескольку представителей каждого вида. Кролики в каждый момент времени с одинаковой вероятностью 1/9 передвигаются в один из восьми соседних квадратов (за исключением участков, ограниченных береговой линией) или просто сидят неподвижно. Каждый кролик с вероятностью 0,2 превращается в двух кроликов. Каждая волчица передвигается случайным образом, пока в одном из соседних восьми квадратов не окажется кролик, за которым она охотится. Если волчица и кролик оказываются в одном квадрате, волчица съедает кролика и получает одно очко. В противном случае она теряет 0,1 очка.
Волки и волчицы с нулевым количеством очков умирают.
В начальный момент времени все волки и волчицы имеют 1 очко.
Волк ведет себя подобно волчице до тех пор, пока в соседних квадратах не исчезнут все кролики; тогда, если волчица находится в одном из восьми близлежащих квадратов, волк гонится за ней.
Если волк и волчица окажутся в одном квадрате и там нет кролика, которого нужно съесть, они производят потомство случайного пола.
Задание: понаблюдать за изменением популяции в течение некоторого периода времени. Проследить, как сказываются на эволюции популяций изменения параметров модели.
То что я написал - это говнокод недоделаный. Кто муже он неправильно работает.
bool m1[21][21],m2[21][21],m3[21][21];
int n=7;
class volkm
{
public:
	int live,x,y,a;
	volkm()
	{
		live=10;
		x=::rand()%20;
		y=::rand()%20;
	}
	void move()
	{
		live--;
		m1[x][y]=0;
		a=::rand()%9;
		if(m3[x-1][y-1]==1 || m3[x][y-1]==1 || m3[x+1][y-1]==1 || m3[x-1][y]==1 || m3[x][y]==1 || m3[x+1][y]==1 || m3[x-1][y+1]==1 || m3[x][y+1]==1 || m3[x+1][y+1]==1)  
		{
		if(m3[x-1][y-1]==1) {x--;y--;}
		else if(m3[x][y-1]==1) {x;y--;}
		else if(m3[x+1][y-1]==1) {x++;y--;}
		else if(m3[x-1][y]==1) {x--;y;}
		else if(m3[x][y]==1) {x;y;}
		else if(m3[x+1][y]==1) {x++;y;}
		else if(m3[x-1][y+1]==1) {x--;y++;}
		else if(m3[x][y+1]==1) {x;y++;}
		else if(m3[x+1][y+1]==1) {x++;y++;}
		else
		{
			if(m2[x-1][y-1]==1) {x--;y--;}
			else if(m2[x][y-1]==1) {x;y--;}
			else if(m2[x+1][y-1]==1) {x++;y--;}
			else if(m2[x-1][y]==1) {x--;y;}
			else if(m2[x][y]==1) {x;y;}
			else if(m2[x+1][y]==1) {x++;y;}
			else if(m2[x-1][y+1]==1) {x--;y++;}
			else if(m2[x][y+1]==1) {x;y++;}
			else if(m2[x+1][y+1]==1) {x++;y++;}
		}
		}
		else
		{
			if(a==0 && x-1>=0 && y-1<=19) {x--;y--;}
			if(a==1 && x>=0 && y-1<=19) {x;y--;}
			if(a==2 && x+1>=0 && y-1<=19) {x++;y--;}
			if(a==3 && x-1>=0 && y<=19) {x--;y;}
			if(a==4 && x>=0 && y<=19) {x;y;}
			if(a==5 && x+1>=0 && y<=19) {x++;y;}
			if(a==6 && x-1>=0 && y+1<=19) {x--;y++;}
			if(a==7 && x>=0 && y+1<=19) {x;y++;}
			if(a==8 && x+1>=0 && y+1<=19) {x++;y++;}
		}
		if(live>0)
		{
			if(m3[x][y]==1) live++;
		 m1[x][y]=1;
		}
	}
};
class volkw
{
public:
	int live,x,y,a;
	volkw()
	{
		live=10;
		x=::rand()%20;
		y=::rand()%20;
	}
	void move()
	{
		live--;
		m2[x][y]=0;
		a=::rand()%9;
		if(m3[x-1][y-1]==1) {x--;y--;}
		else if(m3[x][y-1]==1) {x;y--;}
		else if(m3[x+1][y-1]==1) {x++;y--;}
		else if(m3[x-1][y]==1) {x--;y;}
		else if(m3[x][y]==1) {x;y;}
		else if(m3[x+1][y]==1) {x++;y;}
		else if(m3[x-1][y+1]==1) {x--;y++;}
		else if(m3[x][y+1]==1) {x;y++;}
		else if(m3[x+1][y+1]==1) {x++;y++;}
		else 
		{
			if(a==0 && x-1>=0 && y-1<=19) {x--;y--;}
			if(a==1 && x>=0 && y-1<=19) {x;y--;}
			if(a==2 && x+1>=0 && y-1<=19) {x++;y--;}
			if(a==3 && x-1>=0 && y<=19) {x--;y;}
			if(a==4 && x>=0 && y<=19) {x;y;}
			if(a==5 && x+1>=0 && y<=19) {x++;y;}
			if(a==6 && x-1>=0 && y+1<=19) {x--;y++;}
			if(a==7 && x>=0 && y+1<=19) {x;y++;}
			if(a==8 && x+1>=0 && y+1<=19) {x++;y++;}
			if(a==0 || a==1 || a==2) {/*рождение волка (волчицы)*/}
		}
		if(live>0)
		{
			if(m3[x][y]==1) live++;
			m1[x][y]=1;
		}

	}
};

class krol
{
public:
	bool live;
	int x,y,a;
	krol()
	{
		live=1;
		x=::rand()%20;
		y=::rand()%20;
	}
	void move()
	{
		m3[x][y]=0;
		a=::rand()%9;
			if(a==0 && x-1>=0 && y-1<=19) {x--;y--;}
			if(a==1 && x>=0 && y-1<=19) {x;y--;}
			if(a==2 && x+1>=0 && y-1<=19) {x++;y--;}
			if(a==3 && x-1>=0 && y<=19) {x--;y;}
			if(a==4 && x>=0 && y<=19) {x;y;}
			if(a==5 && x+1>=0 && y<=19) {x++;y;}
			if(a==6 && x-1>=0 && y+1<=19) {x--;y++;}
			if(a==7 && x>=0 && y+1<=19) {x;y++;}
			if(a==8 && x+1>=0 && y+1<=19) {x++;y++;}
			if(a==0 || a==1 || a==2) {/*рождение кролика*/}
			if(m1[x][y]==1 || m2[x][y]==1) live=0;
			if(live=1) m3[x][y]=1;

	}
};


void CVolkiandKrolikiDlg::draw()
{
	CClientDC dc(this);
	CPen noli(0,2,RGB(255,255,255));
	CPen volki(0,2,RGB(0,0,0));
	CPen volkiw(0,2,RGB(255,0,0));
	CPen kroli(0,2,RGB(0,255,0));
	dc.SelectObject(noli);
	dc.Rectangle(0,0,200,200);
	for(int i=0;i<20;i++) for(int j=0;j<20;j++)
		if(m1[i][j]==1){
				dc.SelectObject(volki);
				dc.Rectangle(i*10,j*10,i*10+10,j*10+10);}
	for(int i=0;i<20;i++) for(int j=0;j<20;j++)
		if(m2[i][j]==1){
				dc.SelectObject(volkiw);
				dc.Rectangle(i*10,j*10,i*10+10,j*10+10);}
	for(int i=0;i<20;i++) for(int j=0;j<20;j++)
		if(m3[i][j]==1){
				dc.SelectObject(kroli);
				dc.Rectangle(i*10,j*10,i*10+10,j*10+10);}

		}



void CVolkiandKrolikiDlg::OnBnClickedButton1()
{
	::srand(::time(0));
	volkm vm[7];
	volkw vw[7];
	krol k[7];
	while(1)
	{
		Sleep(500);
		for(int i=0;i<n;i++)
		{
			vm[i].move();
			vw[i].move();
			k[i].move();
		}
		draw();
	}

}
Делал с MFC.
Помогите разобратся, почему всё както не так. (и как сделать появление нового кролика и волка (волчицы)).

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

Если лень в моём коде копатся, направте меня на правильный путь, подскажите (в потробностях) как ету задачу сделать.

Последний раз редактировалось den, 14.07.2010 в 22:29. Причина: код подправил)
(Offline)
 
Ответить с цитированием