Player类属性设置为0,无可解释的原因

时间:2013-11-13 16:07:32

标签: c# winforms class constructor

我正在为一个基于小文本的游戏编写一个玩家类。播放器具有从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&gt; _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已经解决了我的问题,但是这并不能解释为什么它在当前和最大的健康状况下工作得很好,同时搞砸了饥饿。

1 个答案:

答案 0 :(得分: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被初始化为某个默认值。