Дэвелопер
Регистрация: 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.
Причина: код подправил)
|