Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 19.11.2015, 15:13   #1
Kcilika
Пользователь
 
Регистрация: 06.11.2013
Сообщений: 19
По умолчанию Помогите доработать код и исправить ошибки

Волчий остров размером 20х20 заселен дикими кроликами, волками и волчицами. Имеется по нескольку представителей каждого вида. Кролики довольно глупы: в каждый момент времени они с одинаковой вероятностью 1/9 передвигаются в один из восьми соседних квадратов (за исключением участков, ограниченных береговой линией) или просто сидят неподвижно. Каждый кролик с вероятностью 0,2 превращается в двух кроликов. Каждая волчица передвигается случайным образом, пока в одном из соседних восьми квадратов не окажется кролик, за которым она охотится. Если волчица и кролик оказываются в одном квадрате, волчица съедает кролика и получает одно очко. В противном случае она теряет 0,1 очка. Волки и волчицы с нулевым количеством очков умирают.
Kcilika вне форума Ответить с цитированием
Старый 19.11.2015, 15:15   #2
Kcilika
Пользователь
 
Регистрация: 06.11.2013
Сообщений: 19
По умолчанию

Код:
#include<iostream>
#include<vector>
#include <time.h>
#include <stdlib.h>
using namespace std;
class Animal 
{
private:
	int x;
	int y; 
	bool life;      
public:
	Animal()
	{
		x = 0;
		y = 0;
		life = true;
	}
	Animal(unsigned int newX, unsigned int newY)
	{
		x = newX;
		y = newY;
		life = true;
	}
	Animal(const Animal& that)
	{
		x = that.x;
		y = that.y;
		life = that.life;
	}
	void setX(unsigned int xA)
	{
		x = xA;
		return;
	}
	void setY(unsigned int yA)
	{
		y = yA;
		return;
	}
	void setLife(bool newLife)
	{
		life = newLife;
		return;
	}
	int getY() const
	{
		return y;
	}
	int getX() const
	{
		return x;
	}
	bool getLife() const
	{
		return life;
	}
	Animal& operator = (const Animal& that)
	{
		x = that.x;
		y = that.y;
		life = that.life;
		return *this;
	}
	double calcDistance(int x2, int y2)
	{
		double distance = sqrt((x - x2)*(x - x2) + (y - y2)*(y - y2));
		return distance;
	}
	// определяет занятость ближайших клеток
	void checkCoord(const std::vector<Rabbit>& vRabbit, const std::vector<Wolf>& vWolf,
		const Map& userMap, bool *poz)
	{
		int xA = getX();
		int yA = getY();
		int qr = vRabbit.size();
		int qw = vWolf.size();

		// массив позиций
		for (int iterat = 0; iterat < 8; iterat++)
		{
			poz[iterat] = true;    // все позиции свободны
		}
		// проверка на границы поля
		if ((xA - 1) < 1)
		{
			poz[0] = poz[7] = poz[6] = false;
		}
		if ((yA - 1) < 1)
		{
			poz[0] = poz[1] = poz[2] = false;
		}
		if ((xA + 1) > 20)
		{
			poz[2] = poz[3] = poz[4] = false;
		}
		if ((yA + 1) > 20)
		{
			poz[6] = poz[5] = poz[4] = false;
		}
		// проверка вестора зайцев
		for (int i = 0; i < qr; i++)
		{
			bool lifeR = vRabbit[i].getLife();
			if (lifeR == true)
			{
				int xR = vRabbit[i].getX();
				int yR = vRabbit[i].getY();

				if (((xA - 1) == xR) && ((yA - 1) == yR))
				{
					poz[0] = false;
				}
				if ((xA == xR) && ((yA - 1) == yR))
				{
					poz[1] = false;
				}
				if (((xA + 1) == xR) && ((yA - 1) == yR))
				{
					poz[2] = false;
				}
				if (((xA + 1) == xR) && (yA == yR))
				{
					poz[3] = false;
				}
				if (((xA + 1) == xR) && ((yA + 1) == yR))
				{
					poz[4] = false;
				}
				if ((xA == xR) && ((yA + 1) == yR))
				{
					poz[5] = false;
				}
				if (((xA - 1) == xR) && ((yA + 1) == yR))
				{
					poz[6] = false;
				}
				if (((xA - 1) == xR) && (yA == yR))
				{
					poz[7] = false;
				}
			}
		}
		// проверка вектора волков
		for (int i = 0; i < qw; i++)
		{
			bool lifeW = vWolf[i].getLife();
			if (lifeW == true)
			{
				int xW = vWolf[i].getX();
				int yW = vWolf[i].getY();

				if (((xA - 1) == xW) && ((yA - 1) == yW))
				{
					poz[0] = false;
				}
				if ((xA == xW) && ((yA - 1) == yW))
				{
					poz[1] = false;
				}
				if (((xA + 1) == xW) && ((yA - 1) == yW))
				{
					poz[2] = false;
				}
				if (((xA + 1) == xW) && (yA == yW))
				{
					poz[3] = false;
				}
				if (((xA + 1) == xW) && ((yA + 1) == yW))
				{
					poz[4] = false;
				}
				if ((xA == xW) && ((yA + 1) == yW))
				{
					poz[5] = false;
				}
				if (((xA - 1) == xW) && ((yA + 1) == yW))
				{
					poz[6] = false;
				}
				if (((xA - 1) == xW) && (yA == yW))
				{
					poz[7] = false;
				}
			}
		}
		return;
	}
	// возвращает координаты рандомной свободной клетки
	void findFreeSpot(int &newX, int &newY, bool *poz)
	{
		int xA = getX();
		int yA = getY();
		newX = getX();
		newY = getY();

		int summpoz = 0;
		for (int j = 0; j < 8; j++)
		{
			if (poz[j] == false)
			{
				summpoz++;
			}
		}
		if (summpoz == 8)
		{
			return;
		}
		int randpoz = rand() % 8;
		int allpoz = 0;
		while (allpoz < 8)
		{
			if (poz[randpoz] == true)
			{
				if (randpoz == 0)
				{
					newX = xA - 1;
					newY = yA - 1;
					break;
				}
				if (randpoz == 1)
				{
					newX = xA;
					newY = yA - 1;
					break;
				}
				if (randpoz == 2)
				{
					newX = xA + 1;
					newY = yA - 1;
					break;
				}
				if (randpoz == 3)
				{
					newX = xA + 1;
					newY = yA;
					break;
				}
				if (randpoz == 4)
				{
					newX = xA + 1;
					newY = yA + 1;
					break;
				}
				if (randpoz == 5)
				{
					newX = xA;
					newY = yA + 1;
					break;
				}
				if (randpoz == 6)
				{
					newX = xA - 1;
					newY = yA + 1;
					break;
				}
				if (randpoz == 7)
				{
					newX = xA - 1;
					newY = yA;
					break;
				}
			}
			else
			{
				allpoz++;
				randpoz++;
				if (randpoz > 7)
				{
					randpoz = 0;
				}
			}
		}
		return;
	};
	// движение
	void move(const std::vector<Rabbit>& vRabbit, const std::vector<Wolf>& vWolf,
		const Map& userMap)
	{
		bool poz[8];
		checkCoord(vRabbit, vWolf, userMap, poz);
		int newX, newY;
		findFreeSpot(newX, newY, poz);
		x = newX;
		y = newY;
	}
};
Kcilika вне форума Ответить с цитированием
Старый 19.11.2015, 15:15   #3
Kcilika
Пользователь
 
Регистрация: 06.11.2013
Сообщений: 19
По умолчанию

Код:
class Rabbit :public Animal
{
	int countToBirth;  // время, оставщееся до рождения новой жертвы 
public:
	Rabbit(int newX, int newY) : Animal(newX, newY), countToBirth(0)
	{
	}
	Rabbit() :Animal(), countToBirth(0)
	{
	}
	int getCountToBirth() const
	{
		return countToBirth;
	}
	void setCountToBirth(int temp)
	{
		countToBirth = temp;
	}
	friend std::istream& operator >> (std::istream& in, Rabbit& r)
	{
		int newX;
		int newY;
		bool newLife;
		in >> newX >> newY >> newLife >> r.countToBirth;
		r.setX(newX);
		r.setY(newY);
		r.setLife(newLife);
		return in;
	};
	friend std::ostream& operator << (std::ostream& out, const Rabbit& r)
	{
		int x = r.getX();
		int y = r.getY();
		bool life = r.getLife();
		out << x << " " << y << " " << life << " " << r.countToBirth << std::endl;
		return out;
	}
	Rabbit& operator = (const Rabbit& that)
	{
		Animal::operator = (that);
		countToBirth = that.countToBirth;
		return *this;
	}
};
class Wolf : public Animal
{
private:
		int hunger;    // время, которое волк не ел
		int feedCount; // количество съеденных волком жертв
public:
	Wolf(unsigned int newX, unsigned int newY) : Animal(newX, newY), hunger(0), feedCount(0) 
	{
	}
	Wolf() :Animal(), hunger(0), feedCount(0)
	{
	}
	void setFeedCount(int tempFeedCount)
	{
		feedCount = tempFeedCount;
		return;
	}
	//Установить количество ходов, которое волк может прожить без еды
	void setHunger(int tempHunger)
	{
		hunger = tempHunger;
		return;
	}
	//Получить количество ходов, которое волк может прожить без еды
	int getHunger() const
	{
		return hunger;
	}
	//Получить количество зайцев, которое волку необходимо съесть для рождения нового волка
	int getFeedCount() const
	{
		return feedCount;
	}
	void instinct(const std::vector<Rabbit> vRabbit, const std::vector<Wolf> vWolf, const Map userMap, int numerR,
		int &newX, int &newY)
	{
		int qr = vRabbit.size();
		int qw = vWolf.size();
		newX = getX();
		newY = getY();
		bool poz[8];
		Animal::checkCoord( vRabbit, vWolf, userMap, poz);
		double pozdist[8];
		if (poz[0] == true)
		{
			pozdist[0] = vRabbit[numerR].calcDistance(getX() - 1, getY() - 1);
		}
		if (poz[1] == true)
		{
			pozdist[1] = vRabbit[numerR].calcDistance(getX(), getY() - 1);
		}
		if (poz[2] == true)
		{
			pozdist[2] = vRabbit[numerR].calcDistance(getX() + 1, getY() - 1);
		}
		if (poz[3] == true)
		{
			pozdist[3] = vRabbit[numerR].calcDistance(getX() + 1, getY());
		}
		if (poz[4] == true)
		{
			pozdist[4] = vRabbit[numerR].calcDistance(getX() + 1, getY() + 1);
		}
		if (poz[5] == true)
		{
			pozdist[5] = vRabbit[numerR].calcDistance(getX(), getY() + 1);
		}
		if (poz[6] == true)
		{
			pozdist[6] = vRabbit[numerR].calcDistance(getX() - 1, getY() + 1);
		}
		if (poz[7] == true)
		{
			pozdist[7] = vRabbit[numerR].calcDistance(getX() - 1, getY());
		}
		double minDist = 20 * 20;
		int moveNumer = -1;
		for (int it = 0; it < 8; it++)
		{
			if ((poz[it] == true) && (pozdist[it] < minDist))
			{
				minDist = pozdist[it];
				moveNumer = it;
			}
		}
		if (moveNumer == 0)
		{
			newX = getX() - 1;
			newY = getY() - 1;
		}
		if (moveNumer == 1)
		{
			newX = getX();
			newY = getY() - 1;
		}
		if (moveNumer == 2)
		{
			newX = getX() + 1;
			newY = getY() - 1;
		}
		if (moveNumer == 3)
		{
			newX = getX() + 1;
			newY = getY();
		}
		if (moveNumer == 4)
		{
			newX = getX() + 1;
			newY = getY() + 1;
		}
		if (moveNumer == 5)
		{
			newX = getX();
			newY = getY() + 1;
		}
		if (moveNumer == 6)
		{
			newX = getX() - 1;
			newY = getY() + 1;
		}
		if (moveNumer == 7)
		{
			newX = getX() - 1;
			newY = getY();
		}
	}
};
Kcilika вне форума Ответить с цитированием
Старый 19.11.2015, 15:16   #4
Kcilika
Пользователь
 
Регистрация: 06.11.2013
Сообщений: 19
По умолчанию

Код:
class Map
{
public:
	int userHungerTime;    // время, через которое волк умрёт без еды
	int userBirthTime;     // время, через которое кролик рожает нового
	int userFeedCount;     // количество съеденных кроликов, необходимых для рождения нового волка
	int map[20][20]
	{
		{ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
		{ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
		{ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
		{ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
		{ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
		{ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
		{ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
		{ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
		{ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
		{ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
		{ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
		{ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
		{ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
		{ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
		{ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
		{ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
		{ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
		{ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
		{ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
		{ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }
	};
	friend std::istream& operator >> (std::istream& in, Map& userMap)
	{
		in >>userMap.userHungerTime >>
			userMap.userBirthTime >> userMap.userFeedCount;
		return in;
	};
	friend std::ostream& operator << (std::ostream& out, const Map& userMap)
	{
		out <<userMap.userHungerTime << " " <<
			userMap.userBirthTime << " " << userMap.userFeedCount << std::endl;
		return out;
	};
};
Kcilika вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
нужно доработать футбольный сайт и исправить ошибки Radmir-14 Фриланс 2 01.02.2015 20:46
Работа со строками Код рабочий но нужно исправить ошибки но у меня ни чего не получается Servin Паскаль, Turbo Pascal, PascalABC.NET 0 24.02.2013 18:34
C++. Есть код нужно исправить ошибки megavolt91 Общие вопросы C/C++ 6 06.06.2009 19:27
C++. Есть код нужно исправить ошибки megavolt91 Помощь студентам 1 01.06.2009 18:38