0

私は人生ゲームをコーディングしてC#を実験し、学んでいます。現在、グリッドオーバーレイを作成するpictureBox関数とがあります。drawGrid内部の各セルをクリックするために、セルが選択されているかどうかを知るためのif決定ロジックがあるpictureBoxプロパティを実装しました。pictureBox1_MouseClick私が直面している問題は、正方形をすばやくクリックするとエラーが発生します。System.IndexOutOfRangeExceptionこれはを指しfill_in[x, y] = !fill_in[x, y];ます。

pictureBox1_MouseClickイベントのクリック精度を上げて、エラーが発生しないようにするにはどうすればよいですか?

特定のエラー:

`タイプ'System.IndexOutOfRangeException'の未処理の例外がlife.exeで発生しました

追加情報:インデックスが配列の範囲外でした。`

コード

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 の範囲とまったく同じになるように調整することです

これが役に立てば幸いです、ピョートル

于 2012-10-05T13:52:03.967 に答える