C++ 整数值在函数调用之间不断重置

C++ 整数值在函数调用之间不断重置,c++,C++,我正试图为一个基于文本的游戏编写一个非常简单的程序,在这个游戏中,一个玩家单位和一个敌人单位互相造成伤害,直到一个单位的生命值达到0。然而,不知何故,玩家和敌人在每次调用我的攻击功能之间都重置为完全健康状态。这对我来说毫无意义,因为单位健康状况会正确更新,以便在攻击功能中打印。这是我的密码。我在代码中多次调用攻击函数来演示 #include <iostream> using namespace std; class player; // this is to avoid a

我正试图为一个基于文本的游戏编写一个非常简单的程序,在这个游戏中,一个玩家单位和一个敌人单位互相造成伤害,直到一个单位的生命值达到0。然而,不知何故,玩家和敌人在每次调用我的攻击功能之间都重置为完全健康状态。这对我来说毫无意义,因为单位健康状况会正确更新,以便在攻击功能中打印。这是我的密码。我在代码中多次调用攻击函数来演示

#include <iostream>

using namespace std;
 


class player; // this is to avoid a syntax error in the enemy attack function

class enemy
{
public:
    int health;
    int strength;
    int defense;
    enemy(int h, int s, int d);
    void attack(player u);
};

class player
{
public:
    int health;
    int strength;
    int defense;


    player(int h, int s, int d);
    void attack(enemy u);
};



player::player(int h, int s, int d)
{
    health = h;
    strength = s;
    defense = d;
    srand(time(NULL));
    cout << "You arrive to the battlefield..." << endl;
}

void player:: attack(enemy u)
{
    int damage = 0;
    damage = strength - u.defense + (rand() % 3);
    u.health -= damage;
    cout << "You strike the enemy and deal " << damage << " damage. The enemy now has " << u.health << " health.\n" << endl;
    
}

enemy::enemy(int h, int s, int d)
{
    health = h;
    strength = s;
    defense = d;
    cout << "An enemy has appeared!" << endl;

}
void enemy::attack(player u)
{
    int damage = 0;
    damage = strength - u.defense + (rand() % 6);
    u.health  -= damage;
    cout << "The enemy strikes you and deals " << damage << " damage. You now have " << u.health << " health.\n" << endl;
    
}

void battle()
{
    player p(50,35,20);// Both healths are set at 50
    enemy e(50,34,19);

    p.attack(e); // Target health resets after each attack function runs. Unsure why.
    //cout << e.health << endl;
    e.attack(p);    

    p.attack(e); 
    e.attack(p);

    p.attack(e); 
    e.attack(p);
    
}

int main()
{
    battle();
     
    return 0;

}
#包括
使用名称空间std;
职业球员;//这是为了避免敌人攻击函数中的语法错误
阶级敌人
{
公众:
国际卫生组织;
内在力量;
智力防御;
敌人(内线h、内线s、内线d);
无效攻击(玩家u);
};
职业选手
{
公众:
国际卫生组织;
内在力量;
智力防御;
玩家(inth,ints,intd);
空袭(敌方u);
};
player::player(inth,ints,intd)
{
健康=小时;
强度=s;
防御=d;
srand(时间(空));

CUT

这是很简单的。你的代码是复制你的对象,你正在改变<强>复制的>对象,而不是在<代码>战斗<代码>中的原始对象。这就是为什么当你回到<代码>战斗< />代码时,它似乎会重置。你正在做一个普通但不正确的假设C++对象是引用,但是它们不是,它们是值,它们确实会被复制

改变这个

void enemy::attack(player u)
对此

void enemy::attack(player& u)

额外的
&
使
u
成为参考,而不是副本,因此您所做的更改将影响原始对象,而不是复制的对象。其他地方需要进行类似的更改。

这很简单。您的代码正在复制对象,您正在更改复制的对象的生命点,而不是原始对象这是为什么当你回到战斗>代码>时,它似乎会重置。你正在做一个普通但不正确的假设:C++对象是引用,但它们不是,它们是值,它们被复制。

改变这个

void enemy::attack(player u)
对此

void enemy::attack(player& u)

额外的
&
使
u
成为参考,而不是副本,因此您所做的更改将影响原始对象,而不是复制的对象。其他地方也需要类似的更改。

根据您只有一个玩家对象副本而不是多个玩家对象副本,您只需使
无效敌人::攻击()
没有参数

如果只有一个玩家,那么您只需执行
e.attack()
,而不传入值并引用玩家对象


Player很容易成为一个单例类(因为它只有一个副本)。如果有多个Player副本或多个Player副本,那么这将无法明确工作。

取决于Player对象的一个副本与多个副本,您只需在没有参数的情况下创建
void敌军::attack()

如果只有一个玩家,那么您只需执行
e.attack()
,而不传入值并引用玩家对象


玩家很容易成为一个单件职业(因为它只有一个副本)。如果有多个副本的玩家或多个玩家,那么这就不起作用了。

void Player::attack(敌方u)
你可以通过值传递
敌方
。这意味着它是一个副本,你可以更改副本,然后在攻击时将副本扔掉()结束。调用函数根本看不到更改。您需要通过引用传递,而不是使用与调用方相同的对象,而不是副本。请查找短语“通过值传递”和“通过引用传递”如果你从java或python之类的东西来C++,它会在这里使用它自己的特殊方式。简短的版本:你的代码>攻击< /代码>函数正在创建代码< >玩家< /C> >和<代码>敌人< /C>对象,你传递给他们,而不是在原件上。边注:不要调用<代码> SRand(…)
多次。
无效玩家::攻击(敌人u)
你通过
敌人
的值。意思是它是一个副本,你改变副本,然后在攻击时扔掉副本()结束。调用函数根本看不到更改。您需要通过引用传递,而不是使用与调用方相同的对象,而不是副本。请查找短语“通过值传递”和“通过引用传递”如果你从java或python之类的东西来C++,它会在这里使用它自己的特殊方式。简短的版本:你的代码>攻击< /代码>函数正在创建代码< >玩家< /C> >和<代码>敌人< /C>对象,你传递给他们,而不是在原件上。边注:不要调用<代码> SRAND(…);< /C> >多次。