Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
Другие темы раздела
C++ Как вытащить значение с enum? http://www.cyberforum.ru/cpp-beginners/thread934525.html
У меня перечисленны в enum допустимые типы автомобилей и потом количество мест для каждого из них. Как правильно в классе написать конструктор, который будет по заданомму типу автомобиля брать количество мест для посадки? enum CarType { Car_Gaz, Car_Limo, Car_Jip, Car_Audi8, Car_Oka, Car_MAX,
C++ Реализация бинарного дерева поиска Задача: Реализация бинарного дерева поиска Компилируется нормально, а при запуске выбивает ошибку : "Необработанное исключение по адресу 0x00C83867 в FindBinaryTree.exe: 0xC0000005: нарушение прав доступа при чтении по адресу 0xCDCDCDCD." Помогите пожалуйста, занялся изучением алгоритмов и структур данных просто #include <iostream> using namespace std; struct Node { http://www.cyberforum.ru/cpp-beginners/thread934510.html
Вышел за пределы C++
В MVS я первый раз пытаюсь рондомно вывести массив, но выводит ошибку и указывает на цикл, где я там мог выйти за пределы? using namespace std; int main() { srand(time(NULL)); const int n=10; int M; for (int i=0; i<n; i++) {
Чтение начиная с конца файла C++
Всем добрый вечер! Программа создает самопальный класс список как в STL и пишет/ читает с файла Вот результат работы: . Считывать в обратном порядке, затем переворачивать не предлагайте. Помогите пожалуйста заставить ее читать символы в обратном порядке. Пробовал вносить в функцию чтения такие изменения( помечены !! в коментариях) , но программа висла при запуске: Режим ios::ate почему то...
C++ cin.ignore http://www.cyberforum.ru/cpp-beginners/thread934485.html
Как работает эта функция? cin.ignore (1, '#');
C++ Ошибка при компиляции IDE MSVS 2012. Почитал первые страницы книги, решил поэкспериментировать. При компиляции (F5) сначала пишет, что "Следующий проект устарел - Debug Win32", а потом пишет, что "в ходе построения произошла ошибка". Вот код: #include <iostream> main() { using namespace std; int a, b, name; cout << "Как тебя зовут?" << endl; подробнее

Показать сообщение отдельно
Sublimee
7 / 7 / 0
Регистрация: 14.11.2012
Сообщений: 67
06.08.2013, 22:44     Хищник-жертва
На прямоугольном поле случайным образом размещаются "хищники" и "жертвы", после чего они поочередно делают ходы. Ход жертвы – случайное перемещение на соседнюю клетку, раз в несколько ходов жертва порождает еще одну жертву на соседней клетке. Ход хищника – уничтожение жертвы на соседней клетке, если это возможно, иначе –случайное перемещение на соседнюю клетку. Уничтожив несколько жертв, хищник порождает еще одного хищника на соседней клетке. Оставшись без еды на несколько ходов, хищник умирает. Реализовать на экране процесс борьбы хищников и жертв. Программа должна позволять сохранять вид игрового поля для использования его в будущем.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
 // main.cpp
#include <fstream>
#include <iostream>
#include <vector>
#include "animal.h"
#include <time.h>
#include <stdlib.h>
#include "AnimalException.h"
void start();
void load();
using namespace std;
 
int main (void)
{
    srand ( static_cast<unsigned>( time(0) ) ); 
    // Комментарий при старте игры
    cout << "Hello. This is ''Wolf - Rabbit'' model." << endl 
        << "Type '1' if you want to start new model." << endl
        << "Type '3' if you want to load model." << endl
        << "Type '5' if you want to quit program" << endl;
    // Ожидание правильной команды и её последующее выполнение
    unsigned int command;
    while ( true )
    {
        cout << "Please, enter command: ";
        cin >> command ;        
        if ( command == 1 )
        {
            try
            {
                start();
            }
            catch ( const AnimalInputException& e)
            {
                cout << e.what() << endl;
                cin.clear();
                cin.sync();
            }           
        }
        else if ( command == 3 )
        {
            try
            {
                load();
            }
            catch ( const AnimalFileException& e )
            {
                cout << e.what() << endl;
            }
            catch ( const AnimalInputException& e )
            {
                cout << e.what() << endl;
            }           
        }
        else if ( command == 5 )
        {
            exit( 5 );
        }
        else
        {
            cout << "Try again" << endl;
            cin.clear();
            cin.sync();
        }
    }
    return 0;
}
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
// animal.h
#ifndef ANIMAL_H
#define ANIMAL_H
 
#include <vector>
#include <fstream>
#include "Map.h"
 
class Rabbit;
class Wolf;
 
class Animal
{
    unsigned int x; // координата х животного
    unsigned int y; // координата y животного
    bool life;      // параметр жизни: 1 - жив, 0 - мертв
public:
    Animal( unsigned int newX, unsigned int newY );
    Animal();
    Animal( const Animal& that );
    virtual ~Animal() {};
 
    // движение
    void move(const std::vector<Rabbit>& vRabbit, const std::vector<Wolf>& vWolf, 
                   const Map& userMap);
    // вычисление дистанции между двумя животными
    double calcDistance( unsigned int x2, unsigned int y2 );
    unsigned int getX() const;      // возвращает координату x
    unsigned int getY() const;      // возвращает координату y
    void setX( unsigned int xA );   // задание координаты x
    void setY( unsigned int yA );   // задание координаты y
    void setLife( bool newLife );   // задание параметра life
    bool getLife() const;           // возвращет параметр life
    // определяет занятость ближайших клеток
    void checkCoord( const std::vector<Rabbit>& vRabbit, const std::vector<Wolf>& vWolf,
                        const Map& userMap, bool *poz );
    // возвращает координаты рандомной свободной клетки
    void findFreeSpot( unsigned int &newX, unsigned int &newY, bool *poz );
    Animal& operator = (const Animal& that)
    {
        x = that.x;
        y = that.y;
        life = that.life;
        return *this;
    }
};
 
class Wolf:public Animal
{
    unsigned int hunger;    // время, которое волк не ел
    unsigned int feedCount; // количество съеденных волком жертв
public:
    Wolf( unsigned int newX, unsigned int newY ):
        Animal( newX, newY ), hunger( 0 ), feedCount( 0 ){}
    Wolf():Animal(), hunger( 0 ), feedCount( 0 ){}
    // приближение к ближайшему зайцу в диапазаоне
    void  instinct( std::vector<Rabbit> vRabbit, std::vector<Wolf> vWolf, const Map userMap, 
                    int numerR, unsigned int &newX, unsigned int &newY );
    unsigned int getFeedCount() const;              // получить количество съеденных волком жертв
    unsigned int getHunger() const;                 // получить время, которое волк не ел
    void setFeedCount( unsigned int feedCount );    // задать количество съеденных волком жертв
    void setHunger( unsigned int tempHunger );      // задать время, которое волк не ел
    friend std::istream& operator >> ( std::istream& in , Wolf& r )
    {
        unsigned int newX;
        unsigned int newY;
        bool newLife;
        in >> newX >> newY >> newLife >> r.hunger >> r.feedCount;
        r.setX( newX );
        r.setY( newY );
        r.setLife( newLife );
        return in;
    };
    friend std::ostream& operator << ( std::ostream& out , const Wolf& r )
    {
        unsigned int x = r.getX();
        unsigned int y = r.getY();
        bool life = r.getLife();
        out << x << " " << y << " " << life << " " << r.hunger << " " << r.feedCount << std::endl;
        return out;
    };
    Wolf& operator = (const Wolf& that)
    {
        Animal::operator = ( that );
        hunger = that.hunger;
        feedCount = that.feedCount;
        return *this;
    }
};
 
class Rabbit:public Animal
{
    unsigned int countToBirth;  // время, оставщееся до рождения новой жертвы 
public:
    Rabbit( unsigned int newX, unsigned int newY ): Animal( newX, newY ), countToBirth(0){}
    Rabbit():Animal(),countToBirth(0){}
    unsigned int getCountToBirth () const
    {
        return countToBirth;
    }
    void setCountToBirth ( unsigned int temp )
    {
        countToBirth = temp;
    }
    friend std::istream& operator >> ( std::istream& in , Rabbit& r )
    {
        unsigned int newX;
        unsigned 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 )
    {
        unsigned int x = r.getX();
        unsigned 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;
    }
};
#endif
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
// map.h
#ifndef MAP_H
#define MAP_H
 
struct Map
{
    // задаются пользователем:
    unsigned int userLength;        // длина поля
    unsigned int userWidth;         // ширина поля
    unsigned int userHungerTime;    // время, через которое волк умрёт без еды
    unsigned int userBirthTime;     // время, через которое кролик рожает нового
    unsigned int userFeedCount;     // количество съеденных кроликов, необходимых для рождения нового волка
 
    friend std::istream& operator >> ( std::istream& in , Map& userMap )
    {
        in >> userMap.userLength >> userMap.userWidth >> userMap.userHungerTime >>  
              userMap.userBirthTime >> userMap.userFeedCount;
        return in;
    };
    friend std::ostream& operator << ( std::ostream& out , const Map& userMap )
    {
        out << userMap.userLength << " " << userMap.userWidth << " " << userMap.userHungerTime << " " <<
            userMap.userBirthTime << " " << userMap.userFeedCount << std::endl;
        return out;
    };
};
 
#endif
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
// animal.cpp
#include "animal.h"
#include <stdlib.h>
#include <time.h>
#include "Map.h"
 
// методы базового класса
Animal::Animal()
{
    x = 0;
    y = 0;
    life = true;
}
Animal::Animal( unsigned int newX, unsigned int newY )
{
    x = newX;
    y = newY;
    life = true;
}
Animal::Animal( const Animal& that )
{
    x = that.x;
    y = that.y;
    life = that.life;
}
void Animal::setX( unsigned int xA )
{
    x = xA;
    return;
}
void Animal::setY( unsigned int yA )
{
    y = yA;
    return;
}
void Animal::setLife( bool newLife )
{
    life = newLife;
    return;
}
unsigned int Animal::getY() const
{
    return y;
}
unsigned int Animal::getX() const
{
    return x;
}
bool Animal::getLife() const
{
    return life;
}
// вычисление дистанции между двумя животными
double Animal::calcDistance( unsigned int x2, unsigned int y2 )
{
    double distance = sqrt(( x - x2 )*( x - x2 )+( y - y2 )*( y - y2 ));
    return distance;
}
// определяет занятость ближайших клеток
void Animal::checkCoord( const std::vector<Rabbit>& vRabbit, const std::vector<Wolf>& vWolf,
                        const Map& userMap, bool *poz )
{
    unsigned int xA = getX();
    unsigned int yA = getY();
    unsigned int qr = vRabbit.size();
    unsigned 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 ) > userMap.userLength )
    {
        poz[2] = poz[3] = poz[4] = false;
    }
    if ( ( yA + 1 ) > userMap.userWidth )
    {
        poz[6] = poz[5] = poz[4] = false;
    }
    // проверка вестора зайцев
    for ( unsigned int i = 0; i < qr; i++ )
    {
        bool lifeR = vRabbit[i].Animal::getLife();
        if ( lifeR == true )
        {
            int xR = vRabbit[i].Animal::getX();
            int yR = vRabbit[i].Animal::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 (unsigned int i = 0; i < qw; i++ )
    {
        bool lifeW = vWolf[i].Animal::getLife();
        if ( lifeW == true )
        {
            int xW = vWolf[i].Animal::getX();
            int yW = vWolf[i].Animal::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 Animal::findFreeSpot( unsigned int &newX, unsigned int &newY, bool *poz )
 {
    unsigned int xA = getX();
    unsigned 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 Animal::move( const std::vector<Rabbit>& vRabbit, const std::vector<Wolf>& vWolf, 
                   const Map& userMap )
{
    bool poz[8];
    checkCoord( vRabbit, vWolf, userMap, poz );
    unsigned int newX, newY;
    findFreeSpot( newX, newY, poz );
    x = newX;
    y = newY;
}
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
// wolf.cpp
#include "animal.h"
#include <stdlib.h>
#include <time.h>
#include "Map.h"
 
//Методы волков
//Установить количество зайцев, которое волку необходимо съесть для рождения нового волка
void Wolf::setFeedCount( unsigned int tempFeedCount )
{
    feedCount = tempFeedCount;
    return;
}
//Установить количество ходов, которое волк может прожить без еды
void Wolf::setHunger( unsigned int tempHunger )
{
    hunger = tempHunger;
    return;
}
//Получить количество ходов, которое волк может прожить без еды
unsigned int Wolf::getHunger() const
{
    return hunger;
}
//Получить количество зайцев, которое волку необходимо съесть для рождения нового волка
unsigned int Wolf::getFeedCount() const
{
    return feedCount;
}
void Wolf::instinct( std::vector<Rabbit> vRabbit, std::vector<Wolf> vWolf, const Map userMap, int numerR, 
                    unsigned int &newX, unsigned int &newY  )
{
    unsigned int qr = vRabbit.size();
    unsigned 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 = userMap.userLength * userMap.userWidth;
    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();
    }           
}
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
// menu.cpp
#include <iostream>
#include <vector>
#include "animal.h"
#include "Map.h"
using namespace std;
 
void start();
void save( vector<Rabbit> vRabbit, vector<Wolf> vWolf, Map userMap );
void load();
void resume( vector<Rabbit> &vRabbit, vector<Wolf> &vWolf, Map userMap );
 
void menu( vector<Rabbit> vRabbit, vector<Wolf> vWolf, Map userMap )
{
    unsigned int command;
    //cout << "Type '1' if you want to start new model" << endl
    //   << "Type '2' if you want to save model" << endl 
    //   << "Type '3' if you want to load model" << endl
    //   << "Type '0' if you want to resume" << endl
    //   << "Type '5' if you want to quit" << endl; 
    cout << "Commands: '1'-start_new; '2'-save; '3'-load; '0'-resume; '5'-quit." << endl;
    while ( true )
    {
        cout << "Please, enter command: ";
        cin >> command;
        if (command == 1)
        {
            start();                            // старт новой игры
        }
        else if (command == 2 )
        {
            save( vRabbit, vWolf, userMap );    // сохранение игры
        }
        else if (command == 3)                   
        {
            load();                             // загрузка из файла
        }
        else if (command == 0)
        {
            resume( vRabbit, vWolf, userMap );  // сделать ход
        }
        else if (command == 5)
        {
            exit( 5 );                          // выход    
        }
        else
        {
            cout << "Try again" << endl;
            cin.clear();
            cin.sync();
        }
    }
}
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
// resume.cpp
#include <iostream>
#include "animal.h"
#include <vector>
#include "Map.h"
using namespace std;
void menu( vector<Rabbit> vRabbit, vector<Wolf> vWolf, Map userMap );
// 
void resume( vector<Rabbit> &vRabbit, vector<Wolf>& vWolf, Map userMap )
{
    // наличие чумы на данной итерации
    int chancePlague = rand() % 10;
    if ( chancePlague < 2 )
    {
        cout << endl << "PLAGUE TIME! " << endl;
    }
 
    int sizeRabbit = vRabbit.size();
    cout << endl; 
    int i;
    // в цикле обрабатывается вектор зайцев: живые зайцы рожают новых, иначе двигаются в свободную клетку
    for ( i = 0; i < sizeRabbit; i++ )
    {
        if ( vRabbit[i].getLife() == true )
        {
            bool lifeR = vRabbit[i].getLife();
            if ( vRabbit[i].getCountToBirth() == userMap.userBirthTime )
            {
                unsigned int xR = vRabbit[i].getX();
                unsigned int yR = vRabbit[i].getY();
                bool poz[8];
                vRabbit[i].checkCoord( vRabbit, vWolf, userMap, poz );
                unsigned int newX, newY;
                vRabbit[i].findFreeSpot( newX, newY, poz );
                if ( ( newX != xR ) || ( newY != yR ) )
                {
                    Rabbit tempRabbit ( newX, newY );
                    vRabbit.push_back( tempRabbit );
                    cout << "Rabbit " << vRabbit.size() << " (" << newX << ";" 
                        << newY << ") has been born from Rabbit " << i + 1 
                        << " (" << xR << ";" << yR << ")"<< endl;
                }
                vRabbit[i].setCountToBirth ( 0 );
            }
            else 
            {
                vRabbit[i].move( vRabbit, vWolf, userMap );
            }           
            int xR = vRabbit[i].Animal::getX();
            int yR = vRabbit[i].Animal::getY();
            vRabbit[i].setCountToBirth ( vRabbit[i].getCountToBirth() + 1 );
            //cout<< "Rabbit "<< i+1 << " "<< vRabbit[i].getX()<< " " << vRabbit[i].getY() << endl;
        }
    }
 
    int sizeWolf = vWolf.size();
    // в цикле обрабатывается вектор волков: если рядом есть заяц, 
    // то он съедается, иначе, если зайцы попадают в заданный диапазон чутья, 
    //то волк движется к ближайшему зайцу, иначе волк движется в любую свободную клетку
    for ( int j = 0; j < sizeWolf; j++ )
    {
        if ( vWolf[j].getLife() == true )
        {
            unsigned int xW = vWolf[j].Animal::getX();
            unsigned int yW = vWolf[j].Animal::getY();
            bool feedCheck = false;
            for ( i = 0; i < sizeRabbit; i++ )
            {                
                bool lifeR = vRabbit[i].Animal::getLife();
                if ( lifeR == true )
                {
                    int xR = vRabbit[i].Animal::getX();
                    int yR = vRabbit[i].Animal::getY();
                    double distance = vRabbit[i].calcDistance( xW, yW );
                    if (distance <= sqrt( 2 ) )
                    {
                        vRabbit[i].setLife( false );
                        cout << "Rabbit " << i + 1 << " (" << xR << ";" << yR 
                            << ") has been eaten by Wolf " << j + 1 
                            << " (" << xW << ";" << yW << ")" << endl;
                        feedCheck = true;
                        vWolf[j].setHunger( 0 );
                        vWolf[j].setFeedCount( vWolf[j].getFeedCount() + 1 );
                        if ( vWolf[j].getFeedCount() >= userMap.userFeedCount )
                        {
 
                            bool poz[8];
                            vWolf[j].checkCoord( vRabbit, vWolf, userMap, poz );
                            unsigned int newX, newY;
                            vWolf[j].findFreeSpot( newX, newY, poz );
                            if (( newX != xW ) || ( newY != yW )) 
                            {   
                                vWolf.push_back( Wolf( newX, newY ));
                                cout << "Wolf " << vWolf.size() << " (" << newX << ";" << newY 
                                    << ") has been born from Wolf " << j+1  
                                    << " (" << xW << ";" << yW << ")" << endl;                              
                            }
                            vWolf[j].setFeedCount( 0 );
                        }   
                        break;
                    }               
                }       
            }
            if ( feedCheck == false )
            {
                unsigned int xW = vWolf[j].Animal::getX();
                unsigned int yW = vWolf[j].Animal::getY();
                double distance;
                double iRange = 0.04 * userMap.userLength * userMap.userWidth;
                bool checkRange = false;
                double minDist = iRange + 1;
                int numerR = -1;
                for ( int rTemp = 0; rTemp < sizeRabbit; rTemp++ )
                {
                    int xR = vRabbit[rTemp].Animal::getX();
                    int yR = vRabbit[rTemp].Animal::getY();
                    bool lifeR = vRabbit[rTemp].Animal::getLife();
                    if ( lifeR == true )
                    {
                        distance = vRabbit[rTemp].calcDistance(xW, yW);
                        if ( distance <= minDist )
                        {
                            minDist = distance;
                            numerR = rTemp;
                        }
                        if ( distance <= iRange )
                        {
                            checkRange = true;
                        }
                    }
                }
                if ( ( checkRange == true ) && ( numerR != -1 ) )
                {
                    unsigned int newX, newY;
                    vWolf[j].instinct( vRabbit, vWolf, userMap, numerR, newX, newY );
                    vWolf[j].setX( newX );
                    vWolf[j].setY( newY );
                    /*cout << "Wolf " << j +1 << " ("<< newX << ";" << newY << ")"<<" k Rabbit " << numerR + 1
                        <<" (" <<vRabbit[numerR].Animal::getX() <<";"<< vRabbit[numerR].Animal::getY()<< ")" << endl; */
                }
                else 
                {
                    vWolf[j].move( vRabbit, vWolf, userMap );
                    //cout<< "Wolf  "<< j+1 << " "<< vWolf[j].getX()<< " " << vWolf[j].getY() << endl;
                }                   
            }           
            if ( vWolf[j].getHunger() == userMap.userHungerTime)
            {
                vWolf[j].setLife( false );
                cout << "Wolf "<< j + 1 << " (" << xW << ";" << yW << ")"  << " died from hunger" << endl;
            }
            vWolf[j].setHunger( vWolf[j].getHunger() + 1 ); 
        }
    }
    
    // в некотром радиусе от случайной точки умирают все животные
    if ( chancePlague < 2 )
    {
        int plagueCount = 0;
        int pX = rand() % userMap.userLength + 1;
        int pY = rand() % userMap.userWidth + 1;
        double pRange = (rand() % ( userMap.userLength * userMap.userWidth ) + 1);
        pRange *= 0.05;
        cout << endl;
        for ( i = 0; i < sizeRabbit; i++ )
        {
            bool lifeR = vRabbit[i].getLife();
            if ( lifeR == true )
            {
                double distance = vRabbit[i].calcDistance( pX, pY );
                if ( distance <= pRange )
                {
                    vRabbit[i].setLife( false );
                    cout << "Rabbit " << i + 1 << " died from plague" << endl;
                    plagueCount ++;
                }
            }
        }
        for ( int j = 0; j < sizeWolf; j++ )
        {
            bool lifeW = vWolf[j].getLife();
            if ( lifeW == true )
            {
                int xW = vWolf[j].Animal::getX();
                int yW = vWolf[j].Animal::getY();
                double distance = vWolf[j].calcDistance( pX, pY);
                if ( distance <= pRange)
                {
                    vWolf[j].setLife( false );
                    cout << "Wolf " << j + 1 << " died from plague" << endl;
                    plagueCount ++;
                }
            }
        }
        cout << plagueCount << " animals died from plague" << endl;
    }   
    cout << endl;
    menu ( vRabbit, vWolf, userMap );
}
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
// start.cpp
#include <iostream>
#include "Map.h"
#include "animal.h"
#include <time.h>
#include <stdlib.h>
#include "AnimalException.h"
using namespace std;
void menu( vector<Rabbit> vRabbit, vector<Wolf> vWolf, Map userMap );
void start()
{
    Map userMap;
 
    //userMap.userLength = 1;
    //userMap.userWidth = 1;
    do
    {
        // ввод длины поля
        cout << "Enter length of field: ";
        cin >> userMap.userLength;
        if ( ( !cin ) || ( userMap.userLength < 1 ) )
        {
            throw AnimalInputException();
        }
 
        // ввод ширины поля
        cout << "Enter width of field: ";
        cin >> userMap.userWidth;
        if ( ( !cin ) || ( userMap.userWidth < 1 ) )
        {
            throw AnimalInputException();
        }
        if ( ( userMap.userLength == 1 ) && ( userMap.userWidth == 1 ) )
        {
            cout << "Too small field to set 2 animals. Try again." << endl;
        }
    }
    while ( ( userMap.userLength == 1 ) && ( userMap.userWidth == 1 ) );
 
    // ввод времени, которое волк может прожить без еды
    cout << "Enter time which wolf can survive without food: ";
    cin >> userMap.userHungerTime;
    if ( ( !cin ) || ( userMap.userHungerTime < 1 ) )
    {
        throw AnimalInputException();
    }
 
    //  ввод времени, через которое кролик рожает нового
    cout << "Enter time needed for new rabbit to be born: ";
    cin >> userMap.userBirthTime;
    if ( ( !cin ) || ( userMap.userBirthTime < 1 ) )
    {
        throw AnimalInputException();
    }
 
    // ввод количества съеденных волком кроликов, 
    // необходимых для рождения нового волка
    cout << "Enter number of rabbits needed for new wolf to be born: ";
    cin >> userMap.userFeedCount;
    if ( ( !cin ) || ( userMap.userFeedCount < 1 ) )
    {
        throw AnimalInputException();
    }
 
    // создание первого волка и зайца, размещение их на поле
    vector<Rabbit> vRabbit; 
    unsigned int xRS = rand() % userMap.userLength + 1;
    unsigned int yRS = rand() % userMap.userWidth + 1;
    cout << endl << "First Rabbit (" << xRS << ";"<< yRS << ")" << endl;
    Rabbit rabbitStart( xRS, yRS );
    vRabbit.push_back( rabbitStart );
    vector<Wolf> vWolf;
    unsigned int xWS = rand() % userMap.userLength + 1;
    unsigned int yWS = rand() % userMap.userWidth + 1;
    while ( ( xRS == xWS ) && ( yRS == yWS ) )
    {
        xWS = rand() % userMap.userLength + 1;
        yWS = rand() % userMap.userWidth + 1;
    }
    cout << "First Wolf (" << xWS << ";" << yWS << ")" << endl << endl;
    Wolf wolfStart( xWS, yWS );
    vWolf.push_back( wolfStart );
    menu( vRabbit, vWolf, userMap );
}
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
// save.cpp
#include <fstream>
#include <iostream>
#include "animal.h"
#include <vector>
#include "Map.h"
using namespace std;
void menu( vector<Rabbit> vRabbit, vector<Wolf> vWolf, Map UserMap );
void save( vector<Rabbit> vRabbit, vector<Wolf> vWolf, Map userMap )
{
    ofstream out ( "save.txt" );
    // обработка ошибки создания файла сохранения
    if ( !out )
    {
        cerr << "Can't create Saveile!";
        menu( vRabbit, vWolf, userMap );
    }
    // определение размера вектора кроликов
    int qr = vRabbit.size();
    // определение размера вектора волков
    int qw = vWolf.size();
    // вывод в файл параметров игры и размеров векторов кроликов и волков
    out << userMap <<  qr << " " << qw << endl;
    // запись в файл информации о кроликах
    for (int i = 0; i < qr; i++ )
    {
        out << vRabbit[i] << endl;
    }
    // запись в файл информации о волках
    for (int i = 0 ; i < qw ; i++ )
    {
        out << vWolf[i] << endl;
    }
    // уведомление об успешном сохранение
    cout << "File with all content has been saved!" << endl;
    return;
}
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
// load.cpp
#include <fstream>
#include "animal.h"
#include <vector>
#include "Map.h"
#include "AnimalException.h"
using namespace std;
void menu( vector<Rabbit> vRabbit, vector<Wolf> vWolf, Map UserMap );
void load()
{
    // файл с сохранением
    ifstream in( "save.txt" ); // файл с сохранением
    // проверка открытия файла
    if ( !in.is_open() )
    {
        throw AnimalFileException();
    } 
    Map userMap;
    vector<Rabbit> vRabbit; 
    vector<Wolf> vWolf;
    Rabbit iRabbit; 
    Wolf jWolf;
    unsigned int qr; // размер вектора кроликов
    unsigned int qw; // размер вектора волков
    in >> userMap >> qr >> qw; // чтение параметров игры и размеров векторов кроликов и волков
    // проверка ошибок чтения параметров игры
    if ( !in )
    { 
        throw AnimalInputException();
    }
    // заполнение вектора кроликов
    for ( unsigned int i = 0; i < qr; i++ )
    {
        // чтение информации об очередном зайце
        in >> iRabbit;
        // проверка ошибки чтения информации о кроликах
        if ( !in ) 
        { 
            throw AnimalInputException();
        }
        vRabbit.push_back( iRabbit );
    }
    // заполнение вектора волков
    for ( unsigned int j = 0; j < qw; j++ )
    {
        // чтение информации об очередном волке
        in >> jWolf;
        // проверка ошибки чтения информации о
        if ( !in ) 
        { 
            throw AnimalInputException();
        }
        vWolf.push_back( jWolf );
    }
    menu( vRabbit, vWolf, userMap ); // вызов меню
    return;
}
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
// animalException.h
#ifndef ANIMALEXCEPTION_H
#define ANIMALEXCEPTION_H
#include <string>
#include <exception>
// обработка ошибки открытия файла
class AnimalFileException: public std::exception
{
public:
   AnimalFileException() : std::exception() {};
   ~AnimalFileException() {};
   const char* what() const throw()
   { 
      return "Input file error"; 
   }
};
// обработка ошибки чтения данных
class AnimalInputException: public std::exception
{
public:
    AnimalInputException() : std::exception() {};
//  ~AnimalInputException() {};
    const char* what() const throw()
    { 
        return "Input error while reading"; 
    }
};
 
#endif
Если нужно что-то прокомментировать - пишите.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 07:49. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru