Skip to content

Commit d4506e5

Browse files
committed
Add Week 5
1 parent 3943ffe commit d4506e5

File tree

5 files changed

+306
-1
lines changed

5 files changed

+306
-1
lines changed

Practicum/Week 05/Examples/main.cpp

+56
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
#include "test_weapon.hpp"
2+
#include "test_player.hpp"
3+
#include <iostream>
4+
5+
// Function to display menu and get choice
6+
int getMenuChoice() {
7+
int choice;
8+
std::cout << "\n=== Elden Ring Class System Tests ===\n"
9+
<< "1. Run all tests\n"
10+
<< "2. Run Weapon tests\n"
11+
<< "3. Run Player basic tests\n"
12+
<< "4. Run Player flask tests\n"
13+
<< "0. Exit\n"
14+
<< "Enter your choice: ";
15+
std::cin >> choice;
16+
return choice;
17+
}
18+
19+
int main() {
20+
int choice;
21+
bool running = true;
22+
23+
while (running) {
24+
choice = getMenuChoice();
25+
26+
switch (choice) {
27+
case 1:
28+
// Run all tests
29+
WeaponTest::runAllTests();
30+
std::cout << "\n-----------------------------\n" << std::endl;
31+
PlayerTest::runAllTests();
32+
break;
33+
case 2:
34+
// Run Weapon tests
35+
WeaponTest::runAllTests();
36+
break;
37+
case 3:
38+
// Run Player basic tests
39+
PlayerTest::runBasicTests();
40+
break;
41+
case 4:
42+
// Run Player flask tests
43+
PlayerTest::runFlaskTests();
44+
break;
45+
case 0:
46+
running = false;
47+
std::cout << "Exiting program...\n";
48+
break;
49+
default:
50+
std::cout << "Invalid choice! Try again.\n";
51+
break;
52+
}
53+
}
54+
55+
return 0;
56+
}
+93
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,93 @@
1+
#pragma once
2+
#include "player.hpp"
3+
#include "weapon.hpp"
4+
#include <iostream>
5+
6+
namespace PlayerTest {
7+
void runBasicTests() {
8+
// Create a new player with default values
9+
Player player;
10+
11+
// Initialize stats since we don't have a constructor
12+
player.setHp(player.getMaxHp());
13+
player.setMp(player.getMaxMp());
14+
player.setStamina(player.getMaxStamina());
15+
16+
// Print initial status
17+
std::cout << "Initial player status:" << std::endl;
18+
player.printStatus();
19+
player.printInventory();
20+
21+
// Create some weapons
22+
Weapon longsword;
23+
longsword.initialize("Longsword", 80, 5.0f, 12);
24+
25+
Weapon greatsword;
26+
greatsword.initialize("Greatsword", 120, 12.0f, 20);
27+
28+
Weapon dagger;
29+
dagger.initialize("Dagger", 45, 1.5f, 5);
30+
31+
// Try to equip weapons
32+
std::cout << "\nAttempting to equip weapons:" << std::endl;
33+
34+
// Should succeed (required strength 5 < player's strength 10)
35+
bool equipped = player.equipWeapon(dagger, 0);
36+
std::cout << "Equipping Dagger: " << (equipped ? "Success" : "Failed") << std::endl;
37+
38+
// Should succeed (required strength 12 > player's strength 10)
39+
equipped = player.equipWeapon(longsword, 1);
40+
std::cout << "Equipping Longsword: " << (equipped ? "Success" : "Failed") << std::endl;
41+
42+
// Should fail (required strength 20 > player's strength 10)
43+
equipped = player.equipWeapon(greatsword, 2);
44+
std::cout << "Equipping Greatsword: " << (equipped ? "Success" : "Failed") << std::endl;
45+
46+
// Print updated inventory
47+
std::cout << "\nUpdated inventory:" << std::endl;
48+
player.printInventory();
49+
50+
// Should succeed now (required strength 20 <= player's new strength 20)
51+
equipped = player.equipWeapon(greatsword, 2);
52+
std::cout << "Equipping Greatsword: " << (equipped ? "Success" : "Failed") << std::endl;
53+
54+
// Print updated status and inventory
55+
std::cout << "\nUpdated player status and inventory:" << std::endl;
56+
player.printStatus();
57+
player.printInventory();
58+
}
59+
60+
void runFlaskTests() {
61+
Player player;
62+
player.setHp(player.getMaxHp());
63+
player.setMp(player.getMaxMp());
64+
65+
// Test flasks
66+
std::cout << "\nTesting healing flasks:" << std::endl;
67+
std::cout << "Initial HP: " << player.getHp() << "/" << player.getMaxHp() << std::endl;
68+
69+
// Take some damage
70+
player.takeDamage(50);
71+
std::cout << "After taking 50 damage: " << player.getHp() << "/" << player.getMaxHp() << std::endl;
72+
73+
// Use HP flask
74+
player.useHpFlask();
75+
std::cout << "After using HP flask: " << player.getHp() << "/" << player.getMaxHp() << std::endl;
76+
std::cout << "HP Flasks remaining: " << player.getFlaskChargesHp() << std::endl;
77+
78+
// Try using all flasks
79+
std::cout << "\nTrying to use all HP flasks:" << std::endl;
80+
for (int i = 0; i < 5; i++) {
81+
bool success = player.useHpFlask();
82+
std::cout << "Flask use " << (i+1) << ": " << (success ? "Success" : "Failed") << std::endl;
83+
}
84+
}
85+
86+
void runAllTests() {
87+
std::cout << "=== Running Player Tests ===\n" << std::endl;
88+
runBasicTests();
89+
std::cout << "\n-----------------------------\n" << std::endl;
90+
runFlaskTests();
91+
std::cout << "\n=== Player Tests Completed ===\n" << std::endl;
92+
}
93+
}
+57
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
#pragma once
2+
#include "weapon.hpp"
3+
#include <iostream>
4+
5+
namespace WeaponTest {
6+
void runBasicTests() {
7+
// Create and initialize weapons
8+
Weapon longSword;
9+
longSword.initialize("Longsword", 80, 5.0f, 12);
10+
11+
Weapon club;
12+
club.initialize("Club", 60, 3.5f, 8);
13+
14+
Weapon dagger;
15+
dagger.initialize("Dagger", 45, 1.5f, 5);
16+
17+
Weapon greatsword;
18+
greatsword.initialize("Greatsword", 120, 12.0f, 20);
19+
20+
// Print weapon information
21+
std::cout << "Testing weapon functionality:\n" << std::endl;
22+
23+
longSword.printInfo();
24+
std::cout << std::endl;
25+
26+
club.printInfo();
27+
std::cout << std::endl;
28+
29+
dagger.printInfo();
30+
std::cout << std::endl;
31+
32+
greatsword.printInfo();
33+
}
34+
35+
void runValidationTests() {
36+
// Test validation
37+
std::cout << "\nTesting validation with invalid values:" << std::endl;
38+
39+
Weapon invalidWeapon;
40+
invalidWeapon.initialize("Invalid Weapon", -10, -2.0f, -5);
41+
invalidWeapon.printInfo();
42+
43+
// Test long name
44+
std::cout << "\nTesting long name truncation:" << std::endl;
45+
46+
Weapon longNameWeapon;
47+
longNameWeapon.initialize("This is an extremely long weapon name that should be truncated", 50, 5.0f, 10);
48+
longNameWeapon.printInfo();
49+
}
50+
51+
void runAllTests() {
52+
std::cout << "=== Running Weapon Tests ===\n" << std::endl;
53+
runBasicTests();
54+
runValidationTests();
55+
std::cout << "\n=== Weapon Tests Completed ===\n" << std::endl;
56+
}
57+
}

Practicum/Week 05/README.md

+95
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
1+
# Седмица 5 - Класове и обекти
2+
3+
Този проект въвежда концепция за класове и обекти чрез създаване на проста система за управление на герой от играта Elder Тhing.
4+
5+
### Всички член данини, методи, както и имената им са примерни. Същинската имплементация вие си я избирате.
6+
7+
## Структура на проекта
8+
9+
Проектът се състои от следните файлове:
10+
- `weapon.hpp` - декларация на структурата Weapon
11+
- `weapon.cpp` - имплементация на функциите за структурата Weapon
12+
- `player.hpp` - декларация на класа Player
13+
- `player.cpp` - имплементация на методите за класа Player
14+
- `test_weapon.hpp` - тестове за структурата Weapon
15+
- `test_player.hpp` - тестове за класа Player
16+
- `main.cpp` - главна програма с меню за избор на тестове
17+
18+
## Стъпки за имплементация
19+
20+
### 1. Създаване на Weapon структура (weapon.hpp/cpp)
21+
22+
Създайте структура `Weapon` със следните характеристики:
23+
- `name` - име на оръжието (символен масив с размер 32)
24+
- `damage` - стойност на нанесените щети
25+
- `weight` - тегло на оръжието
26+
- `requiredStrength` - необходима сила за използване на оръжието
27+
28+
Добавете метод `initialize()` за инициализация на полетата и метод `printInfo()` за извеждане на информация.
29+
30+
### 2. Създаване на Player клас (player.hpp/cpp)
31+
32+
Създайте клас `Player` със следните характеристики:
33+
34+
#### Данни
35+
- Основни атрибути:
36+
- `hp`, `maxHp` - текущи и максимални точки живот
37+
- `mp`, `maxMp` - текущи и максимални точки мана
38+
- `stamina`, `maxStamina` - текуща и максимална издръжливост
39+
- `runes` - валута в играта
40+
- `level` - ниво на героя (общ брой подобрени характеристики)
41+
42+
- Ресурси:
43+
- `flaskChargesHp` - брой заряди на фласкове за кръв
44+
- `flaskChargesMp` - брой заряди на фласкове за мана
45+
46+
- Екипировка:
47+
- `currentWeight` - текущо тегло
48+
- `maxCarryCapacity` - максимален капацитет
49+
- `weaponSlots` - масив от 3 оръжия (тип Weapon)
50+
- `weaponSlotOccupied` - направете го максимално оптимизиран по памет.
51+
52+
#### Методи
53+
- Методи за достъп до полетата (getters)
54+
- Методи за промяна на стойностите (setters)
55+
- Методи за увеличаване на характеристиките
56+
- Игрови механики:
57+
- Използване на фласкове
58+
- Екипиране с оръжия
59+
- Получаване на щети
60+
- Методи за извеждане на информация
61+
62+
## Важни забележки
63+
64+
1. За класа Player:
65+
- Всички данни трябва да са private
66+
- Методите за достъп трябва да са public
67+
- Използвайте подходящи const методи където е възможно
68+
- Фласковете започват с 3 заряда всеки
69+
- Нивото започва от 0
70+
71+
2. За структурата Weapon:
72+
- Всеки параметър трябва да се валидира в метода initialize()
73+
- Името не трябва да надвишава 31 символа (за да има място за null-терминатор)
74+
75+
## Тестване на проекта
76+
77+
В проекта са включени тестове в две header файла:
78+
- `test_weapon.hpp` - съдържа тестове за структурата Weapon
79+
- `test_player.hpp` - съдържа тестове за класа Player
80+
81+
Също така има `main.cpp` файл, който предоставя меню за избор на различни тестове.
82+
83+
За компилиране и стартиране на тестовете:
84+
85+
```bash
86+
g++ weapon.cpp player.cpp main.cpp -o elden_ring_test
87+
./elden_ring_test
88+
```
89+
90+
Когато стартирате програмата, ще видите меню с опции:
91+
1. Изпълнение на всички тестове
92+
2. Изпълнение на тестовете за Weapon
93+
3. Изпълнение на основните тестове за Player
94+
4. Изпълнение на тестовете за флаконите
95+
5. Изпълнение на тестовете за повишаване на ниво

README.md

+5-1
Original file line numberDiff line numberDiff line change
@@ -9,4 +9,8 @@
99
### [:one: Enums, Namespaces](https://github.com/xKrashx/Object_Oriented_Programming/tree/main/Practicum/Week%2001)
1010
### [:two: Structs, bit fields](https://github.com/xKrashx/Object_Oriented_Programming/tree/main/Practicum/Week%2002)
1111
### [:three: Text files](https://github.com/xKrashx/Object_Oriented_Programming/tree/main/Practicum/Week%2003)
12-
### [:four: Binary files](https://github.com/xKrashx/Object_Oriented_Programming/tree/main/Practicum/Week%2004)
12+
### [:four: Binary files](https://github.com/xKrashx/Object_Oriented_Programming/tree/main/Practicum/Week%2004)
13+
### [:five: Classes](https://github.com/xKrashx/Object_Oriented_Programming/tree/main/Practicum/Week%2005)
14+
15+
## :pushpin: Additional materials and resources:
16+
### [:bug: How to debug multiple C++ source files in VSCode](https://github.com/xKrashx/Object_Oriented_Programming/tree/main/Misc/Tutorials)

0 commit comments

Comments
 (0)