-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathP5.h
More file actions
317 lines (270 loc) · 7.34 KB
/
P5.h
File metadata and controls
317 lines (270 loc) · 7.34 KB
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
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
#ifndef P5_H_INCLUDED
#define P5_H_INCLUDED
#include <iostream>
#include <list>
#include <vector>
using namespace std;
// Áàçîâûé êëàññ Tank (òàíê)
class Tank {
private:
int armor; // Óðîâåíü áðîíè
double speed; // Ñêîðîñòü
string weapon; // Òèï îðóæèÿ
protected:
bool isOperational; // Ñîñòîÿíèå òàíêà (èñïðàâåí/íåèñïðàâåí)
public:
Tank(int armor, double speed, string weapon);
virtual ~Tank();
int GetArmor() const { return armor; }
double GetSpeed() const { return speed; }
string GetWeapon() const { return weapon; }
bool IsOperational() const { return isOperational; }
virtual void StartEngine() = 0;
virtual void Move() = 0;
virtual void Attack() = 0;
};
// Êîíêðåòíûå êëàññû òàíêîâ
class LightTank : public Tank {
public:
LightTank();
~LightTank();
void StartEngine() override;
void Move() override;
void Attack() override;
};
class MediumTank : public Tank {
public:
MediumTank();
~MediumTank();
void StartEngine() override;
void Move() override;
void Attack() override;
};
class HeavyTank : public Tank {
public:
HeavyTank();
~HeavyTank();
void StartEngine() override;
void Move() override;
void Attack() override;
};
// Òèïû òàíêîâ äëÿ ôàáðèêè
enum class TankType {
Light,
Medium,
Heavy
};
// Ôàáðèêà äëÿ ñîçäàíèÿ òàíêîâ
Tank* CreateTank(TankType type);
// Áàçîâûé èíòåðôåéñ èòåðàòîðà
template<typename T>
class Iterator {
public:
virtual ~Iterator() {}
virtual void First() = 0; // Ïåðåõîä ê ïåðâîìó ýëåìåíòó
virtual void Next() = 0; // Ïåðåõîä ê ñëåäóþùåìó ýëåìåíòó
virtual bool IsDone() const = 0; // Ïðîâåðêà çàâåðøåíèÿ îáõîäà
virtual T GetCurrent() const = 0; // Ïîëó÷åíèå òåêóùåãî ýëåìåíòà
};
// Áàçîâûé èíòåðôåéñ êîíòåéíåðà
template<typename T>
class TankContainer {
public:
virtual ~TankContainer() {}
virtual Iterator<T*>* GetIterator() const = 0; // Âèðòóàëüíûé ìåòîä ïîëó÷åíèÿ èòåðàòîðà
};
// Øàáëîííûé êëàññ ìàññèâà òàíêîâ
template<typename T, size_t N = 30>
class TankArray : public TankContainer<T> {
private:
T* items[N];
size_t size;
public:
TankArray();
void Add(T* item);
T* Get(size_t index) const;
size_t Size() const;
// Âëîæåííûé êëàññ èòåðàòîðà äëÿ ìàññèâà
class ArrayIterator;
Iterator<T*>* GetIterator() const override;
};
// Øàáëîííûé êëàññ ñïèñêà òàíêîâ
template<typename T>
class TankList : public TankContainer<T> {
private:
list<T*> items;
public:
void Add(T* item);
size_t Size() const;
// Âëîæåííûé êëàññ èòåðàòîðà äëÿ ñïèñêà
class ListIterator;
Iterator<T*>* GetIterator() const override;
};
// Áàçîâûé êëàññ äåêîðàòîðà èòåðàòîðà
template<typename T>
class IteratorDecorator : public Iterator<T> {
protected:
Iterator<T>* It; // Îáåðíóòûé èòåðàòîð
public:
IteratorDecorator(Iterator<T>* it) : It(it) {}
virtual ~IteratorDecorator() { delete It; }
// Ñòàíäàðòíîå ïîâåäåíèå - äåëåãèðîâàíèå îáåðíóòîìó èòåðàòîðó
virtual void First() { It->First(); }
virtual void Next() { It->Next(); }
virtual bool IsDone() const { return It->IsDone(); }
virtual T GetCurrent() const { return It->GetCurrent(); }
};
// Äåêîðàòîð äëÿ ôèëüòðàöèè ïî ñîñòîÿíèþ òàíêà
class OperationalTankDecorator : public IteratorDecorator<Tank*> {
public:
OperationalTankDecorator(Iterator<Tank*>* it) : IteratorDecorator<Tank*>(it) {}
void First() override {
It->First();
SkipNonOperational();
}
void Next() override {
It->Next();
SkipNonOperational();
}
private:
void SkipNonOperational() {
while (!It->IsDone() && !It->GetCurrent()->IsOperational()) {
It->Next();
}
}
};
// Äåêîðàòîð äëÿ ôèëüòðàöèè ïî ìèíèìàëüíîé áðîíå
class ArmorThresholdDecorator : public IteratorDecorator<Tank*> {
private:
int minArmor;
public:
ArmorThresholdDecorator(Iterator<Tank*>* it, int armor)
: IteratorDecorator<Tank*>(it), minArmor(armor) {}
void First() override {
It->First();
SkipWeakArmor();
}
void Next() override {
It->Next();
SkipWeakArmor();
}
private:
void SkipWeakArmor() {
while (!It->IsDone() && It->GetCurrent()->GetArmor() < minArmor) {
It->Next();
}
}
};
// Äåêîðàòîð äëÿ ôèëüòðàöèè ïî òèïó îðóæèÿ
class WeaponTypeDecorator : public IteratorDecorator<Tank*> {
private:
string weaponType;
public:
WeaponTypeDecorator(Iterator<Tank*>* it, const string& weapon)
: IteratorDecorator<Tank*>(it), weaponType(weapon) {}
void First() override {
It->First();
SkipOtherWeapons();
}
void Next() override {
It->Next();
SkipOtherWeapons();
}
private:
void SkipOtherWeapons() {
while (!It->IsDone() && It->GetCurrent()->GetWeapon() != weaponType) {
It->Next();
}
}
};
// Àäàïòåð äëÿ STL-êîíòåéíåðîâ
template<typename ContainerType, typename ItemType>
class STLIteratorAdapter : public Iterator<ItemType> {
protected:
ContainerType* Container;
typename ContainerType::const_iterator It;
public:
STLIteratorAdapter(ContainerType* container) : Container(container) {
It = Container->begin();
}
virtual ~STLIteratorAdapter() {}
virtual void First() { It = Container->begin(); }
virtual void Next() { It++; }
virtual bool IsDone() const { return (It == Container->end()); }
virtual ItemType GetCurrent() const { return *It; }
};
// Ôóíêöèÿ äëÿ äåìîíñòðàöèè ðàáîòû òàíêîâ ÷åðåç èòåðàòîð
void DemonstrateTank(Iterator<Tank*>* iterator);
// Ñòðàòåãèÿ àòàêè (ïàòòåðí "Ñòðàòåãèÿ")
class IAttackStrategy {
public:
virtual ~IAttackStrategy() {}
virtual void Attack() const = 0;
};
class MachineGunAttack : public IAttackStrategy {
public:
void Attack() const override {
cout << "Àòàêà èç ïóëåìåòà!" << endl;
}
};
class CannonAttack : public IAttackStrategy {
public:
void Attack() const override {
cout << "Âûñòðåë èç ïóøêè!" << endl;
}
};
class MissileAttack : public IAttackStrategy {
public:
void Attack() const override {
cout << "Çàïóñê ðàêåòû!" << endl;
}
};
// Øàáëîííûé ìåòîä (Template Method) äëÿ ìèññèé òàíêîâ
class TankMission {
public:
virtual ~TankMission() {}
void StartMission() {
Prepare();
StartEngine();
Move();
Attack();
Finish();
}
protected:
virtual void Prepare() {
cout << "Ïîäãîòîâêà ê ìèññèè..." << endl;
}
virtual void StartEngine() = 0;
virtual void Move() = 0;
virtual void Attack() = 0;
virtual void Finish() {
cout << "Ìèññèÿ çàâåðøåíà!" << endl;
}
};
// Êîíêðåòíàÿ ìèññèÿ — ðàçâåäêà
class ScoutMission : public TankMission {
public:
void StartEngine() override {
cout << "Çàïóñê äâèãàòåëÿ äëÿ ðàçâåäêè." << endl;
}
void Move() override {
cout << "Òàíê äâèæåòñÿ ñ ìàêñèìàëüíîé ñêîðîñòüþ." << endl;
}
void Attack() override {
cout << "Ðàçâåäêà: àòàêà íå òðåáóåòñÿ." << endl;
}
};
// Êîíêðåòíàÿ ìèññèÿ — áîé
class BattleMission : public TankMission {
public:
void StartEngine() override {
cout << "Áîåâîé çàïóñê äâèãàòåëÿ." << endl;
}
void Move() override {
cout << "Òàíê çàíèìàåò áîåâóþ ïîçèöèþ." << endl;
}
void Attack() override {
cout << "Âûïîëíÿåòñÿ àòàêà ïî ïðîòèâíèêó!" << endl;
}
};
#endif // P5_H_INCLUDED