Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# pictureBox1\u鼠标点击事件:阵列/方块(生命游戏)_C# - Fatal编程技术网

C# pictureBox1\u鼠标点击事件:阵列/方块(生命游戏)

C# pictureBox1\u鼠标点击事件:阵列/方块(生命游戏),c#,C#,我正在试验和学习C#,编写生活游戏。目前我有一个pictureBox和一个创建网格覆盖的函数drawGrid。为了点击pictureBox中的每个单元格,我实现了属性pictureBox1\u MouseClick,其中有一个if决策逻辑来判断是否选择了单元格。我遇到的问题是,当我快速单击方框时,我得到一个错误:System.IndexOutOfRangeException,它指向fill_in[x,y]=!在[x,y]中填写_ 如何提高pictureBox1\u鼠标单击事件的点击精度,以避免出

我正在试验和学习C#,编写生活游戏。目前我有一个
pictureBox
和一个创建网格覆盖的函数
drawGrid
。为了点击
pictureBox
中的每个单元格,我实现了属性
pictureBox1\u MouseClick
,其中有一个if决策逻辑来判断是否选择了单元格。我遇到的问题是,当我快速单击方框时,我得到一个错误:
System.IndexOutOfRangeException
,它指向
fill_in[x,y]=!在[x,y]中填写_

如何提高
pictureBox1\u鼠标单击事件的点击精度,以避免出现该错误

具体错误:

`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);          
            }

        }

     }
}
名称空间寿命
{
公共部分类Form1:Form
{
图形纸;
bool[,]fill_in=新bool[450450];
int cellSize=10;
私有void drawGrid()
{
int numOfCells=100;
钢笔p=新钢笔(颜色为蓝色);
纸。透明(颜色。白色);
对于(int i=0;i
请确保您的计算返回所需的值:

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;
更理想的、实际上更聪明的解决方案是简单地调整桌子的大小,使其与e.X和e.Y的范围完全相同

希望这有帮助,
Piotr

触发异常时x和y的值是多少?我感觉这不是因为点击速度,而是因为计算。示例:cellsize*(450/cellsize)等于450,这超出了数组的边界。@PiotrJustyna发生此错误时,我设置了一个断点,结果如下:
x=450
y=270
,变量e=
x=457 y=273
,这是您的答案:)450超出了数组。请让我知道它是否回答了您的问题,我会将我的评论升级为回答。@PiotrJustyna是的,您是对的!请将您的评论升级为答案,我将确保接受。+1谢谢,现在我明白了问题所在。我怎样才能解决这个数组问题?没关系,我已经解决了。我把450的值改成了一个更高的整数。好吧,我试过你编辑的代码,但现在它不允许我选择网格中的正方形。但我确实喜欢你的另一个建议。我该如何调整桌子的大小,使之与e.X和e.Y的范围完全相同?对不起,我假设你的手机大小是450,而实际上是10。请现在试一试。