2015-11-18 2 views
-2

Я делаю игру, и у меня возникает проблема с тем, что значение класса, которое устанавливается, остается установленным и не возвращается к стандартным значениям конструктора. Я попытался найти что-то, связанное с моей проблемой, но я его не нашел, поэтому прошу прощения, если это повторение.C++ функция устанавливает класс varaibles, не сохраняя новое заданное значение.

void playerCombat(Hero hero, Enemy enemy, Item heroWeapon, Item enemyWeapon, Item heroArmor, Item enemyArmor) 
{ 
int hp = 0; 

int damage = 0; 

if (heroWeapon.getType() == "Slice" && enemyArmor.getType() == "Light") 
{ 
    damage = -enemyArmor.getDefense() - enemy.getDefense() + (rand() % 20 + 1) + (hero.getAttack() * 2); 

    if (damage > 0) 
    { 
     hp = (enemy.getHP() - damage); 
     enemy.setHp(hp); 
    } 
    else 
    { 
     damage = 0; 
     cout << hero.getName() << " missed." << endl; 
    } 
} 
else if (heroWeapon.getType() == "Stab" && enemyArmor.getType() == "Medium") 
{ 
    damage = -enemyArmor.getDefense() - enemy.getDefense() + (rand() % 20 + 1) + (hero.getAttack() * 2); 

    if (damage > 0) 
    { 
     hp = (enemy.getHP() - damage); 
     enemy.setHp(hp); 
    } 
    else 
    { 
     damage = 0; 
     cout << hero.getName() << " missed." << endl; 
    } 
} 
else if (heroWeapon.getType() == "Blunt" && enemyArmor.getType() == "Heavy") 
{ 
    damage = -enemyArmor.getDefense() - enemy.getDefense() + (rand() % 20 + 1) + (hero.getAttack() * 2); 

    if (damage > 0) 
    { 
     hp = (enemy.getHP() - damage); 
     enemy.setHp(hp); 
    } 
    else 
    { 
     damage = 0; 
     cout << hero.getName() << " missed." << endl; 
    } 
} 
else if (heroWeapon.getType() == "Sword" && enemyArmor.getType() == "Medium") 
{ 
    damage = -enemyArmor.getDefense() - enemy.getDefense() + (rand() % 20 + 1) + (hero.getAttack() * .5); 

    if (damage > 0) 
    { 
     hp = (enemy.getHP() - damage); 
     enemy.setHp(hp); 
    } 
    else 
    { 
     damage = 0; 
     cout << hero.getName() << "'s weapon was ineffective." << endl; 
    } 
} 
else if (heroWeapon.getType() == "Stab" && enemyArmor.getType() == "Heavy") 
{ 
    damage = -enemyArmor.getDefense() - enemy.getDefense() + (rand() % 20 + 1) + (hero.getAttack() * .5); 

    if (damage > 0) 
    { 
     hp = (enemy.getHP() - damage); 
     enemy.setHp(hp); 
    } 
    else 
    { 
     damage = 0; 
     cout << hero.getName() << "'s weapon was ineffective." << endl; 
    } 
} 
else if (heroWeapon.getType() == "Blunt" && enemyArmor.getType() == "Light") 
{ 
    damage = -enemyArmor.getDefense() - enemy.getDefense() + (rand() % 20 + 1) + (hero.getAttack() * .5); 

    if (damage > 0) 
    { 
     hp = (enemy.getHP() - damage); 
     enemy.setHp(hp); 
    } 
    else 
    { 
     damage = 0; 
     cout << hero.getName() << " missed." << endl; 
    } 
} 
else 
{ 
    damage = -enemyArmor.getDefense() - enemy.getDefense() + (rand() % 20 + 1) + (hero.getAttack()); 

    if (damage > 0) 
    { 
     hp = (enemy.getHP() - damage); 
     enemy.setHp(hp); 
    } 
    else 
    { 
     damage = 0; 
     cout << hero.getName() << "'s weapon was ineffective." << endl; 
    } 
} 
cout << hero.getName() << " deals " << damage << " points of damage to " << enemy.getName() << "." << endl; 
cout << enemy.getName() << " has " << enemy.getHP() << " out of " << enemy.getMaxHp() << "." << endl; 
cout << hero.getName() << " has " << hero.getHP() << " out of " << hero.getMaxHp() << "." << endl; 
system("pause"); 


} 

void enemyCombat(Hero hero, Enemy enemy, Item heroWeapon, Item enemyWeapon, Item heroArmor, Item enemyArmor) 
{ 
int hp = 0; 
int damage = 0; 


if (enemyWeapon.getType() == "Slice" && heroArmor.getType() == "Light") 
{ 
    damage = (rand() % 20 + 1) + (enemy.getAttack() * 2) - enemyArmor.getDefense() - enemy.getDefense(); 

    if (damage > 0) 
    { 
     hp = (hero.getHP() - damage); 
     hero.setHp(hp); 
    } 
    else 
    { 
     damage = 0; 
     cout << enemy.getName() << " missed" << endl; 
    } 
} 
else if (enemyWeapon.getType() == "Stab" && heroArmor.getType() == "Medium") 
{ 
    damage = (rand() % 20 + 1) + (enemy.getAttack() * 2) - enemyArmor.getDefense() - enemy.getDefense(); 

    if (damage > 0) 
    { 
     hp = (hero.getHP() - damage); 
     hero.setHp(hp); 
    } 
    else 
    { 
     damage = 0; 
     cout << enemy.getName() << " missed" << endl; 
    } 
} 
else if (enemyWeapon.getType() == "Blunt" && heroArmor.getType() == "Heavy") 
{ 
    damage = (rand() % 20 + 1) + (enemy.getAttack() * 2) - enemyArmor.getDefense() - enemy.getDefense(); 

    if (damage > 0) 
    { 

     hp = (hero.getHP() - damage); 
     hero.setHp(hp); 
    } 
    else 
    { 
     damage = 0; 
     cout << enemy.getName() << " missed" << endl; 
    } 
} 
else if (enemyWeapon.getType() == "Sword" && heroArmor.getType() == "Medium") 
{ 
    damage = (rand() % 20 + 1) + (enemy.getAttack() * .5) - enemyArmor.getDefense() - enemy.getDefense(); 

    if (damage > 0) 
    { 
     hp = (hero.getHP() - damage); 
     hero.setHp(hp); 
    } 
    else 
    { 
     damage = 0; 
     cout << enemy.getName() << "'s attack was ineffective." << endl; 
    } 
} 
else if (enemyWeapon.getType() == "Stab" && heroArmor.getType() == "Heavy") 
{ 
    damage = (rand() % 20 + 1) + (enemy.getAttack() * .5) - enemyArmor.getDefense() - enemy.getDefense(); 

    if (damage > 0) 
    { 
     hp = (hero.getHP() - damage); 
     hero.setHp(hp); 
    } 
    else 
    { 
     damage = 0; 
     cout << enemy.getName() << "'s attack was ineffective." << endl; 
    } 
} 
else if (enemyWeapon.getType() == "Blunt" && heroArmor.getType() == "Light") 
{ 
    damage = (rand() % 20 + 1) + (enemy.getAttack() * .5) - enemyArmor.getDefense() - enemy.getDefense(); 

    if (damage > 0) 
    { 
     hp = (hero.getHP() - damage); 
     hero.setHp(hp); 
    } 
    else 
    { 
     damage = 0; 
     cout << enemy.getName() << "'s attack was ineffective." << endl; 
    } 
} 
else 
{ 
    damage = (rand() % 20 + 1) + (enemy.getAttack()) - enemyArmor.getDefense() - enemy.getDefense(); 

    if (damage > 0) 
    { 
     hp = (hero.getHP() - damage); 
     hero.setHp(hp); 
    } 
    else 
    { 
     damage = 0; 
     cout << enemy.getName() << "' missed." << endl; 
    } 
} 
cout << enemy.getName() << " deals " << damage << " points of damage to " << hero.getName() << "." << endl; 
cout << enemy.getName() << " has " << enemy.getHP() << " out of " << enemy.getMaxHp() << "." << endl; 
cout << hero.getName() << " has " << hero.getHP() << " out of " << hero.getMaxHp() << "." << endl; 
system("pause"); 


} 

void combat(Hero hero, Enemy enemy, Item heroWeapon, Item enemyWeapon, Item heroArmor, Item enemyArmor) 
{ 



if (hero.getSpeed() > enemy.getSpeed()) 
{ 
    playerCombat(hero, enemy, heroWeapon, enemyWeapon, heroArmor, enemyArmor); 

    enemyCombat(hero, enemy, heroWeapon, enemyWeapon, heroArmor, enemyArmor); 

} 
else if (hero.getSpeed() < enemy.getSpeed()) 
{ 
    playerCombat(hero, enemy, heroWeapon, enemyWeapon, heroArmor, enemyArmor); 

    enemyCombat(hero, enemy, heroWeapon, enemyWeapon, heroArmor, enemyArmor); 

} 
else 
{ 
    if ((rand() % 2 + 1) == 1) 
    { 
     playerCombat(hero, enemy, heroWeapon, enemyWeapon, heroArmor, enemyArmor); 

     enemyCombat(hero, enemy, heroWeapon, enemyWeapon, heroArmor, enemyArmor); 
    } 
    else 
    { 
     playerCombat(hero, enemy, heroWeapon, enemyWeapon, heroArmor, enemyArmor); 

     enemyCombat(hero, enemy, heroWeapon, enemyWeapon, heroArmor, enemyArmor); 
    } 
    cout << hero.getHP() << endl << enemy.getHP() << endl; 
} 
if (enemy.getHP() < 0) 
{ 
    cout << "You lose!"; 
} 
else if (hero.getHP() < 0) 
{ 
    cout << "You win!"; 
} 
else 
{ 
    combat(hero, enemy, heroWeapon, enemyWeapon, heroArmor, enemyArmor); 
} 
} 

По какой-то причине после функций для конкретного символов конца боя, он не сохраняет новое значение HP, а просто сбрасывает его обратно свои полные л.с. (в данном случае 100)

+1

Не могли бы вы уменьшить это до [MCVE], и более конкретно, что на самом деле происходит неправильно. –

ответ

1

Вы прошли объекты по значению в функцию, но вы хотели бы внести длительные изменения в эти объекты. C++ не работает таким образом для передачи по значению.

Таким образом, вы должны были пройти по ссылке:

void playerCombat(Hero& hero, Enemy& enemy, Item& heroWeapon, Item& enemyWeapon, Item& heroArmor, Item& enemyArmor) 

Аналогично для всех остальных функций, которые, как предполагается модифицировать объекты, переданные им.

Я показал предложенные изменения в строке «подпись» игрока «Комбат». Исправьте линии подписи каждой функции:

Если вы передадите объект, который будет изменен внутри функции, и вы не должны НЕ ДЕЛАЕТ, чтобы эти изменения повлияли на оригинал (вы хотите, чтобы изменения были только последними во время выполнения функция) передача по значению, например, Hero hero

Если передать объект, который будет модифицированным внутри функция, и вы хотите, чтобы эти изменения влияют на первоначальный проход по ссылке, например, Hero& hero

Если вы передаете объект, который будет NOT be модифицированный внутри функции, обычно лучше всего передавать константу, например Hero const& hero

+0

константа для немодифицированных объектов. – SergeyA

+0

Я не читал размещенный код достаточно тщательно, чтобы проверить, не должен ли какой-либо из переданных объектов никогда не изменяться функцией. Любой, который никогда не был изменен, работал бы корректно, когда его передавали по значению, но лучше было бы передавать его 'const &' – JSF

0

Вы передаете переменные функции по значению, фактически в функции, с которой вы работаете с их копиями. Вам нужны переменные прохода по ссылке, например

void playerCombat(Hero &hero, Enemy &enemy, Item &heroWeapon, Item &enemyWeapon, Item &heroArmor, Item &enemyArmor) 
+0

. Значит, мне придется идти в мои классы и перегружать оператор &? –

+1

Если у вас не очень странное значение для вашего использования слова «перегрузка», три (в основном идентичные) ответы вы получили ** НЕ НИЧЕГО это означает. Просто посмотрите, где '' '' были добавлены в подпись этих функций и добавить '&' s в подписи функций таким образом для каждого объекта, для которого вы хотите, чтобы изменения, сделанные внутри функции, влияли на исходный объект. – JSF

Смежные вопросы