Я работаю над финальным проектом для класса, и у меня возникли небольшие проблемы.Когда я создаю свой объект героя или монстра и присваиваю ему значения, что я и проверял в закомментированном разделе в основном, я не могу получить доступ к этой информации.Например, в моей функции сражаться, где я вызываю монстра. Атак () имя объекта воина или мага появляется пустым.Если я запускаю быстрый прыжок, все выглядит хорошо, за исключением членов объектов Героя, таких как имя, тип, maxHealth, maxMana, но появляется имя оружия и т. Д.Любая помощь будет принята с благодарностью!
#include <iostream>
#include <vector>
#include <string>
#include <time.h>
#include <windows.h>
using namespace std;
struct Weapon;
struct Belt;
struct Potion;
struct Ability;
class Hero;
class Monster;
void CreateCharacters(Hero&, Hero&, Monster&);
int ShowMenu();
void Fight(Hero&, Hero&, Monster&);
struct Weapon{
std::string name;
int damage;
};
struct Belt{
std::vector<Potion> contents;
};
struct Potion{
enum e_Type{Health, Mana} type;
int amount;
};
struct Ability{
std::string name;
enum e_Type{Offensive, Defensive, Neutral} type;
int manaCost;
int amount;
};
class Hero{
public:
std::string name;
int maxHealth;
int maxMana;
public:
Weapon weapon;
Belt belt;
std::vector<Ability> abilities;
enum e_HeroType{Warrior, Mage} heroType;
int health;
int mana;
void CreateHero(std::string name, int maxHealth, int maxMana, Hero::e_HeroType heroType){
name = name;
maxHealth = maxHealth;
maxMana = maxMana;
health = maxHealth;
mana = maxMana;
heroType = heroType;
}
void CreateWeapon(std::string name, int damage){
weapon.name = name;
weapon.damage = damage;
}
void FillBelt(Potion::e_Type type, int amount){
Potion potion;
potion.type = type;
potion.amount = amount;
for (int i = 0; i < 3; i++){
belt.contents.push_back(potion);
}
}
void CreateAbility(std::string name, Ability::e_Type type, int manaCost, int amount){
Ability ability;
ability.name = name;
ability.type = type;
ability.manaCost = manaCost;
ability.amount = amount;
abilities.push_back(ability);
}
void Attack(){}
void TakeDamage(){}
void UseItem(){}
};
class Monster{
private:
std::string name;
int maxHealth;
public:
int health;
Weapon weapon;
void CreateMonster(std::string name, int maxHealth){
name = name;
maxHealth = maxHealth;
health = maxHealth;
}
void CreateWeapon(std::string name, int damage){
weapon.name = name;
weapon.damage = damage;
}
void Attack(Hero &mage, Hero &warrior, Monster &monster){
std::cout << "The troll takes a random swing!" << endl;
Sleep(3000);
srand(time(NULL));
int randomNumber = rand() % 2 + 1;
if (randomNumber == 1){
mage.health -= monster.weapon.damage;
cout << mage.name << " has been struck!" << endl;
Sleep(2500);
cout << "The health of " << mage.name << " has dropped to " << mage.health << endl;
} else if (randomNumber == 2){
warrior.health -= monster.weapon.damage;
cout << warrior.name << " has been struck!" << endl;
Sleep(2500);
cout << "The health of " << warrior.name << " has dropped to " << warrior.health << endl;
}
}
void TakeDamage(){}
};
void CreateCharacters(Hero &mage, Hero &warrior, Monster &monster){
mage.CreateHero("Gandalf", 80, 100, Hero::Mage);
mage.CreateWeapon("Rod of Ages", 5);
mage.FillBelt(Potion::Mana, 25);
mage.CreateAbility("Fireball", Ability::Offensive, 15, 25);
mage.CreateAbility("Heal", Ability::Defensive, 10, 25);
warrior.CreateHero("Spartacus", 100, 0, Hero::Warrior);
warrior.CreateWeapon("The Destroyer", 35);
warrior.FillBelt(Potion::Health, 25);
monster.CreateMonster("Trollio", 250);
monster.CreateWeapon("Mighty Club", 15);
}
int ShowMenu(){
int choice;
cout << "\nWelcome to the Battle!" << endl;
cout << "----------------------" << endl;
cout << "Please make a choice from the following:" << endl;
cout << "1. Fight Now!" << endl;
cout << "2. Quit" << endl;
cin >> choice;
return choice;
}
void Fight(Hero &mage, Hero &warrior, Monster &monster){
std::cout << "\nYou have chosen to fight!" << endl;
Sleep(3000);
monster.Attack(mage, warrior, monster);
}
int main(){
Hero mage;
Hero warrior;
Monster monster;
CreateCharacters(mage, warrior, monster);
do {
int choice = ShowMenu();
if (choice == 1){
Fight(mage, warrior, monster);
} else if (choice == 2){
break;
}
} while (true);
cin.ignore();
cin.get();
return 0;
}
Что меня также смущает, так это то, что функция monster.Attack () правильно отображает здоровье, уменьшенное для мага или воина, но не отображается на бойце.
Вот результат небольшого теста cout, который я сделал, обратите внимание на верхние 4 и примерно на полпути через остальные четыре ссылки на объекты: тип героев, имя, maxHealth и maxMana не регистрируются.
-858993460
-858993460
-858993460
5
Rod of Ages
Fireball
0
25
15
Heal
1
25
10
1
25
1
25
1
25
-858993460
-858993460
-858993460
35
The Destroyer
0
25
0
25
0
25