делаю файт для текстовой рпг на с++ и вывод после функции ненормальный
#include<iostream>
#include<string>
using namespace std;
class enemy {
float hp, damage;
public:
enemy() { hp, damage; }
void input() {
cout << "enemy hp" << endl;
cin >> hp;
cout << "enemy damage" << endl;
cin >> damage;
}
void debug_output() {
cout << hp << " " << damage << endl;
}
int GetDamage() const {
return damage;
}
void mhp() {
enemy h;
hp = hp - h.GetDamage();
}
int gethp() const {
return hp;
}
};
class hero {
unsigned int hp, damage, chp;
int zel_h, zel_s;
public:
hero() { hp, damage, zel_h, zel_s; }
void init() {
chp = hp;
}
void use_zel_h() {
if (hp == chp) {
zel_h--;
}
else {
zel_h--;
hp = chp;
}
}
void input() {
cout << "hero hp" << endl;
cin >> hp;
cout << "hero damage" << endl;
cin >> damage;
cout << "zelie" << endl;
cin >> zel_h;
}
void debug_output() {
cout << hp << " " << damage << " " << zel_h << endl;
}
void mhp() {
enemy e;
hp = hp - e.GetDamage();
}
int GetDamage() const {
return damage;
}
int gethp() const {
return hp;
}
};
void battle() {
hero h;
enemy e;
string input;
int flag = 0;//0-hero,1-enemy
cin >> input;
if (flag == 0) {
if (input == "hit") {
e.mhp();
flag = 1;
cout << "hero hp: " << h.gethp() << "|" << "enemy hp: " << e.gethp()<<endl;
}
else if (input == "use zel") {
h.use_zel_h();
flag = 1;
cout << "hero hp: " << h.gethp() << "|" << "enemy hp: " << e.gethp() << endl;
}
}
else {
h.mhp();
flag = 0;
cout << "hero hp: " << h.gethp() << "|" << "enemy hp: " << e.gethp() << endl;
}
}
int main() {
hero h;
enemy e;
h.init();
e.input();
h.input();
cout << h.gethp() << endl;
battle();
}
проблема в том что при выводе здоровья врага в начале оно выводится нормально а после работы функции mhp в обеих классов вывод всегда какой то непонятный здоровье героя -огромное число а здоровье врага всегда 0.
Ответы (1 шт):
Автор решения: NunOfIt
→ Ссылка
// ------------- //
// - Enemy.hpp - //
// ------------- //
#ifndef __ENEMY_HPP__
#define __ENEMY_HPP__
#include <iostream>
class Enemy {
public:
Enemy();
Enemy(int, int);
Enemy(int (&data)[]);
int get_hp() const;
int get_damage() const;
void modifyHP(Enemy&);
friend std::ostream& operator<<(std::ostream&, const Enemy&);
protected:
int hp, damage;
};
#endif
// ------------- //
// - Enemy.cpp - //
// ------------- //
#include "Enemy.hpp"
Enemy::Enemy(): hp(0), damage(0) {}
Enemy::Enemy(int hp, int damage): hp(hp), damage(damage) {}
Enemy::Enemy(int (&data)[]): hp(data[0]), damage(data[1]) {}
int Enemy::get_hp() const { return hp; }
int Enemy::get_damage() const { return damage; }
void Enemy::modifyHP(Enemy& other) { hp -= other.get_damage(); }
std::ostream& operator<<(std::ostream& out, const Enemy& other) {
out << "Enemy(";
out << "hp: " << other.get_hp() << ", ";
out << "damage: " << other.get_damage() << ")";
return out;
}
// ------------ //
// - Hero.hpp - //
// ------------ //
#ifndef __HERO_HPP__
#define __HERO_HPP__
#include "Enemy.hpp"
class Hero: public Enemy {
int hp0, zelie;
public:
Hero();
Hero(int, int, int);
Hero(int (&data)[]);
int get_zelie() const;
bool useZelie();
friend std::ostream& operator<<(std::ostream&, const Hero&);
};
#endif
// ------------ //
// - Hero.cpp - //
// ------------ //
#include "Hero.hpp"
Hero::Hero(): Enemy(), hp0(0), zelie(0) {}
Hero::Hero(int hp, int damage, int zelie): Enemy(hp, damage), hp0(hp), zelie(zelie) {}
Hero::Hero(int (&data)[]): Enemy(data), hp0(data[0]), zelie(data[2]) {}
int Hero::get_zelie() const { return zelie; }
bool Hero::useZelie() {
if (zelie) {
hp += hp0 / 5;
--zelie;
return true;
}
return false;
}
std::ostream& operator<<(std::ostream& out, const Hero& other) {
out << "Hero(";
out << "hp: " << other.get_hp() << ", ";
out << "zelie: " << other.get_zelie() << ", ";
out << "damage: " << other.get_damage() << ")";
return out;
}
// ------------ //
// - main.cpp - //
// ------------ //
#include "Hero.hpp"
#include <string>
void scan(int (&data)[], std::string name, int count, const std::string (&strs)[]) {
std::cout << name << '\n';
for(int i = 0; i < count; ++i) {
std::cout << "--> " << strs[i] << ": ";
std::cin >> data[i];
if (data[i] <= 0) {
std::cout << "Input value must be a positive integer\n";
--i;
}
}
std::cin.clear();
}
bool battle(Hero& hero, Enemy& enemy, std::string& input, bool& key) {
// -------- //
// - Hero - //
// -------- //
if (input == "hit")
enemy.modifyHP(hero);
else if (input == "zelie") {
if (!hero.useZelie()) {
std::cout << "All zelies have been used!\n";
return true;
}
}
else {
std::cout << "Unknown command!\n";
return true;
}
std::cout << enemy << '\n';
if (enemy.get_hp() <= 0)
return false;
key = !key;
// --------- //
// - Enemy - //
// --------- //
hero.modifyHP(enemy);
std::cout << hero << '\n';
if (hero.get_hp() <= 0)
return false;
key = !key;
return true;
}
int main() {
int hero_data[3], enemy_data[2];
(void) scan(enemy_data, "Enemy", 2, {"HP", "Damage"});
(void) scan(hero_data, "Hero", 3, {"HP", "Damage", "Zelie"});
Hero hero(hero_data);
Enemy enemy(enemy_data);
bool key = true;
std::string input;
int i = 0;
do {
std::cout << "Action " << ++i << ": ";
std::cin >> input;
} while(battle(hero, enemy, input, key));
std::cout << "\n\n";
if (key)
std::cout << "Hero wins!\n";
else
std::cout << "Enemy wins!\n";
return 0;
}