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

时间:2012-08-19 08:25:37

标签: c++ inheritance text-based

我正在尝试创建一个非常简单的回合制文本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;
}

示例输出

The enemy faces you!
1) Attack  2) Heal Self. 1
Your HP: 100
Enemy HP: 150
Enemy chooses to defend!
Your HP: 100
Enemy HP: 150
1) Attack  2) Heal Self: 2
Your HP: 100
Enemy HP: 150

是的,输出不是很漂亮,但是在代码稳定之后,我正在推迟清理输出。任何帮助,将不胜感激。感谢。

3 个答案:

答案 0 :(得分:2)

为什么您希望这些值发生变化?您的程序中唯一可以更改hp字段值的地方是Player::healSelf方法。由于播放器的HP上限为100,并且播放器从一开始就有100 HP,因此调用healSelf不能使hp值超过100.这就是它不会改变的原因。

我希望您的getHit方法可以更改玩家和敌人的hp值。但他们没有。亲眼看看

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

该代码中没有提及hp。显然,这是一个错误。 Player::getHit实施中似乎存在同样的错误。

答案 1 :(得分:0)

从它的外观来看,当你选择“攻击”时,你正在调用e.getHit(),这可能意味着“敌人”被“击中”。但是,该功能不会改变HP,它会改变ATK ......

答案 2 :(得分:0)

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

通常,玩家防守决定了攻击的缩放方式。

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

如果你认为你有 100马力,防御 0.8 而有人攻击你 20分,你可以做这样的事情:

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

你的防守阻碍了攻击,现在你已经 84hp