Удаление шаров через ArrayList при столкновении со специальным объектом - C#

Узнай цену своей работы

Формулировка задачи:

В окне перемещаются объекты, отталкиваясь от стенок окна. В окне также перемещается специальный объект. Каждый объект имеет свой поток, перемещающий его. Объекты, координата х которых близка к координате х специального объекта, исчезают. Объекты появляются случайно в окне при нажатии на кнопку. Связь между объектами осуществляется с помощью событий или уведомлений. Проблема в том что при пересечении со спец объектом удаляются все шары из ArrayList al_w. Представляю что нужно все свести к тому чтобы Handler удалял только один шар, а не зацикливался на условии if (Math.Abs(x - X) < 25 && Math.Abs(y - Y) < 25) пока не удалит все. Поправьте меня если я чего не понимаю
using System;
using System.Threading;
using System.Drawing;
using System.Windows.Forms;
using System.Collections;
 
namespace csMRR
{
    delegate void Del(int x, int y);
 
    class Ball
    {
        int x, y;
        int dx, dy;
        bool life;
        Thread t;
        Window w;
        Color col;
        public ArrayList al_w = new ArrayList();
        public int X { get { return x; } }
        public int Y { get { return y; } }
        public Color Col { get { return col; } }
        
        public Ball(int X, int Y, Window W, int Dx, int Dy, ref ArrayList al)
        {
            al_w = al;
            col = Color.Blue;
            x = X; y = Y; w = W;
            dx = Dx; dy = Dy;
            life = true;
            t = new Thread(new ThreadStart(Run));
            t.Start();
        }
 
        private void Run()
        {
            while (life)
            {
                x += dx;
                y += dy;
                if (x - 10 < 0 || x > w.Width - 50) dx = -dx;
                if (y - 5 < 0 || y > w.Height - 65) dy = -dy;
                Thread.Sleep(100);
                w.Invalidate();
            }
        }
 
        public void Handler(int X, int Y)
        {
            if (Math.Abs(x - X) < 25 && Math.Abs(y - Y) < 25)
            {
                int i = al_w.Count;
                if(al_w.Count!=0)
                    i--;
                while (i < al_w.Count)
                {
                    //Ball ball1 = (Ball)al_w[i];
                    al_w.Remove((Ball)al_w[i]);
                }
                w.Invalidate();
            }
        }
 
        public void Close() { life = false; }
    }
    //--------------------------------------------------------------   
    class Box
    {
        int dx, dy;
        int x1, y1;
        bool life;
        Thread t;
        Window w;
        public event Del ev;//
        public int X { get { return x1; } }
        public int Y { get { return y1; } }
 
        public Box(int X1, int Y1, Window W, int Dx, int Dy)
        {
            x1 = X1; y1 = Y1; w = W;
            dx = Dx; dy = Dy;
            life = true;
            t = new Thread(new ThreadStart(Mov));
            t.Start();
        }
        private void Mov()
        {
            while (life)
            {
                x1 += dx;
                y1 += dy;
                if (x1 - 10 < 0 || x1 > w.Width - 50) dx = -dx;
                if (y1 - 10 < 0 || y1 > w.Height - 70) dy = -dy;
                Thread.Sleep(150);
                if (ev != null) ev(x1,y1);
                w.Invalidate();
            }
        }
 
        public void Close() { life = false; }
    }
    //---------------------------------------------------------------  
    class Window : Form
    {
        Ball ball1;
        Box box;
        Button but;
        Button delete;
        Random rand;
        public ArrayList a;
        public Window()
        {
            box = new Box(160, 90, this, 10, 10);
            rand = new Random();
            this.Text = "Our first window";
            but = new Button();
            but.Location = new Point(0, 0);
            but.Size = new Size(70, 20);
            but.Text = "Добавить";
            but.Click += new EventHandler(ClickBut);
            this.Controls.Add(but);
 
            delete = new Button();
            delete.Location = new Point(0, 20);
            delete.Size = new Size(70, 20);
            delete.Text = "Удалить";
            delete.Click += new EventHandler(ClickDelete);
            this.Controls.Add(delete);
            a = new ArrayList();
        }
 
        private void ClickBut(object obj, EventArgs e)
        {
            Ball ball1 = new Ball(rand.Next(220), rand.Next(220), this, 10, 5, ref a);
            a.Add(ball1);
            for (int i = 0; i < a.Count; i++)
            {
                box.ev += new Del(((Ball)a[i]).Handler);
            }            
            Invalidate();
        }
 
        private void ClickDelete(object obj, EventArgs e)
        {
            int i = a.Count;
            if (i > 0)
                i--;
            while (i < a.Count)
            {
                Ball ball1 = (Ball)a[i];
                a.Remove(ball1);
            }
            Invalidate();
        }
        protected override void OnPaint(PaintEventArgs e)
        {
            base.OnPaint(e);
            int i;
            e.Graphics.DrawRectangle(new Pen(Color.Green, 5), box.X, box.Y, 20, 20);
            for (i = 0; i < a.Count; i++)
                e.Graphics.DrawEllipse(new Pen(((Ball)a[i]).Col, 4),
                      ((Ball)a[i]).X, ((Ball)a[i]).Y, 20, 20);
        }
        protected override void OnClosed(EventArgs e)
        {
            base.OnClosed(e);
            ball1.Close();
            box.Close();
        }
 
        static void Main()
        {
            Application.Run(new Window());
        }
    }
}

Решение задачи: «Удаление шаров через ArrayList при столкновении со специальным объектом»

textual
Листинг программы
public Ball(int N, int X, int Y, Window W, int Dx, int Dy, ref ArrayList al)
........
         public void Handler(int X)
        {
            if (Math.Abs(x - X) < 25)
            {
                int i = 0;
                while (i < a.Count)
                {
                    Ball ball1 = (Ball)a[i];
                    if (ball1.n == this.n)
                    {
                        ball1.Close();
                        a.Remove(ball1);
                    }
                    else i++;
                   
                }
                w.Invalidate();
            }
        }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

5   голосов , оценка 4.6 из 5
Похожие ответы