C++ 变量的值为';使用C++;

C++ 变量的值为';使用C++;,c++,inheritance,text-based,C++,Inheritance,Text Based,我正在尝试创建一个非常简单的基于回合的文本RPG游戏。代码可以编译并运行,但攻击和治疗功能似乎不会更改变量的值。我很确定这是一个与继承有关的问题,但我不确定 #include <iostream> #include <cstdlib> #include <string> using namespace std; struct Stats { int hp; int def; int atk; int

我正在尝试创建一个非常简单的基于回合的文本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;
}
#包括
#包括
#包括
使用名称空间std;
结构统计{
int-hp;
int-def;
int atk;
int skl;
};
类字符{
公众:
字符();
虚空getHit(int)=0;
int攻击(int);
无效辩护();
虚拟int getHP()=0;
受保护的:
统计m_统计;
};
Character::Character(){
m_Stats.hp=0;
m_Stats.def=0;
m_Stats.atk=0;
m_Stats.skl=0;
}
int Character::攻击(int def)
{
返回(m_Stats.atk-def);
}
职业玩家:公众人物{
公众:
Player();
无效getHit(int);
虚空自我();
空心火球();
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()
{
返回m_Stats.hp;
}
int Player::getAtk()
{返回m_Stats.atk;}
无效玩家::getHit(int atk)
{
m_Stats.atk+=m_Stats.def-atk;
}
无效玩家::healSelf()
{
m_Stats.hp+=m_Stats.skl;
如果(m_Stats.hp>100)
m_Stats.hp=100;
}
阶级敌人:公众人物{
公众:
敌人();
无效getHit(int);
void chooseAction();
虚空愤怒();
int choose();
无效辩护();
void resetAtk();
int getAtk();
int getHP();
};
敌人
{
m_Stats.hp=150;
m_Stats.atk=40;
m_Stats.def=5;
m_Stats.skl=5;
}
int敌人::getHP()
{
返回m_Stats.hp;
}
int敌人::getAtk()
{
返回m_Stats.atk;
}
无效敌人::resetAtk()
{
m_Stats.atk=40;
}
int敌人::选择()
{
srand(时间(0));
int c=rand()%3;
如果(c==0)

cout从外观上看,当你选择“攻击”时,你调用的是e.getHit(),这可能意味着“敌人”是“命中”。但是,该函数不会更改HP,它会更改ATK…

为什么您希望这些值会更改?程序中唯一可以更改
HP
字段值的地方是
Player::healSelf
方法。由于玩家的HP上限为100,玩家从一开始就有100 HP,因此调用e> healSelf
无法将
hp
值提高到100以上。这就是为什么它不会改变

我希望你的
getHit
方法可以改变玩家和敌人的
hp
值。但是他们没有。你自己看看吧

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

代码中没有提到hp。显然,这是一个bug。同样的bug似乎出现在
Player::getHit
实现中。

您正在更改攻击,而不是生命值

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

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

在你的代码中找到你期望值发生变化的地方,仔细检查代码,以确保你让它做你想做的事情。请注意正确格式化你的代码。缩进不明显。旁注:如果你调用
srand
,你应该在程序开始时做一次;不是每次你想生成伪随机数时都要做。是的,谢谢你指出这一点。在使用标签之前先阅读标签。这不是关于RPG编程语言的问题。这个问题可能属于gamedevelopment.stackexchange.com。是的,这是主要问题。Thanks很多。是的,这就是bug。我想有时候需要的只是一双新眼睛。谢谢。
void Player::getHit(int atk)
{
    m_Stats.hp -= m_Stats.def * atk;     
}