Форум программистов, компьютерный форум 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 * func(char *a, char *b) { char m; int i; for(i = 0; i<strlen(a); ++i) m = a; for(int j=0; j<strlen(b); ++j) {
C++ C++ и директивы include c пространством имён http://www.cyberforum.ru/cpp-beginners/thread615725.html
Всем привет! Я только начал изучать C++:-[, в связи с этим появились вопросы: 1. В одной книге я встретил выражение, и оно меня несколько запутало — В пространство имён добавляются переменные объявленные программистом(их идентификаторы и значения)? Или же там находятся обозначения только операторов(cout,cin и т.п.)? 2.Зачем нужны директивы include если операторы уже объявлены в пространстве...
C++ Динамическая память Есть 2 массива одной размерности: int *m1 = new int , *m2 = new int ; где N, M некие числа. Собственно вопрос: как "склеить" m1 и m2 так, что бы в итоге получился некий массив m ? подробнее

Показать сообщение отдельно
Van111
кодер с++
208 / 187 / 4
Регистрация: 03.08.2011
Сообщений: 2,585
Записей в блоге: 12
28.06.2012, 14:58     Для программистов с железными нервами
объекты пока умеют только блуждать, но и то там есть проблемы.
пока хочу реализовать следующие аспекты
юнит может гулять по карте если у него больше половины жизней
юнит идёт в случайную точку базы если у него меньше половины жизней , прийдя в эту точку он ждёт на одном месте пока , жизни не восстановятся полностью.
пока не получается организовать, подскажите ваши идеи
PS код очень тормозной, но пока на оптимизации я вообще решил не заморачиватся
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
#include "unit.h"
#include <deque>
#include <vector>
#include "global.h"
#include "time.h"
#include "math.h"
 
#include "unit_support_function.cpp" 
//не рабочая//
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;
                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 <=50)
    {
        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->iUnit[number_unit].state==Tstate::retreat_to_the_base__wait)
        {
            return;
        }
        else
        {
            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_team].location.x,this->iUnit[number_team].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;
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 21:18. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru