Skip to content

Commit eb54ede

Browse files
committed
Add tasks and prepare workspace for week 10
1 parent 5b5859d commit eb54ede

File tree

12 files changed

+342
-31
lines changed

12 files changed

+342
-31
lines changed
Lines changed: 3 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,11 @@
11
# Практикум 09 - Динамичен полиморфизъм
22

3-
## Общи изисквания:
4-
За всички класове искаме да е спазен принципът `RAII (Resource Acquisition Is Initialization)`
5-
63
## Задача 01 - Герои
74
Да се реализира клас `Character`, който да представлява герой в игра. Всеки герой трябва да има име, точки атака и точки живот. Да се реализират следните методи:
8-
- dealDamageTo(const Character& other, double points) const - нанася щети по подадения герой;
5+
- dealDamageTo(const Character& other) const - нанася щети по подадения герой;
96
- takeDamage(double points) - поема щети;
107
- heal(double points) - възвръща точки живот;
8+
- compareName(const char* _name) const - проверява дали героят има същото име като подаденото
119
- print() const - извежда подробна информация за героя в следния формат:
1210
```
1311
Name: {name}
@@ -24,26 +22,4 @@ DMG: {damage_points}
2422
- add(const Character* character) - добавя герой в списъка;
2523
- battle(const char* attacker, const char* target) - героят с име {attacker} напада героя с име {target}. Ако някой от героите не е част от списъка да се изведе подходящо съобщение. Ако точките живот на героя с име {target} паднат под 0, героят да се премахне от списъка и да се изведе подходящо съобщение;
2624
- heal(double amount) - всички герои в списъка възвръщат {amount} точки живот;
27-
- print() const - извежда подробна информация за оцелелите до момента герои.
28-
29-
## Задача 02 - Банка
30-
Да се реализира клас `Account`, който представлява банкова сметка. Всяка банкова сметка има уникален идентификатор, баланс и лихвен процент. Да се реализират следните методи:
31-
- deposit(double amount) - депозира подадената сума в сметката;
32-
- withdraw(double amount) - ако има достатъчен баланс в сметката, тегли подадената сума от сметката. Иначе изкарва подходящо съобщение;
33-
- addInterest() - увеличава баланса спрямо лихвения процент;
34-
- operator==(const char* id) - проверява дали сметката има подадения уникален идентификатор;
35-
- operator<< - извежда подробна информация за сметката.
36-
37-
Да се реализира клас `CheckingAccount`, който представлява разплащателна сметка. Освен характеристиките на обикновената сметка, разплащателната сметка има и такса за транзакция, която се приспада при всяко теглене.
38-
39-
Да се реализира клас `SavingsAccount`, който представлява спестовна сметка. Освен характеристиките на обикновената сметка, спестовната сметка има и лимит за теглене. Ако при теглене клиент опита да изтегли по-голяма сума от лимита, да се откаже тегленето и да се изведе подходящо съобщение.
40-
41-
Да се реализира клас `SalaryAccount`, който представлява сметка за превод на работна заплата. Освен характеристиките на обикновената сметка, сметката за превод на работна заплата има и месечна заплата. При добавянето на лихвения процент, след увеличаването на баланса да се добави и 5% от работната заплата.
42-
43-
Да се реализира клас `Bank`, който представлява банка, в която има множество банкови сметки. Да се реализират следните методи:
44-
- add(const Account* account) - добавя сметка в банката;
45-
- remove(const char* id) - премахва сметка от банката по подадения уникален идентификатор;
46-
- depositTo(const char* id, double amount) - към сметката с подадения уникален идентификатор депозира подадената сума;
47-
- withdrawFrom(const char* id, double amount) - от сметката с подадения уникален идентификатор опитва да изтегли подадената сума;
48-
- addInterest() - увеличава баланса на всички сметки спрямо лихвения им процент;
49-
- operator<< - извежда подробна информация за сметките в банката.
25+
- print() const - извежда подробна информация за оцелелите до момента герои.

Седмица 09 - Динамичен полиморфизъм/Задачи от часа/main.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -141,14 +141,17 @@ class Game
141141

142142
public:
143143
Game() : size(0), capacity(0), characters(nullptr) {}
144+
144145
Game(const Game &other)
145146
{
146147
copy(other);
147148
}
149+
148150
~Game()
149151
{
150152
destroy();
151153
}
154+
152155
Game &operator=(const Game &other)
153156
{
154157
if (this != &other)
@@ -173,6 +176,7 @@ class Game
173176
{
174177
Character *attackingCharacter = find(attacker);
175178
Character *defendingCharacter = find(target);
179+
176180
if (!attackingCharacter)
177181
{
178182
std::cout << "No character with name " << attacker << '\n';
@@ -186,8 +190,6 @@ class Game
186190
}
187191

188192
attackingCharacter->dealDamageTo(*defendingCharacter);
189-
190-
// TODO: remove character if health bellow 0
191193
}
192194

193195
void print() const
@@ -202,9 +204,7 @@ class Game
202204
int main()
203205
{
204206
Character kratos("Kratos", 200, 50);
205-
kratos.print();
206207
Knight artorias("Artorias", 175, 25);
207-
artorias.print();
208208
Game game;
209209
game.add(&kratos);
210210
game.add(&artorias);
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
# Практикум 10 - Динамичен полиморфизъм - втора част
2+
3+
## Общи изисквания:
4+
За всички класове искаме да е спазен принципът `RAII (Resource Acquisition Is Initialization)`. За тази седмица не е позволено ползването на `std::string`.
5+
6+
## Задача 01 - Герои
7+
Да се реализира клас `Character`, който да представлява герой в игра. Всеки герой трябва да има име, точки атака и точки живот. Да се реализират следните методи:
8+
- dealDamageTo(const Character& other) const - нанася щети по подадения герой;
9+
- takeDamage(double points) - поема щети;
10+
- heal(double points) - възвръща точки живот;
11+
- compareName(const char* _name) const - проверява дали героят има същото име като подаденото
12+
- print() const - извежда подробна информация за героя в следния формат:
13+
```
14+
Name: {name}
15+
Type: Ordinary Character
16+
HP: {health_points}
17+
DMG: {damage_points}
18+
```
19+
20+
Да се реализира клас `Knight`, наследник на клас `Character`, който представлява рицар в игра. За разлика от обикновения герой, рицарят има име на оръженосеца си, блокира 25% от нанесените му щети и възвръща с 5% повече точки живот. Освен това при извеждането на информация за рицаря, да се извежда Knight вместо Ordinary Character, както и името на оръженосеца.
21+
22+
Да се реализира клас `Archer`, наследник на клас `Character`, който представлява стрелец в игра. За разлика от обикновения герой, стрелецът нанася 33% повече щети, но поема 15% повече щети. Освен това при извеждането на информация за стрелеца, да се извежда Archer вместо Ordinary Character.
23+
24+
Да се реализира клас `Game`, който представлява игра, в която има списък от герои, които се бият помежду си. Да се реализират следните методи:
25+
- add(const Character* character) - добавя герой в списъка;
26+
- battle(const char* attacker, const char* target) - героят с име {attacker} напада героя с име {target}. Ако някой от героите не е част от списъка да се изведе подходящо съобщение. Ако точките живот на героя с име {target} паднат под 0, героят да се премахне от списъка и да се изведе подходящо съобщение;
27+
- heal(double amount) - всички герои в списъка възвръщат {amount} точки живот;
28+
- print() const - извежда подробна информация за оцелелите до момента герои.
29+
30+
## Задача 02 - Банка
31+
Да се реализира клас `Account`, който представлява банкова сметка. Всяка банкова сметка има уникален идентификатор, баланс и лихвен процент. Да се реализират следните методи:
32+
- deposit(double amount) - депозира подадената сума в сметката;
33+
- withdraw(double amount) - ако има достатъчен баланс в сметката, тегли подадената сума от сметката. Иначе изкарва подходящо съобщение;
34+
- addInterest() - увеличава баланса спрямо лихвения процент;
35+
- operator==(const char* id) - проверява дали сметката има подадения уникален идентификатор;
36+
- operator<< - извежда подробна информация за сметката.
37+
38+
Да се реализира клас `CheckingAccount`, който представлява разплащателна сметка. Освен характеристиките на обикновената сметка, разплащателната сметка има и такса за транзакция, която се приспада при всяко теглене.
39+
40+
Да се реализира клас `SavingsAccount`, който представлява спестовна сметка. Освен характеристиките на обикновената сметка, спестовната сметка има и лимит за теглене. Ако при теглене клиент опита да изтегли по-голяма сума от лимита, да се откаже тегленето и да се изведе подходящо съобщение.
41+
42+
Да се реализира клас `SalaryAccount`, който представлява сметка за превод на работна заплата. Освен характеристиките на обикновената сметка, сметката за превод на работна заплата има и месечна заплата. При добавянето на лихвения процент, след увеличаването на баланса да се добави и 5% от работната заплата.
43+
44+
Да се реализира клас `Bank`, който представлява банка, в която има множество банкови сметки. Да се реализират следните методи:
45+
- add(const Account* account) - добавя сметка в банката;
46+
- remove(const char* id) - премахва сметка от банката по подадения уникален идентификатор;
47+
- depositTo(const char* id, double amount) - към сметката с подадения уникален идентификатор депозира подадената сума;
48+
- withdrawFrom(const char* id, double amount) - от сметката с подадения уникален идентификатор опитва да изтегли подадената сума;
49+
- addInterest() - увеличава баланса на всички сметки спрямо лихвения им процент;
50+
- operator<< - извежда подробна информация за сметките в банката.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
#include "archer.hpp"
2+
3+
void Archer::do_print() const
4+
{
5+
std::cout << "Type: Archer\n";
6+
}
7+
8+
Archer::Archer(const std::string &_name, double _hp, double _dmg)
9+
: Character(_name, _hp, _dmg * 1.33) {}
10+
11+
void Archer::takeDamage(double points)
12+
{
13+
points *= 1.15;
14+
Character::takeDamage(points);
15+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
#ifndef ARCHER_HPP
2+
#define ARCHER_HPP
3+
4+
#include "character.hpp"
5+
6+
class Archer : public Character
7+
{
8+
private:
9+
void do_print() const final;
10+
public:
11+
Archer(const std::string &_name = "<anonymous>", double _hp = 0, double _dmg = 0);
12+
void takeDamage(double points) final;
13+
};
14+
15+
#endif
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
#include "character.hpp"
2+
3+
void Character::do_print() const
4+
{
5+
std::cout << "Type: Ordinary Character\n";
6+
}
7+
8+
Character::Character(const std::string &_name, double _hp, double _dmg)
9+
: name(_name), hp(_hp), dmg(_dmg) {}
10+
11+
void Character::dealDamageTo(Character &other) const
12+
{
13+
other.takeDamage(dmg);
14+
}
15+
16+
void Character::takeDamage(double points)
17+
{
18+
hp -= points;
19+
}
20+
21+
void Character::heal(double points)
22+
{
23+
hp += points;
24+
}
25+
26+
bool Character::operator==(const std::string &_name) const
27+
{
28+
return name == _name;
29+
}
30+
31+
void Character::print() const
32+
{
33+
std::cout << "Name: " << name << '\n';
34+
do_print();
35+
std::cout << "HP: " << hp << '\n'
36+
<< "DMG: " << dmg << '\n';
37+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
#ifndef CHARACTER_HPP
2+
#define CHARACTER_HPP
3+
4+
#include <iostream>
5+
#include <string>
6+
7+
class Character
8+
{
9+
private:
10+
std::string name;
11+
double hp, dmg;
12+
13+
virtual void do_print() const;
14+
15+
public:
16+
Character(const std::string &_name = "<anonymous>", double _hp = 0, double _dmg = 0);
17+
virtual void dealDamageTo(Character &other) const;
18+
virtual void takeDamage(double points);
19+
virtual void heal(double points);
20+
21+
bool operator==(const std::string &_name) const;
22+
23+
void print() const;
24+
};
25+
26+
#endif
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,107 @@
1+
#include "game.hpp"
2+
3+
void Game::resize()
4+
{
5+
if (capacity == 0)
6+
{
7+
++capacity;
8+
}
9+
10+
capacity *= 2;
11+
Character **newCharacters = new Character *[capacity];
12+
for (std::size_t i = 0; i < size; i++)
13+
{
14+
newCharacters[i] = characters[i];
15+
}
16+
delete[] characters;
17+
characters = newCharacters;
18+
}
19+
20+
void Game::copy(const Game &other)
21+
{
22+
size = other.size;
23+
capacity = other.capacity;
24+
characters = new Character *[other.capacity];
25+
for (std::size_t i = 0; i < other.size; i++)
26+
{
27+
characters[i] = other.characters[i];
28+
}
29+
}
30+
void Game::destroy()
31+
{
32+
delete[] characters;
33+
}
34+
35+
Character *Game::find(const std::string &name)
36+
{
37+
for (std::size_t i = 0; i < size; i++)
38+
{
39+
if (*characters[i] == name)
40+
{
41+
return characters[i];
42+
}
43+
}
44+
return nullptr;
45+
}
46+
47+
Game::Game() : size(0), capacity(0), characters(nullptr) {}
48+
49+
Game::Game(const Game &other)
50+
{
51+
copy(other);
52+
}
53+
54+
Game::~Game()
55+
{
56+
destroy();
57+
}
58+
59+
Game &Game::operator=(const Game &other)
60+
{
61+
if (this != &other)
62+
{
63+
copy(other);
64+
destroy();
65+
}
66+
return *this;
67+
}
68+
69+
void Game::add(Character *character)
70+
{
71+
if (size == capacity)
72+
{
73+
resize();
74+
}
75+
76+
characters[size++] = character;
77+
}
78+
79+
void Game::battle(const std::string &attacker, const std::string &target)
80+
{
81+
Character *attackingCharacter = find(attacker);
82+
Character *defendingCharacter = find(target);
83+
84+
if (!attackingCharacter)
85+
{
86+
std::cout << "No character with name " << attacker << '\n';
87+
return;
88+
}
89+
90+
if (!defendingCharacter)
91+
{
92+
std::cout << "No character with name " << target << '\n';
93+
return;
94+
}
95+
96+
attackingCharacter->dealDamageTo(*defendingCharacter);
97+
98+
// TODO: remove character if health bellow 0
99+
}
100+
101+
void Game::print() const
102+
{
103+
for (std::size_t i = 0; i < size; i++)
104+
{
105+
characters[i]->print();
106+
}
107+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
#ifndef GAME_HPP
2+
#define GAME_HPP
3+
4+
#include <iostream>
5+
#include "character.hpp"
6+
7+
class Game
8+
{
9+
private:
10+
Character **characters;
11+
std::size_t size, capacity;
12+
13+
void resize();
14+
void copy(const Game &other);
15+
void destroy();
16+
Character *find(const std::string &name);
17+
public:
18+
Game();
19+
Game(const Game &other);
20+
~Game();
21+
Game &operator=(const Game &other);
22+
23+
void add(Character *character);
24+
void battle(const std::string &attacker, const std::string &target);
25+
void print() const;
26+
// TODO: add heal method
27+
};
28+
29+
#endif

0 commit comments

Comments
 (0)