首页 > 解决方案 > 执行 BUTTON 操作时使用已初始化的对象

问题描述

我正在制作这个简单的回合制“真人快打”游戏。有 2 个组合框,您可以从中选择一些字符。当点击攻击按钮时,会产生一个半随机的攻击值,对手的生命值会随着该攻击值而减少。先达到 0 HP 的人失去。

我正在制作类 Character 的 2 个实例(从组合框检索)。单击攻击按钮时会生成 2 个实例。问题是每次用户点击 ATTACK 时,都会再次创建 2 个实例,因此 HP 会重置为默认值。角色由姓名、生命值、伤害组成。

private void button_Attack_Click(object sender, EventArgs e)
{
    Character P1 = (Character)comboBox_CharacterSelectionP1.SelectedItem;
    Character P2 = (Character)comboBox_CharacterSelectionP2.SelectedItem;
    double HP_1;
    double HP_2;
    double DMG_1 = P1.Attack();
    double DMG_2 = P2.Attack();
    if (P1.Counter % 2 == 0)
    {
        HP_1 = P1.HealthPoints;
        HP_2 = P2.HealthPoints;
        label_Player1_HP.Text = HP_1.ToString();
        label_AttackValueP1.Text = DMG_1.ToString();
        label_Message.Text = $"{P1.Name} throws a punch";

        HP_2 -= DMG_1;
        label_Player2_HP.Text = HP_2.ToString();

        P1.Counter++;
    }
    else { //... }
}

我必须在攻击按钮空间之外创建 2 个实例。我在哪里声明和初始化它们以便在攻击函数中使用它们?(=> 这样每次用户点击攻击按钮时,HP 都不会被重置)

2个实例是:

Character P1 = (Character)comboBox_CharacterSelectionP1.SelectedItem;
Character P2 = (Character)comboBox_CharacterSelectionP2.SelectedItem;

这是 Windows 窗体应用程序的图片

截屏

标签: c#winforms

解决方案


“你的问题不是由实例引起的,你没有在你的方法中创建它们。你只是没有将新的 HP 值存储在玩家实例中。HP_1 和 HP_2 变量是本地的。- dymanoid”

这条评论帮助了我,谢谢。

我的错误是我为 HP 做了一个局部变量,我想它没有更新。一旦我用类 Character 的属性 HealthPoints 替换了它们,它就可以正常工作。新代码如下所示:

private void button_Attack_Click(object sender, EventArgs e)
    {
        button_Play.Enabled = false;

        Character P1 = (Character)comboBox_CharacterSelectionP1.SelectedItem;
        Character P2 = (Character)comboBox_CharacterSelectionP2.SelectedItem;

        if (P1.Counter % 2 == 0)
        {
            double DMG_1 = P1.Attack();
            label_Player1_HP.Text = P1.HealthPoints.ToString("F3");
            label_AttackValueP1.Text = $"Damage inflicted: {DMG_1.ToString("F3")}";
            label_Message.Text = $"{P1.Name} throws a punch";

            P2.HealthPoints -= DMG_1;
            label_Player2_HP.Text = P2.HealthPoints.ToString("F3");

            P1.Counter++;
        }
        else...

推荐阅读