我是C ++的新手,我决定制作一个基于回合制的小型RPG引擎。这是我的问题。我的课程Mob
包含HP
,MP
,Stamina
,Strength
和Intelligence
等属性。他们都有吸气剂和制定者与他们同行。我也有方法attack()
,它将攻击中的两个怪物带走。同样已经创造了两个小怪,HP为100,Stamina为30,力量为30(EDIT Strength实际上是5.我的不好)。无论如何,这是攻击的代码:
srand(time(0));
int damage = mobSend.getStr() * 5 + (rand() % str);
cout << damage << endl;
mobRec.setHP((mobRec.getHP() - damage));
mobSend.setStamina(mobSend.getStamina() - 5);
当我运行该程序时,我有它所以它首先打印出HP和Stamina,运行攻击方法,然后再次打印HP和Stamina。然而,当我运行时,小怪的HP或Stamina不会下降。我测试了以确保setHP()
和setStamina()
工作,所以我在主方法中将hp和stamina设置为0并且它起作用。
我尝试了其他类似loseHP()
的内容,将损坏作为参数:
void Mob:: loseHP(int damage) {this->HP -= damage;}
但它仍然无效。我在这做错了什么?我真的很难过,所以一些帮助将不胜感激。
答案 0 :(得分:1)
问题是您在将对象传递给attack()
方法时按值复制对象,因此当您对mobRec
和mobSend
进行任何更改时,这些更改实际上并不是反映在原始的暴徒实例上。
要解决此问题,您需要通过方法的签名传递变量:
void attack (Mob &mobSend, Mob &mobRec){...}
这将确保在方法中进行的任何更改都将实际修改传递给该方法的真实怪物,而不是它们的临时本地副本。