1

我目前正在为基于文本的小型游戏编写玩家类。玩家具有继承自 Actor 类的属性,例如当前和最大生命值。在为默认新角色创建构造函数时,我遇到了一个错误,其中一个属性设置为 0,原因我无法解释。

以下是相关信息:

public class Player : Actor
{
    private int _curHunger;
    private int _maxHunger;

    public Player()
    {
        this.CurrentHealth = 100;
        this.MaxHealth = 100;
        this.CurrentHunger = 100;
        this.MaxHunger = 100;
    }

    public int CurrentHunger
    {
        get { return _curHunger; }
        set 
        {
            _curHunger = value;
            if (_curHunger > _maxHunger)
            {
                _curHunger = _maxHunger;
            }
            if (_curHunger <= 0)
            {
                _curHunger = 0;
                Random HealthLoss = new Random();
                this.CurrentHealth -= HealthLoss.Next(1,3);
            }
        }
    }
}

以下输出是最大饥饿值变为 100,而当前饥饿值变为 0。如果我删除 if (_curHunger > _maxHunger) 语句,当前饥饿值变为 100。如果我将 _curHunger 设置为 100 而不是在构造函数中设置它,则输出变为 100正如预期的那样。

Actor 类中玩家当前和最大生命值的设置基本相同,不存在此类问题。

public int CurrentHealth
{
    get { return _curHealth; }
    set
    {
        _curHealth = value;
        if (_curHealth > _maxHealth)
        {
            _curHealth = _maxHealth;
        }
        if (_curHealth <= 0)
        {
            MessageBox.Show("The actor died!");
        }
    }
}

我一生都无法弄清楚我做错了什么,我希望这是我因过度疲劳而错过的显而易见的事情。

提前感谢您的任何指导。如果重要,这是在 Windows 窗体上。

编辑:似乎在构造函数中切换 this.CurrentHunger 和 this.MaxHunger 已经解决了我的问题,但这并不能解释为什么它对于当前和最大的健康状况很好,同时又会因饥饿而混乱。

4

1 回答 1

3

由于CurrentHunger取决于MaxHunger,因此设置属性的顺序很重要。MaxHunger如果您在设置之前没有明确设置CurrentHunger,_maxHunger将为 0,这将改变CurrentHunger行为方式。

尝试MaxHunger先设置:

public Player()
{
    this.MaxHealth = 100;
    this.CurrentHealth = 100;
    this.MaxHunger = 100;
    this.CurrentHunger = 100;
}

至于为什么它似乎适用于CurrentHealth/ MaxHealth,我只能假设实际上存在一些您没有在此处显示的差异。也许_maxHealth被初始化为某个默认值。

于 2013-11-13T16:10:19.567 回答