变量的值在使用C++的简单文本 RPG 游戏中不会更改
The value of the variables aren't changing in a simple text RPG game using C++
我正在尝试创建一个非常简单的回合制文本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马力。
相关文章:
- 在C++游戏中与库存系统作斗争
- 换位表导致测试失败(但在游戏中运行良好)
- Craps游戏问题,忽略if语句
- 矢量下标超出SFML游戏中的范围
- 我是 c++ 的新手.学习基本知识后,我想做井字游戏.对于印刷板,我在下面写代码,但它显示错误
- 我在贪吃蛇游戏中收到了错误代码 -1073741571
- 我应该在简单的策略游戏中为各个派系使用类吗 - C++
- 游戏体验和升级
- 我的代码运行良好,但在游戏循环中中断
- 如何使用 SFML 在贪吃蛇游戏中定义游戏结束?
- 我可以使用任何好的逻辑来阻止计算机将 O 放在井字游戏中的现有 X 上
- 在为我的基于文本的 RPG 游戏制作库存时遇到困难
- RPG游戏库存系统
- C++ 确定类是否可以使用对象 - 文本 RPG 游戏
- 控制台RPG游戏 - 攻击和健康功能-C
- 变量的值在使用C++的简单文本 RPG 游戏中不会更改
- C++ x 中的 RPG 游戏可以低于 0
- 保护C++RPG游戏中存储的数据
- 在矢量中存储结构信息(文本 RPG 游戏)
- C++有人能看看我完整的基于文本的新手rpg游戏代码吗