0

非常にシンプルなターンベースのテキスト 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
あなたのHP: 100
敵HP:150
敵は防御を選択!
あなたのHP: 100
敵HP:150
1) アタック 2) ヒール セルフ: 2
あなたのHP: 100
敵HP:150

ええ、出力はきれいではありませんが、コードがしっかりした後、出力をクリアするのを延期しています。どんな助けでも大歓迎です。ありがとう。

4

3 に答える 3

2

これらの値が変更されると予想されるのはなぜですか? hpプログラム内でfieldの値を変更する唯一の場所はPlayer::healSelfメソッドです。プレイヤーの HP は 100 が上限で、最初からプレイヤーの HP が 100 であるため、コールしても 100 を超える値にはなりません。healSelfそのため、hp値は変わりません。

あなたの方法がプレイヤーと敵getHitの価値を変えることを期待しています。hpしかし、そうではありません。自分で見て

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

hpそのコードには言及されていません。どうやら、それはバグです。Player::getHit実装にも同じバグが存在するようです。

于 2012-08-19T08:44:35.273 に答える
0

見た目からすると、「攻撃」を選択すると e.getHit() が呼び出されます。これは、おそらく「敵」が「ヒット」したことを意味します。しかし、その機能はHPを変えるのではなく、ATKを変える…

于 2012-08-19T08:34:48.530 に答える
0

健康ではなく、攻撃を変更しています。

通常、プレイヤーの防御は、攻撃がどのようにスケーリングされるかを決定します。

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

あなたが100 hp0.8の防御力を持ち、誰かが20 ポイントであなたを攻撃すると仮定すると、次のようにすることができます:

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

あなたの防御は攻撃を妨げ、現在84hpを持っています。

于 2012-08-19T08:53:37.797 に答える