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

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

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

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
Если нужно что-то прокомментировать - пишите.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.08.2013, 22:44     Хищник-жертва
Посмотрите здесь:

Delphi система хищник-жертва
Хищник и жертва, написать на C
C++ Qt GUI Хищник-жертва
Моделирование системы хищник- жертва, с#
хищник-жертва
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
gogs888
0 / 0 / 0
Регистрация: 27.07.2013
Сообщений: 29
07.08.2013, 00:34     Хищник-жертва #2
а работает??в с++6?
Sublimee
7 / 7 / 0
Регистрация: 14.11.2012
Сообщений: 65
07.08.2013, 01:01  [ТС]     Хищник-жертва #3
Цитата Сообщение от gogs888 Посмотреть сообщение
а работает??в с++6?
Работает в VS 2012
gogs888
0 / 0 / 0
Регистрация: 27.07.2013
Сообщений: 29
07.08.2013, 01:34     Хищник-жертва #4
спс)

Добавлено через 55 секунд
слушай я создаю(ХОЧУ СОЗДАТЬ) проект-БИТВА БОТОВ 808)есть в контакте?

Добавлено через 15 минут
ты есть?
gogs888
0 / 0 / 0
Регистрация: 27.07.2013
Сообщений: 29
13.08.2013, 11:46     Хищник-жертва #5
Есть предложение сделать-вероятность сьедение-10.001 % и повышать с количеством сьеденных и убегания зайца всех поназывать и болеть за лучшего типо тараканьих бегов что-ли)
Wolkodav
 Аватар для Wolkodav
599 / 452 / 32
Регистрация: 18.09.2012
Сообщений: 1,685
13.08.2013, 16:45     Хищник-жертва #6
Я так понимаю надо прокоментировать. Я бы Animal абстрактным классом сделал. И советую писать в одном стиле ( если пользуетесь стандартными шаблонами, то не надо char*, глаз немного сбивает)
Hugra
 Аватар для Hugra
47 / 47 / 1
Регистрация: 18.07.2013
Сообщений: 138
Записей в блоге: 1
13.08.2013, 17:01     Хищник-жертва #7
Цитата Сообщение от Sublimee Посмотреть сообщение
Если нужно что-то прокомментировать - пишите.
Результат программы можете продемонстрировать скриншотом?
Sublimee
7 / 7 / 0
Регистрация: 14.11.2012
Сообщений: 65
13.08.2013, 17:08  [ТС]     Хищник-жертва #8
Цитата Сообщение от gogs888 Посмотреть сообщение
Есть предложение сделать-вероятность сьедение-10.001 % и повышать с количеством сьеденных
Я и так функцию Instinct написал, чтобы у первого волка хоть какой-то шанс на выживание был, а если ещё и вероятность съедания сделать, то первый волк может и с полем, заполненным зайцами помереть.
Цитата Сообщение от gogs888 Посмотреть сообщение
всех поназывать и болеть за лучшего типо тараканьих бегов что-ли)
Худо бедно пытаюсь на qt это переложить обычной демонстрацией происходящего, без всяких гонок.
Цитата Сообщение от Wolkodav Посмотреть сообщение
Я так понимаю надо прокоментировать. Я бы Animal абстрактным классом сделал. И советую писать в одном стиле ( если пользуетесь стандартными шаблонами, то не надо char*, глаз немного сбивает)
Спасибо за комментарий. Да, действительно, Animal неказистым классом оказался, но это из-за плохого проектирования, многое переосмысливалось в ходе написания. Да и когда начинал писать программу, не особо хорошо представлял себе суть ООП, ни о каких абстрактных классах и т.п. не знал. Многое подтянул, но ещё предстоит много работы.
Цитата Сообщение от Wolkodav Посмотреть сообщение
если пользуетесь стандартными шаблонами, то не надо char*
Можно поподробнее?

Добавлено через 5 минут
Цитата Сообщение от Sublimee Посмотреть сообщение
Худо бедно пытаюсь на qt это переложить обычной демонстрацией происходящего, без всяких гонок.
GUI Хищник-жертва
XRuZzz
Антикодер
577 / 478 / 23
Регистрация: 15.09.2012
Сообщений: 2,429
13.08.2013, 17:08     Хищник-жертва #9
редко в этом разделе видишь хороший код.

вам не хватает репозитория - могу сделать вам на своём svn сервере, либо используйте github
неудобно в форуме стока исходников просматривать.
Wolkodav
 Аватар для Wolkodav
599 / 452 / 32
Регистрация: 18.09.2012
Сообщений: 1,685
13.08.2013, 17:09     Хищник-жертва #10
Ну пользуетесь vector, map, string, не стоит туда еще липить char* и тому подобное.
Sublimee
7 / 7 / 0
Регистрация: 14.11.2012
Сообщений: 65
13.08.2013, 17:10  [ТС]     Хищник-жертва #11
Цитата Сообщение от Hugra Посмотреть сообщение
Результат программы можете продемонстрировать скриншотом?
Прилагаю скрин
Миниатюры
Хищник-жертва  
Sublimee
7 / 7 / 0
Регистрация: 14.11.2012
Сообщений: 65
13.08.2013, 17:18  [ТС]     Хищник-жертва #12
Цитата Сообщение от XRuZzz Посмотреть сообщение
редко в этом разделе видишь хороший код.
Хороший в плане содержательный?
Цитата Сообщение от XRuZzz Посмотреть сообщение
вам не хватает репозитория - могу сделать вам на своём svn сервере, либо используйте github
неудобно в форуме стока исходников просматривать.
Вложения
Тип файла: rar WolfsHares.rar (6.8 Кб, 54 просмотров)
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.08.2013, 17:54     Хищник-жертва
Еще ссылки по теме:

Игра хищник-жертва. Клеточный автомат Delphi
Игра хищник жертва Delphi
Модель хищник жертва на JAVA Java

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
XRuZzz
Антикодер
577 / 478 / 23
Регистрация: 15.09.2012
Сообщений: 2,429
13.08.2013, 17:54     Хищник-жертва #13
тогда я бы оценил скилы ваше проекта так:
требования 1
идея 3
управление проектом 0(хотя за использование IDE можно накинуть 1 балл)
реализация 4

Цитата Сообщение от Sublimee Посмотреть сообщение
Хороший в плане содержательный?
есть к чему придраться, но в тоже время есть, что почитать и подчеркнуть для себя

можно сделать абстрактные классы, и для них сделать специальные реализации - отдельно для Qt, отдельно для консоли(да хоть для 3d движков)

то есть логику отвязать от представления (типа как в MVC - видел хорошую статью в инете, могу поискать у себя, если нужно)
Yandex
Объявления
13.08.2013, 17:54     Хищник-жертва
Ответ Создать тему
Опции темы

Текущее время: 23:22. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru