Экземпляры C # имеют одинаковые значения - PullRequest
0 голосов
/ 17 мая 2018

студент-программист, совершенно новый для меня вопрос, но я уверен, что вы, люди, узнаете. Я должен сделать игру, в которой несколько картинных боксов создаются с использованием массива. Я также должен создать класс, у которого переменная работоспособности равна 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 голосов
/ 17 мая 2018

Ваш Invader monster является переменной экземпляра Form1, и в вашем методе Spawner() внутри цикла for вы каждый раз назначаете его снова: this.monster = new Invader();

В основном, когда вы нажимаете на графическое окно (не отличается от того, что) в вашем Form1_Click методе, это происходит каждый раз, когда ваш последний монстр теряет здоровье, а не предполагаемый.

Чтобы это исправить, вы можете:

  • Преобразуйте монстра в массив объекта Invader вместо объекта Invader, количество элементов должно быть таким же, как и число ящиков с картинками
  • foreach picturebox назначить в качестве тега индекс соответствующего ответчика на массив монстров

Вот пример:

public partial class Form1 : Form
{
    // EDIT - Become an array
    Invader[] monster = new Invader[5]; // 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[i] = new Invader(); // EDIT
            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;
            this.pb[i].Tag = i; // EDIT - Added tag assignation
        }
    }

    private void Form1_Click(object sender, EventArgs e)
    {
        PictureBox currentpicturebox = (PictureBox)sender;
        this.monster[(int)currentpicturebox.Tag].HealthDown(); // EDIT
        if (this.monster[(int)currentpicturebox.Tag].Health == 0) //EDIT
        {
            currentpicturebox.Dispose();
        }
    }
...