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

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

Восстановить пароль Регистрация
 
Van111
кодер с++
208 / 187 / 4
Регистрация: 03.08.2011
Сообщений: 2,585
Записей в блоге: 12
28.06.2012, 14:58     Для программистов с железными нервами #1
объекты пока умеют только блуждать, но и то там есть проблемы.
пока хочу реализовать следующие аспекты
юнит может гулять по карте если у него больше половины жизней
юнит идёт в случайную точку базы если у него меньше половины жизней , прийдя в эту точку он ждёт на одном месте пока , жизни не восстановятся полностью.
пока не получается организовать, подскажите ваши идеи
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;
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4928 / 2671 / 243
Регистрация: 29.11.2010
Сообщений: 7,429
28.06.2012, 15:10     Для программистов с железными нервами #2
Можно было бы для лаконичности использовать тернарный условный оператор, хедеры править. Не помешало бы видеть unit_support_function.cpp. Лишние сравнения думаю уберешь когда будешь оптимизировать.
C++
1
2
3
4
5
6
7
bool game::comparison_coordinates(int x1, int y1, int x2, int y2)
{
    if( (x1==x2) && (y1==y2) )
        return true;
    else
        return false;
}
C++
1
2
3
4
bool game::comparison_coordinates(int x1, int y1, int x2, int y2)
{
    return x1==x2 && y1==y2;
}
Ksan
26 / 26 / 0
Регистрация: 02.11.2010
Сообщений: 370
28.06.2012, 15:12     Для программистов с железными нервами #3
MrGluck, второй вариант сильно лучше первого?
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
28.06.2012, 15:13     Для программистов с железными нервами #4
Ksan, Конечно. Он логичнее.
Van111
кодер с++
208 / 187 / 4
Регистрация: 03.08.2011
Сообщений: 2,585
Записей в блоге: 12
28.06.2012, 15:52  [ТС]     Для программистов с железными нервами #5
ошибки нашёл

Добавлено через 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
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4928 / 2671 / 243
Регистрация: 29.11.2010
Сообщений: 7,429
28.06.2012, 16:33     Для программистов с железными нервами #6
Ну, код я не смотрел. Предложу следующий алгоритм:
если следующий ход юнита == враг/его база, то:
Включаем анимацию удара, начинаем бить. У каждого юнита есть свой диапазон силы удара. Каждый период времени у противника отнимается хп, равное рандомному числу из диапазона значений удара его врага. Когда хп = 0, человечек мертв, враг исчезает, юнит идет дальше. Можно добавить крит. удар, тогда кол-во хп у врага уменьшается в 2 раза больше. При рандоме от 0 до 10, например, если == 1, то множитель силы удара равен 2, иначе 1.
Да много что можно придумать, лишь бы фантазия была. Сиди да делай в удовольствие.
Yandex
Объявления
28.06.2012, 16:33     Для программистов с железными нервами
Ответ Создать тему
Опции темы

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