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

Для программистов с железными нервами - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ strlen http://www.cyberforum.ru/cpp-beginners/thread615769.html
Есть ли подобие strlen, но для других типов данных? int*, short* и тп?
C++ Вычислить значение кусочной функции Помогите решить задачку! Скрин на ссылке. Запрещено выкладывать задание или его решение в виде картинки с текстом или других подобных файлов. Текст нужно перепечатать в сообщение http://www.cyberforum.ru/cpp-beginners/thread615761.html
Все отрицательные цифры поместить в начало массива, а положительные в конец C++
4. Дан массив положительных и отрицательных чисел. Переписать массив так, чтобы все отрицательные цифры были в начале массива, а положительные в конце. Сохранить относительный порядок цифр (Можно...
C++ return + char*
Как я понимаю, он вернет всякую чушь, потому что локальная переменная m уничтожается по завершению функции. Тогда нужно выделять память с помощью new, а потом в коде освобождать ее, так? char *...
C++ C++ и директивы include c пространством имён http://www.cyberforum.ru/cpp-beginners/thread615725.html
Всем привет! Я только начал изучать C++:-[, в связи с этим появились вопросы: 1. В одной книге я встретил выражение, и оно меня несколько запутало — В пространство имён добавляются переменные...
C++ Динамическая память Есть 2 массива одной размерности: int *m1 = new int , *m2 = new int ; где N, M некие числа. Собственно вопрос: как "склеить" m1 и m2 так, что бы в итоге получился некий массив m ? подробнее

Показать сообщение отдельно
Van111
209 / 188 / 4
Регистрация: 03.08.2011
Сообщений: 2,597
Записей в блоге: 12
28.06.2012, 15:52  [ТС]
ошибки нашёл

Добавлено через 27 минут
я собираюсь добавить функции борьбы между командами юнитов
для этого мне наверно надо логически подправить подправить код , у кого какие идеи?
вот реализация класса
хейдер
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
#ifndef __unit_h__
#define __unit_h__
#include <deque>
#include <vector>
using namespace std;
const float MAXHELF=100;
const float MAP_MAX_LEFT=1000;
const float MAP_MAX_HEIGHT=800;
const float MAX_TEAM_BASE_TERRITORY_LEFT=30;
const float MAX_TEAM_BASE_TERRITORY_HEIGHT=40;
 
enum Tstate{random_move,random_move_complete,atack,retreat_to_the_base__move,retreat_to_the_base__wait};
struct FPOINT
{
public:
    float   x;
    float   y;
};
 
struct Tunit
{
public :
int     team;
int     team_agricultural;
FPOINT  location;
FPOINT  moveLocation;
float   max_helf;
float   current_helf;
int     ID_cel; 
float   speed;
bool    pleyar;
float   power_of_regeneration;
float   supply_health;
Tstate state;
};
 
struct Tteam
{
public:
int counter_unit;
int leftx;
int lefty;
int rightx;
int righty;
 
};
class game
{
private:
public:
vector <Tteam>  team;
vector <Tteam> ::iterator iteam;
deque <Tunit> Unit;
deque <Tunit>::iterator iUnit;
int size_team;
void search(deque <Tunit>::iterator iUnit);//не готова
void random_choice_of_direction(int number_unit  ,int leftx, int lefty, int rightx, int righty);
bool move(int number_unit);
void random_move(int number_unit);
void choice_state(int number_unit);
void retreat_to_the_base(int number_unit);
void treatment(int number_unit);
inline bool location_included_square(int x, int y, int lx, int ly, int rx, int ry);
inline bool comparison_coordinates(int x1, int y1, int x2, int y2);
game(int size_team, int begin_counter_);
inline float GetX(int number){return iUnit[number].location.x;}
inline float GetY(int number){return iUnit[number].location.y;}
inline int GetTeanUnit(int number){ return iUnit[number].team;}
inline void SetMoveLocation(float x,float y, int number){iUnit[number].moveLocation.x=x;iUnit[number].moveLocation.y=y;}
int GetCounterUnit();
void engine();
 
 
 
};
 
 
 
#endif
cpp файл
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
#ifndef __unit_cpp__
#define __unit_cpp__
#include "unit.h"
#include <deque>
#include <vector>
#include "global.h"
#include "time.h"
#include "math.h"
 
 
//не рабочая//
void game::search(deque <Tunit>::iterator nunit)
{
    int number=0,max=sqrt(pow(this->iUnit[0].location.x - nunit->location.x,2)
            +pow(this->iUnit[0].location.y - nunit->location.y,2));
    for(int i=0,distance;i< this->size_team;i++)
    {
        distance=sqrt(pow(this->iUnit[i].location.x - nunit->location.x,2)
            +pow(this->iUnit[i].location.y - nunit->location.y,2));
        if(  distance<max )
        {
            max=distance;
            nunit->ID_cel=i;
        }
 
    }
}
 
 
//функция инцилизации 
game::game(int size_team_, int begin_counter): size_team(size_team_) 
{
        srand(time(NULL));
        Tunit tempunit;
        Tteam tempteam;
        for(int number_team=0;number_team < this->size_team  ;number_team++)
        {
            tempteam.counter_unit=begin_counter;
            tempteam.leftx=((rand() % (int)(MAP_MAX_LEFT-MAX_TEAM_BASE_TERRITORY_LEFT))) ;
            tempteam.lefty=((rand() % (int)(MAP_MAX_LEFT-MAX_TEAM_BASE_TERRITORY_HEIGHT))) ;
            tempteam.rightx=tempteam.leftx+MAX_TEAM_BASE_TERRITORY_LEFT;
            tempteam.righty=tempteam.lefty+MAX_TEAM_BASE_TERRITORY_HEIGHT;
            team.push_back(tempteam);
            for(int number_unit=0;number_unit < begin_counter;number_unit++)
            {
                //временный объект заполняется новыми значениями и помещается в контейнер
                tempunit.location.x=((rand() %(int)MAP_MAX_LEFT));
                tempunit.location.y=((rand() %(int)MAP_MAX_HEIGHT));
                tempunit.current_helf=100;
                tempunit.max_helf=MAXHELF;
                tempunit.moveLocation.x=0;
                tempunit.moveLocation.y=0;
                tempunit.speed=((rand() % 100) /200 +1.5);
                tempunit.team=number_team;
                tempunit.ID_cel=-1;
                tempunit.power_of_regeneration= rand() % 2 +1;
                tempunit.state=Tstate::random_move_complete;
                if(number_team==this->size_team-1)
                    tempunit.team_agricultural=0;
                else
                    tempunit.team_agricultural=number_team+1;
                Unit.push_back(tempunit);// помещение объекта в контейнер
            }
        }
        //иницилизируем итераторы
        iteam=this->team.begin();
        iUnit=this->Unit.begin();
        return;
}
//функция получения количества объектов
int game::GetCounterUnit()
{
    int counter=0;
    for(int i=0;i<size_team;i++)
            counter+=iteam[i].counter_unit;
    return counter;
 
}
 
//функция движения и проверки на достижение точки
bool game::move(int number_unit)
{
    this->iUnit[number_unit].current_helf-=.1;
    //сравнение координат по оси х
    if(this->iUnit[number_unit].location.x < this->iUnit[number_unit].moveLocation.x)
        this->iUnit[number_unit].location.x+=this->iUnit[number_unit].speed;
    if(this->iUnit[number_unit].location.x > this->iUnit[number_unit].moveLocation.x)
        this->iUnit[number_unit].location.x-=this->iUnit[number_unit].speed;
    //сравнение координат по оси y
    if(this->iUnit[number_unit].location.y < this->iUnit[number_unit].moveLocation.y)
        this->iUnit[number_unit].location.y+=this->iUnit[number_unit].speed;
    if(this->iUnit[number_unit].location.y > this->iUnit[number_unit].moveLocation.y)
        this->iUnit[number_unit].location.y-=this->iUnit[number_unit].speed;
 
    
    //проверка координат на совподение
    if((((this->iUnit[number_unit].location.x  >= this->iUnit[number_unit].moveLocation.x - this->iUnit[number_unit].speed ) &&
    (this->iUnit[number_unit].location.x  <= this->iUnit[number_unit].moveLocation.x + this->iUnit[number_unit].speed)) 
    &&
    ((this->iUnit[number_unit].location.y  >= this->iUnit[number_unit].moveLocation.y - this->iUnit[number_unit].speed ) &&
    (this->iUnit[number_unit].location.y  <= this->iUnit[number_unit].moveLocation.y + this->iUnit[number_unit].speed)) ))
    {
        this->iUnit[number_unit].location.x=this->iUnit[number_unit].moveLocation.x;
        this->iUnit[number_unit].location.y=this->iUnit[number_unit].moveLocation.y;
        return true;
    }
    return false;
    
    
}
 
 
//функция выбора точки для случайного движения
void game::random_choice_of_direction(int number_unit  ,int leftx, int lefty, int rightx, int righty)
{
    this->iUnit[number_unit].moveLocation.x=(rand() % (rightx - leftx)) + leftx;
    this->iUnit[number_unit].moveLocation.y=(rand() % (righty - lefty)) + lefty ;
}
 
//функция выбора состояния
void game::choice_state(int number_unit)
{
    int tmp;
    treatment(number_unit);
 
    if(this->iUnit[number_unit].current_helf <=this->iUnit[number_unit].max_helf /2)
    {
        this->iUnit[number_unit].supply_health=this->iUnit[number_unit].max_helf;
    }
 
    if( this->iUnit[number_unit].current_helf < this->iUnit[number_unit].supply_health  )
    {
        if((this->iUnit[number_unit].state != Tstate::retreat_to_the_base__move) && (this->iUnit[number_unit].state != Tstate::retreat_to_the_base__wait))
        {
            tmp= this->iUnit[number_unit].team;
            random_choice_of_direction(number_unit,this->iteam[tmp].leftx,this->iteam[tmp].lefty,this->iteam[tmp].rightx,this->iteam[tmp].righty);
        }
        this->iUnit[number_unit].state=Tstate::retreat_to_the_base__move;
        return;
    }
    else
    {
        this->iUnit[number_unit].supply_health=-1;
    }
    // случайное движение
    if(this->iUnit[number_unit].current_helf >50  )
    {
        
        if(this->iUnit[number_unit].state == Tstate::random_move_complete )
        {
            random_choice_of_direction(number_unit,0,0,MAP_MAX_LEFT,MAP_MAX_HEIGHT);
        }
        this->iUnit[number_unit].state=Tstate::random_move;
        return;
        
    }
 
}
//функция реакция на состояние
void game::engine()
{
    
    Tstate tmp;
    int len=this->GetCounterUnit();
    for(int number_unit=0;number_unit<len;number_unit++)
    {
        choice_state(number_unit);
        switch (this->iUnit[number_unit].state)
        {
        case Tstate::random_move:
            random_move(number_unit);
            break;
        case Tstate::retreat_to_the_base__move:
            retreat_to_the_base(number_unit);
            break;
        case Tstate::retreat_to_the_base__wait:
            break;
 
        }
    }
    return;
 
}
//функция отступления на базу
void game::retreat_to_the_base(int number_unit)
{
    
        
            if(this->move(number_unit))
            {
                this->iUnit[number_unit].state=Tstate::retreat_to_the_base__wait;
            }
        
}
 
void game::random_move(int number_unit)
{
    if(this->move(number_unit))
        this->iUnit[number_unit].state=Tstate::random_move_complete;
}//функция случайного движения
void game::treatment(int number_unit)
{
    int number_team=this->iUnit[number_unit].team;
    if( this->location_included_square ( this->iUnit[number_unit].location.x,this->iUnit[number_unit].location.y,
    this->iteam[number_team].leftx,this->iteam[number_team].lefty,
    this->iteam[number_team].rightx,this->iteam[number_team].righty) )
    {
        this->iUnit[number_unit].current_helf+=this->iUnit[number_unit].power_of_regeneration;
        if (this->iUnit[number_unit].current_helf > this->iUnit[number_unit].max_helf)
        {
            this->iUnit[number_unit].current_helf=this->iUnit[number_unit].max_helf;
        }
    }
 
}//функция лечения
bool game::location_included_square(int x, int y, int lx, int ly, int rx, int ry)
{
    if(  (x >= lx) && (x <= rx) && (y >= ly) && (y <=ry)  )
        return true;
    else
        return false;
}//функция проверки поподания точки в квадрат
bool game::comparison_coordinates(int x1, int y1, int x2, int y2)
{
    if( (x1==x2) && (y1==y2) )
        return true;
    else
        return false;
}//функция сравнения координат
 
#endif
0
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru