0

我正在通过编写 LIFE 游戏来试验和学习 C#。目前我有一个pictureBox和一个drawGrid创建网格覆盖的函数。为了点击里面的每个单元格,pictureBox我已经实现了一个属性pictureBox1_MouseClick,其中有一个 if 决策逻辑来知道是否选择了一个单元格。我遇到的问题是当我快速单击方块时出现错误:System.IndexOutOfRangeException指向fill_in[x, y] = !fill_in[x, y];.

如何提高pictureBox1_MouseClick事件的点击准确性,以免出现该错误?

具体错误:

`life.exe 中发生了“System.IndexOutOfRangeException”类型的未处理异常

附加信息:索引超出了数组的范围。`

代码

namespace life
{
    public partial class Form1 : Form
    {

        Graphics paper;
        bool[,] fill_in = new bool[450, 450];
    int cellSize = 10;


 private void drawGrid()
        {
            int numOfCells = 100;        
            Pen p = new Pen(Color.Blue);
            paper.Clear(Color.White);

            for (int i = 0; i < numOfCells; i++)
            {   
                // Vertical Lines
                paper.DrawLine(p, i * cellSize, 0, i * cellSize, numOfCells * cellSize);
                // Horizontal Lines
                paper.DrawLine(p, 0, i * cellSize, numOfCells * cellSize, i * cellSize);
            }
        }


 private void pictureBox1_MouseClick(object sender, MouseEventArgs e)
        {
            int x = cellSize * (e.X / cellSize);
            int y = cellSize * (e.Y / cellSize);

            // Reverse the value of fill_in[i, j] - if it was false, change to true,
            // and if true change to false
            fill_in[x, y] = !fill_in[x, y];

            if (fill_in[x, y])
            {
                // Fill grid square with the filled color
                paper.FillRectangle(Brushes.Red, x, y, 10, 10);
            }
            else
            {
                // Fill grid square with unfilled color 
                paper.FillRectangle(Brushes.White, x, y, 10, 10);          
            }

        }

     }
}
4

1 回答 1

2

请确保您的计算返回所需的值:

int x = cellSize * (e.X / cellSize);
int y = cellSize * (e.Y / cellSize);

在这种情况下,x 和 y 可以超出数组的边界。示例:cellsize * (450 / cellsize) 等于 450,这会导致错误,因为允许的索引范围从 0 到 449。

编辑:

要解决此问题(这是一个非常肮脏且临时的修复),请按如下方式更改您的代码:

int x = cellSize * (e.X / cellSize);
int y = cellSize * (e.Y / cellSize);

x = x >= 450 ? 450 - 1 : x;
y = y >= 450 ? 450 - 1 : y;

更可取且实际上更智能的解决方案是简单地将表格的大小调整为与 eX 和 eY 的范围完全相同

希望这会有所帮助,Piotr

于 2012-10-05T13:52:03.967 回答