我正在为课堂上的最后一个项目工作,我遇到了一些麻烦。当我创建我的英雄或怪物对象并为其分配值时,我正在使用main中已注释的部分进行检查,我无法访问该信息。例如,在我的函数中,我称之为怪物.Attack()战士或法师对象的名称出现空白。如果我运行快速cout一切看起来不错,除了名称,类型,maxHealth,maxMana等Hero对象成员,但武器名称等显示出来。任何帮助将不胜感激!
#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上。
这是我做过的小cout测试的输出,注意前4位,其他四位参考对象herotype,name,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
答案 0 :(得分:2)
我认为问题是参数名称与您的成员变量名称相同:
void CreateHero(std::string name, int maxHealth, int maxMana, Hero::e_HeroType heroType){
name = name; // Assigning member variable to itself.
...
尝试更改为:
void CreateHero(std::string a_name, int a_maxHealth, int a_maxMana, Hero::e_HeroType a_heroType){
name = a_name;
...