"Хищники - жертва" C++

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

Ответить
ShakeMasterFox
Сообщения: 2
Зарегистрирован: 10 янв 2010, 16:42

Вот собстна код что я накалякал.
Находит ошибку не пойму где она находиться помогите исправить.

Код: Выделить всё

#include <graphics.h>
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
 
int island[20][20] ={
1,0,0,0,0,0,1,1,1,1,1,1,0,0,0,1,1,1,1,1,
1,1,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,
0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,1,
0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,
0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
0,1,0,1,0,1,1,1,1,0,0,1,0,0,1,0,1,1,1,1,
0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,0,0,1,1,1};
 
enum beast_type {rabbit=1,he_wolf=2,she_wolf=3};
 
 
class Beast
{
public:
beast_type type;
double life;
int X;
int Y;
Beast(beast_type,int,int);
Beast();
int RabbitAct();
int WolfAct(Beast*,int);
};
 
Beast::Beast()
{
}
 
Beast::Beast(beast_type t, int x1, int y1)
{
type = t;
life = 1;
X = x1;
Y = y1;
}
 
int Beast::RabbitAct()
{
int r=0;
r = rand()%9;
switch(r);
{
case 0:if(island[X+1][Y]) X=X+1;break;
case 1:if(island[X][Y+1]) Y=Y+1;break;
case 2:if(island[X-1][Y]) X=X+1;break;
case 3:if(island[X][Y-1]) Y=Y+1;break;
case 4:if(island[X+1][Y+1]) X=X+1, Y=Y+1;break;
case 5:if(island[X-1][Y+1]) X=X-1, Y=Y+1;break;
case 6:if(island[X+1][Y-1]) X=X+1, Y=Y-1;break;
case 7:if(island[X-1][Y-1]) X=X-1, Y=Y-1;break;
case 8:break;
}
if( rand()%10<5) return 0;
return 1;
}
 
int Beast::WolfAct(Beast *rabbits, int n) 
{
return 0; 
}
 
 
void main()
{
srand(time(0));
Beast rabbits[100];
Beast wolves[50];
int num_rabbits = 10;
int num_wolves = 5;
for(int i=0;i<num_rabbits;i++) rabbits[i] = Beast(rabbit,i,i);
for(i = 0;i<num_wolves;i++) wolves[i] = Beast(rand()%10<5?he_wolf:she_wolf,20-i,20-i);
int time = 1000;
for(int s = 0;s<time;s++);
{
for(int j = 0;j<num_rabbits-1;j++) if(rabbits[j].RabbitAct()==1);
{
rabbits[num_rabbits++]=Beast(rabbit,rabbits[j].X,rabbits[j].Y);
}
for(j = 0;j<num_wolves-1 ;j++) wolves[j].WolfAct(rabbits,num_rabbits);
}
 
}
Просьба помоч исправить или переписать по другому очень нужно.
THuND3Rb0LT
Сообщения: 22
Зарегистрирован: 16 авг 2009, 13:02
Откуда: Dnepropetrovsk
Контактная информация:

Я так понял никто не решился спросить: а что собственно говоря вообще нужно?)
ShakeMasterFox
Сообщения: 2
Зарегистрирован: 10 янв 2010, 16:42

Смоделировать систему "Хищники-Жертвы"
Хыиуду
Сообщения: 2442
Зарегистрирован: 06 мар 2005, 21:03
Откуда: Москва
Контактная информация:

И что это подразумевает?
Искусство программирования - заставить компьютер делать все то, что вам делать лень.
Для "спасибо" есть кнопка "Спасибо" в виде звездочки внизу под ником автора поста.
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

Хищник-жертва - это биологическая система. Смысл её в том, что система сама себя регулирует. Если хищников слишком много, то им нечего есть и они начинают вымирать от голода, как следствие их становится меньше. Если же становится слишком много жертв, то всё потомство хищников выживает из-за большого количества пищи и толпа подросших хищников сметает жертв и их становится мало (потом вымирают хищники, которые сожрали почти всю пищу).

Короче смысл в том, что у системы есть одна (а в сложных системах и больше одной) седловой точки (либо ещё говорят точки равновесия). И любое отклонение системы от этой точки порождает в ней обратно действующие силы возвращающие систему обратно в равновесное положение.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
BulldozerBSG
Сообщения: 270
Зарегистрирован: 09 янв 2010, 04:14
Контактная информация:

ShakeMasterFox, а что это за символ после скобочек рядом с switch и for. Очень похоже на ";" :)
И нет подключения заголовочного файла time.h
Это поправите, но есть более скрытая ошибка в вашем коде:

Код: Выделить всё

case 0:if(island[X+1][Y]) X=X+1;break;
case 1:if(island[X][Y+1]) Y=Y+1;break;
case 2:if(island[X-1][Y]) X=X+1;break;
case 3:if(island[X][Y-1]) Y=Y+1;break;
case 4:if(island[X+1][Y+1]) X=X+1, Y=Y+1;break;
case 5:if(island[X-1][Y+1]) X=X-1, Y=Y+1;break;
case 6:if(island[X+1][Y-1]) X=X+1, Y=Y-1;break;
case 7:if(island[X-1][Y-1]) X=X-1, Y=Y-1;break;
1. В первых 4 кейсах используется сложение, я уверен что где то должны быть и минусы.
2. Выход за пределы памяти. Перефразирую. Нарушена область допустимых значений. Код не будет правильно работать если вообще будут на граничных значениях X и Y (0 и 19). Если X и\или Y будут равны граничным то некоторые значения case будут выходить за пределы памяти. К примеру представим что X и Y равны 19 и case сработал 4, то island[19+1][19+1] вернет мусор!!!
Dragon
Сообщения: 99
Зарегистрирован: 01 окт 2009, 11:21
Откуда: Odessa
Контактная информация:

Это случаем не "Игра жизни" созданная Джоном Хортоном Конвейем?
Ответить