У меня проблема выше, когда я пытаюсь снять пейнтбол в своей программе. Ниже приведен код класса (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. Пожалуйста, дайте мне знать. Спасибо
Проблема в том, что вы увеличиваете счет до того, как вы вызываете pBalls.getPoints(count). Позвольте пройти через то, что делает ваша программа, когда вы впервые с ней взаимодействуете:
Вы можете либо увеличить счет после вызова pBalls.getPoints(count), либо передать истинное значение индекса с помощью pBalls.getPoints(count-1);
Проблема возникает в следующем условии. давайте предположим, что у нас есть список.
//создаем список типов строк
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.
}
count++; Point shotHit = pBalls.getPoints(count);
это неправильно, вы должны передать счет -1 вместо этого в pBalls.getPoints(count -1);
или приращение после того, как вы получите выстрелHit