forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   C++ (http://forum.boolean.name/forumdisplay.php?f=22)
-   -   Волчий остров (http://forum.boolean.name/showthread.php?t=12918)

den 14.07.2010 22:22

Волчий остров
 
Вот захотел решить эту задачку:
Цитата:

Разработать имитационную модель системы “хищник–жертва” по следующей схеме.
“Остров” размером 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.
Помогите разобратся, почему всё както не так. (и как сделать появление нового кролика и волка (волчицы)).

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

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

Knightmare 14.07.2010 22:30

Ответ: Волчий остров
 
Этот код - гениален!!11111адинадин

den 14.07.2010 22:32

Ответ: Волчий остров
 
Цитата:

Этот код - гениален!!11111адинадин
Я же написал:
Цитата:

То что я написал - это говнокод недоделаный. Кто муже он неправильно работает.

den 14.07.2010 22:46

Ответ: Волчий остров
 
Ну если не хотите копаца в моём коде, тогда напишите свои версии как ето сделать.

impersonalis 14.07.2010 22:59

Ответ: Волчий остров
 
http://forum.boolean.name/showthread.php?t=6341
Лопату мне! ЛОПАТУ!

den 14.07.2010 23:29

Ответ: Волчий остров
 
Цитата:

Сообщение от impersonalis (Сообщение 154731)
http://forum.boolean.name/showthread.php?t=6341
Лопату мне! ЛОПАТУ!

:-D
Так то VB, а мне надо на VC++ (VB я ваще не знаю)

Morganolla 14.07.2010 23:54

Ответ: Волчий остров
 
Хе-хе. У кроликов тоже надо сделать самца и самку! Кроме этого сделать убывание травы в каждом квадрате, если там был кролик. А так задачка очень интересная. На досуге можно поковыряться... через недельку может наковыряю...

Igor 15.07.2010 00:31

Ответ: Волчий остров
 
Имхо описание того что надо очень хорошее. Читай и сразу кодь.
Где-нибудь храни всё то, что на поле (вариантов два:
1 сделать поле-массив и там всё хранить.
2 сделать массивы с координатами кроликов, волков и т.п.)
Потом их всех обходить: проверить близость кролика/волчицы или переместить кого-нибудь в соседнюю клетку не составит труда.
С анимацией справляйтесь сами.
Р.s. Могу реализовать на мидлет паскале. (на следующей неделе, щас я не дома) Если кого интересует, пишите в личку.

den 15.07.2010 00:44

Ответ: Волчий остров
 
Цитата:

2 сделать массивы с координатами кроликов, волков и т.п.)
Я так и делал (см код выше). Но что там не то. Короче скомпилируйте, сами увидете.

SBJoker 15.07.2010 01:46

Ответ: Волчий остров
 
В условии задачи дофига пробелов.
Например когла волк поимеет волчицу, они будут на одной клетке а вокруг нет кроликов... он её снова поимеет и так далее волки будут плодится бешенно.

Потом. Новые родившиеся волки если они мужского полу начнут тут же иметь мать и сестер. Такие дела. Неуказан период половозрелости как и пропажа интереса к волчице у волка после спаривания. Так и период беременности ;)
Такие вот дела... тоже касается кроликов.

den 15.07.2010 12:58

Ответ: Волчий остров
 
Цитата:

Сообщение от SBJoker (Сообщение 154763)
В условии задачи дофига пробелов.
Например когла волк поимеет волчицу, они будут на одной клетке а вокруг нет кроликов... он её снова поимеет и так далее волки будут плодится бешенно.

Потом. Новые родившиеся волки если они мужского полу начнут тут же иметь мать и сестер. Такие дела. Неуказан период половозрелости как и пропажа интереса к волчице у волка после спаривания. Так и период беременности ;)
Такие вот дела... тоже касается кроликов.

Да уж, действительно, недодуманныя задача:)

Igor 17.07.2010 09:07

Ответ: Волчий остров
 
Цитата:

Да уж, действительно, недодуманныя задача:)
SBJoker уже додумал


Часовой пояс GMT +4, время: 14:13.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot