Необработанное исключение. Индекс был вне диапазона. Должен быть неотрицательным и меньшим, чем размер коллекции. Имя параметра: индекс

1

У меня проблема выше, когда я пытаюсь снять пейнтбол в своей программе. Ниже приведен код класса (Paintballs).

class Paintballs
{
    public List<Point> myClick;

    public Paintballs()
    {            
        myClick = new List<Point>();
    }

    public void add(Point location)
    {
        myClick.Add(location);                    
    }

    public void paint(Graphics g)
    {
        foreach (Point p in myClick)
        {
            g.FillEllipse(Brushes.Blue, p.X, p.Y, 20, 20);
        }            
    }

    public Point getPoints(int hit)
    {
        return myClick[hit];
    }     
}

Когда я отлаживаю программу, ошибка находится в строке метода getPoints "return myClick [hit]. Ниже моя форма1.

namespace AmazingPaintball
{
    public partial class Form1 : Form
    {
        Random positionX = new Random();
        Random positionY = new Random();
        Target einstein;
        int count = 0;
        Paintballs pBalls = new Paintballs();
        Stopwatch stopwatch = new Stopwatch();

        //Foreach loop
        //Draw paintballs first
        //then target

        SoundPlayer wavPlayer = new SoundPlayer();
        public Form1()
        {
            InitializeComponent();
            Point point = new Point(positionX.Next(0, 638), positionY.Next(0, 404));
            einstein = new Target(point);
            ptrEinstein.Location = point;
        }

        private void pictureBox1_Paint(object sender, PaintEventArgs e)
        {
            pBalls.paint(e.Graphics);
        }

        private void Form1_KeyDown(object sender, KeyEventArgs e)
        {
            ptrEinstein.Location = einstein.Move(e.KeyData);
            pictureBox1.Update();
            pictureBox1.Refresh();       
        }

        private void pictureBox1_MouseClick(object sender, MouseEventArgs e)
        {            
            pBalls.add(e.Location);
            pictureBox1.Refresh();
            count++;

            Point shotHit = pBalls.getPoints(count);

            if (ptrEinstein.Location == shotHit)
            {
                stopwatch.Stop();
                MessageBox.Show("It took " + count + " shots and " + stopwatch.Elapsed + " seconds to hit the target");
            }            
        }       

        private void Form1_Load(object sender, EventArgs e)
        {
            stopwatch.Start();
        }          
    }
}

В form1 проблема находится в событии picturebox1_MouseClick. Переменная count я не был уверен, что я должен держать ее в 0 или 1. Пожалуйста, дайте мне знать. Спасибо

  • 2
    Попробуйте увеличить счетчик после получения shotHit. Кажется, вы пытаетесь всегда получить индекс на единицу больше, чем размер массива. В этом случае вы можете использовать метод Last () для List в этом конкретном примере.
Теги:

3 ответа

1

Проблема в том, что вы увеличиваете счет до того, как вы вызываете pBalls.getPoints(count). Позвольте пройти через то, что делает ваша программа, когда вы впервые с ней взаимодействуете:

  1. Событие picturebox1_MouseClick запускается.
  2. Список pBalls добавляет элемент и теперь имеет ровно один элемент (с индексом 0) с точкой расположения мыши.
  3. счет увеличивается от 0 до 1.
  4. Ваша программа запускает pBalls.getPoints(count); но число равно 1. Список pBalls имеет только один элемент, и он находится в индексе 0. myClick [1] вызывается, но вы ищете myClick [0], только что добавленную точку.

Вы можете либо увеличить счет после вызова pBalls.getPoints(count), либо передать истинное значение индекса с помощью pBalls.getPoints(count-1);

0

Проблема возникает в следующем условии. давайте предположим, что у нас есть список.

//создаем список типов строк

List<string> lstString = new List<string>();

//добавьте 3 значения в список

for(int i = 0 ; i<3 i++)
{
 lstString.Add("number" + i);
}

Теперь длина строки равна 3.

когда вы пишете

lstString[0] it gives you number0
lstString[1] // //    //  number1
lstString[2] // //    //  number2

но если вы пишете

lstString[3]

он генерирует исключение, потому что вы передаете индекс, который не встречается в списке. или, другими словами, индексный индекс больше индексов в lstString.

Это именно то, что вы здесь делаете

private void pictureBox1_MouseClick(object sender, MouseEventArgs e)
        {            
            pBalls.add(e.Location); // you add element at index 0
            pictureBox1.Refresh();
            count++; // count++ mean count = 1;

            // now you passing 1 but the list only has zero index right. 
            Point shotHit = pBalls.getPoints(count); 

            if (ptrEinstein.Location == shotHit)
            {
                stopwatch.Stop();
                MessageBox.Show("It took " + count + " shots and " + stopwatch.Elapsed + " seconds to hit the target");
            }            
        }       

Решение :

 private void pictureBox1_MouseClick(object sender, MouseEventArgs e)
            {            
                pBalls.add(e.Location); // you add element at index 0
                pictureBox1.Refresh();           

                Point shotHit = pBalls.getPoints(count); 

                if (ptrEinstein.Location == shotHit)
                {
                    stopwatch.Stop();
                    MessageBox.Show("It took " + count + " shots and " + stopwatch.Elapsed + " seconds to hit the target");
                 }   

               count++; // increment at the end of the method.        
            }       
0

count++; Point shotHit = pBalls.getPoints(count);

это неправильно, вы должны передать счет -1 вместо этого в pBalls.getPoints(count -1);

или приращение после того, как вы получите выстрелHit

  • 0
    Сработало спасибо
  • 0
    спасибо за обновление результата. если это сработало, пожалуйста, отметьте это как ответ

Ещё вопросы

Сообщество Overcoder
Наверх
Меню