C#实例共享相同的值

时间:2018-05-16 21:47:12

标签: class instances

在这里编程学生,对我要问的内容很新,但我相信你会有人知道。我必须制作一个使用数组创建几个图片框的游戏。我还必须创建一个健康变量为5的类。当你点击其中一个图片框时,它的健康状况必须下降1.我就此而言,但问题是健康变量是共享的所有的图片盒,实际上我希望每个图片盒都有自己的健康。

这是我的代码:

public partial class Form1 : Form
{

    Invader monster; // Invader is the name of the class
    Random rand = new Random();
    PictureBox[] pb = new PictureBox[5];

    private void Spawner()
    {
        for (int i = 0; i < 5; i++)
        {
            this.monster = new Invader();
            this.pb[i] = new PictureBox();
            this.pb[i].Name = "pb" + i.ToString();
            this.pb[i].Location = new Point(rand.Next(10, 300), monster.LocY);
            this.pb[i].BackgroundImageLayout = ImageLayout.Stretch;
            this.pb[i].BackgroundImage = Image.FromFile(@"Path");
            this.pb[i].BackColor = Color.Transparent;
            this.pb[i].Size = new System.Drawing.Size(40, 30);
            this.Controls.Add(this.pb[i]);
            this.pb[i].Click += this.Form1_Click;
        }
    }

    private void Form1_Click(object sender, EventArgs e)
    {
        PictureBox currentpicturebox = (PictureBox)sender;

        this.monster.HealthDown();
        if (this.monster.Health == 0)
        {
            currentpicturebox.Dispose();
        }

    }

和我的班级:

class Invader
{
    // Fields
    private int health;

    // Properties
    public int Health
    {
        get { return this.health; }
    }

    // Constructor
    public Invader()
    {
        this.health = 5;
    }
    // Methods
    public void HealthDown()
    {
            this.health -= 1;
    }

让我说我点击1张图片框4次,然后点击另一张1次。使用此代码,最后点击的图片框将被处理掉。关于如何解决这个问题的任何想法?

1 个答案:

答案 0 :(得分:0)

您的Invader monster是Form1的实例变量,在for循环内的方法Spawner()中,您每次都会重新分配它:{​​{1}}

基本上当你点击一个图片框(并不是什么)时,this.monster = new Invader();方法会发生每次你的最后一个怪物,它会让它的健康状况下降,而不是假想的。

为了解决这个问题,你可以:

  • 在Invader对象的数组中变换怪物而不是Invader对象,元素的数量必须与图片框的数量相同
  • foreach picturebox将标记为怪物阵列上的相应入侵者的索引

这是一个例子:

Form1_Click