Модераторы: Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [Borland C++3.1] Программа "Хищники и жертвы", Волки и кролики 
:(
    Опции темы
Alex_Iz
Дата 25.4.2007, 21:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 25.4.2007

Репутация: нет
Всего: нет



Уважаемые программисты! Прошу помощи! На днях сдавать курсач, а я "тёмный лес" в Borland 3.1 С++. Задание такое: Волчий остров (хищник-жертва).
Внутри прямоугольника размером 20Х20 клеток находится фигура сложной формы - остров. На острове обитают кролики, волки и волчицы. На каждом временном шаге кролик: а) с вероятностью 1/9 перемещается на одну из 8 клеток вокруг или остаётся неподвижным; б) с вероятностью 1/5 превращается в двух кроликов (плодится). Волк или волчица движутся случайно, пока в соседнем квадрате не обнаруживается кролик. Тогда его съедают. Если волк (волчица) не съел кролика за один временной шаг, то сила его убывает на 1/10. Если сила волка (волчицы) достигла 0, то он погибает. Если волк и волчица попадают в одну и ту же клетку, то они производят потомство случайного пола.
Заранее премного благодарен.


PM MAIL   Вверх
Ryoga
Дата 25.4.2007, 23:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 262
Регистрация: 20.9.2005

Репутация: 2
Всего: 6



Ну, дык, какие вопросы?
Создайте карту острова - массив 20 на 20. Я так понимаю, что там может быть море и земля? Пусть 1 - земля, 0 - море.
Создайте класс Животное. Параметры - Тип=(кролик - 0, волк - 1, волчица - 2), Координаты - (Х,У), Жизнь.
Заведите массив, список или ещё что хотите, куда будете пихать всех этих животных. Ну и, соответственно, пробегая каждый раз по массиву обрабатывайте своих животных. smile
PM MAIL   Вверх
Alex_Iz
Дата 26.4.2007, 06:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 25.4.2007

Репутация: нет
Всего: нет



Ну вам то легко сказать... А я ж в этом деле вообще не шарю.  smile 
Может поможете?  smile 
PM MAIL   Вверх
Ryoga
Дата 26.4.2007, 12:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 262
Регистрация: 20.9.2005

Репутация: 2
Всего: 6



Вы вообще не умеете писать на C++?
PM MAIL   Вверх
Alex_Iz
Дата 26.4.2007, 14:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 25.4.2007

Репутация: нет
Всего: нет



На самом простейшем уровне. К примеру смог бы написать что-то вроде "нарисовать фигуру" или "показать движение обЪекта"... Но такая прога для меня потолок. Просто "Программирование" у нас второстепеннный предмет, и я на нём не сосредотачиваюсь. Но эта курсовая - как кость в горле. У нас вся группа над ней стонет (у каждого своё задание). Поэтому и прошу помощи.
PM MAIL   Вверх
Alex_Iz
Дата 27.4.2007, 18:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 25.4.2007

Репутация: нет
Всего: нет



Ну же, помогите бедному студенту  smile кто как может...
PM MAIL   Вверх
Ryoga
Дата 27.4.2007, 22:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 262
Регистрация: 20.9.2005

Репутация: 2
Всего: 6



О, хорошо, что Вы что-то знаете. Помогу, как могу... но, всё я писать за Вас не буду, конечно...
Код

//объявим глобальный массив острова. вообще, лучше бы его из файла считывать, конечно - если препод будет на этом настаивать - переделаем.
int island[20][20] = {
{1,0,0,0,0,0,1,1,1,1,1,1,0,0,0,1,1,1,1,1}//определите сами массив. Из расчёта, что 0 - вода, 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(beast_type,int,int);//задаём конкретные параметры
  int RabbitAct();//действия кролика
  int WolfAct(Beast*,int);//действия волка
};
Beast::Beast()
{
  type=0;
  life=0;
  X=Y=-1;
};
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;//иди сюда
    ...
    case8:break;//никуда не ходи
  };
  if( rand()%10<5) return 0;//не плодить кролика
  return 1;//плодить кролика
};

int Beast::WolfAct(Beast *rabbits, n)//передаём массив с кроликами и их количество
{
};

//Дальше идёт основная функция запускаемая при старте - ну, Вы это, наверное, знаете...
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(1,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 i = 0;i<time;i++)
  {
    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);//цикл по всем волкам
  };
}

Мда, давно я ничего не писал на C++...
В общем, что-то типа такого... смысл понятен? Дальше сами...
З.Ы.: Код писался в сухую, так что, возможно, там есть ошибки. Проверяйте. Да, и я не знаю, подойдёт ли он для 3.1 - вообще, должен...
PM MAIL   Вверх
Alex_Iz
Дата 12.5.2007, 19:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 25.4.2007

Репутация: нет
Всего: нет



Изрядно я помучился с этой программой. Кое-что добавил, кое-что подправил, и вот что у меня получилось:

Код

#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);
  };

}


Хоть и нет ошибок при компиляции, но всё равно ничего не работает.
Уважаемый Ryoga или кто-нибудь, может подскажете в чём тут дело?

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Центр помощи | Следующая тема »


 




[ Время генерации скрипта: 0.1809 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.