变量的值在使用C++的简单文本 RPG 游戏中不会更改

The value of the variables aren't changing in a simple text RPG game using C++

本文关键字:游戏 RPG 简单 变量 C++ 文本      更新时间:2023-10-16

我正在尝试创建一个非常简单的回合制文本RPG游戏。代码编译并运行,但攻击和修复函数似乎不会更改变量的值。我很确定这是一个与继承有关的问题,但我不确定。

#include <iostream>
#include <cstdlib>
#include <string>
using namespace std;
struct Stats {
       int hp;
       int def;
       int atk;
       int skl;
};
class Character {
      public:
             Character();
             virtual void getHit(int) = 0;
             int attack(int);
             void defend();
             virtual int getHP() = 0;
      protected:
              Stats m_Stats;
};
Character::Character() {
   m_Stats.hp = 0;
   m_Stats.def = 0;
   m_Stats.atk = 0;
   m_Stats.skl = 0;
}
int Character::attack(int def) 
{
    return (m_Stats.atk - def);
}

class Player : public Character {
      public:
             Player();
             void getHit(int);
             void healSelf();
             void fireBall();
             int getAtk();
             int getHP();
};
Player::Player()
{
     m_Stats.hp = 100;
     m_Stats.atk = 30;
     m_Stats.def = 10;
     m_Stats.skl = 10;     
}
int Player::getHP()
{
    return m_Stats.hp;
}
int Player::getAtk()
{ return m_Stats.atk; }
void Player::getHit(int atk)
{
   m_Stats.atk += m_Stats.def - atk;     
 }
void Player::healSelf()
{
     m_Stats.hp += m_Stats.skl;
     if(m_Stats.hp > 100)
        m_Stats.hp = 100;
}

class Enemy : public Character {
      public:
             Enemy();
             void getHit(int);
             void chooseAction();
             void rage();
             int choose();
             void defend();
             void resetAtk();
             int getAtk();
             int getHP();
};
Enemy::Enemy()
{
     m_Stats.hp = 150;
     m_Stats.atk = 40;
     m_Stats.def = 5;
     m_Stats.skl = 5;
}
int Enemy::getHP()
{
    return m_Stats.hp;
}
int Enemy::getAtk()
{
     return m_Stats.atk;
}
void Enemy::resetAtk()
{
     m_Stats.atk = 40;
}
int Enemy::choose()
{
     srand(time(0));
     int c = rand() % 3;
     if(c == 0)
        cout << "Enemy chooses to attack!n";
     else if(c == 1)
        cout << "Enemy is raging!n";
     else if(c == 2)
        cout << "Enemy chooses to defend!n";
     return c;
}
void Enemy::rage()
{
     m_Stats.atk += 3;
 }
void Enemy::getHit(int atk)
{
   m_Stats.atk += m_Stats.def - atk;   
   m_Stats.def = 5;  
}
void Enemy::defend()
{
     m_Stats.def += 2;
}

int main()
{
    Player p;
    Enemy e;
    bool done = false; int choice, move;
    cout << "The enemy faces you!n";
    while(!done)
    {cout << "1) Attack  2) Heal Self. ";
     cin >> choice;
     if(choice == 1)
      {  e.getHit(p.getAtk());}
     else if(choice == 2)
        {p.healSelf(); }
     cout << "Your HP: " << p.getHP() << "n";
     cout << "Enemy HP: " << e.getHP() << "n";
     choice = e.choose();
     if(choice == 1)
         {p.getHit(e.getAtk());
         e.resetAtk();
         }
     else if(choice == 2)
         e.rage();
     else if(choice == 3)
         e.defend();
     cout << "Your HP: " << p.getHP() << "n";
     cout << "Enemy HP: " << e.getHP() << "n";

     if(p.getHP() == 0 || e.getHP() == 0)
         done = true;
     }
     if(p.getHP() > e.getHP())
         cout << "You won!" << endl;
     else
         cout << "You lost!" << endl;

    system("PAUSE");
    return 0;
}

样本输出

敌人面对你!1) 攻击2)自我治疗。1.你的生命值:100敌人生命值:150敌人选择防御!你的生命值:100敌人生命值:1501) 攻击2)自我治疗:2你的生命值:100敌人生命值:150

是的,输出并不漂亮,但我推迟了在代码稳定后清理输出。如有任何帮助,我们将不胜感激。谢谢

为什么希望这些值发生变化?程序中更改hp字段值的唯一位置是Player::healSelf方法。由于玩家的生命值上限为100,并且玩家从一开始就有100生命值,因此调用healSelf不能将hp值提高到100以上。这就是为什么它没有改变。

我希望你的getHit方法能改变玩家和敌人的hp值。但他们没有。亲自查看

void Enemy::getHit(int atk)
{
   m_Stats.atk += m_Stats.def - atk;   
   m_Stats.def = 5;  
}

代码中没有提到hp。令人惊讶的是,这是一只虫子。Player::getHit实现中似乎也存在同样的错误。

从外观上看,当你选择"攻击"时,你调用的是e.getHit(),这可能意味着"敌人"被"击中"。然而,这个功能并没有改变HP,它改变了ATK。。。

你改变的是攻击,而不是健康。

通常,球员的防守决定了进攻的规模。

void Player::getHit(int atk)
{
    m_Stats.atk += m_Stats.def - atk;     
}

如果你假设你有100 hp,防御0.8并且有人攻击你20点的话,你可以这样做:

void Player::getHit(int atk)
{
    m_Stats.hp -= m_Stats.def * atk;     
}

你的防御阻碍了进攻,现在你拥有84马力