You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WinForms基于数组创建地图网格颜色显示异常求助

问题解决:WinForms地图网格颜色区分问题

核心问题分析

你的代码存在两个关键错误:

  • 错误的数组遍历逻辑:每个PictureBox都遍历了整个mapGrid数组,导致同一个控件的背景色被反复覆盖,最终所有控件都显示数组最后一个元素对应的颜色(橙色),还会重复将同一个控件添加到控件集合和列表中。
  • 位置计算颠倒:Point的第一个参数是水平坐标(对应列),第二个是垂直坐标(对应行),你把行索引i和列索引j搞反了,会导致网格排列错乱。

修正后的代码

namespace Test
{
    public partial class Form1 : Form
    {
        int TILE_SIZE = 64;
        int MAP_NUM_ROWS = 11;
        int MAP_NUM_COLS = 15;
        List<PictureBox> items = new List<PictureBox>(); // 补充泛型类型,原代码遗漏

        int[] mapGrid =
        {
            1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
            1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1,
            1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 1,
            1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1,
            1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1,
            1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 1,
            1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
            1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
            1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 1,
            1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
            1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
        };

        public Form1()
        {
            InitializeComponent();
            newTest();
        }

        private void newTest()
        {
            for (var i = 0; i < MAP_NUM_ROWS; i++) // i是行索引
            {
                for (var j = 0; j < MAP_NUM_COLS; j++) // j是列索引
                {
                    PictureBox tile = new PictureBox();
                    // 修正位置:X对应列j,Y对应行i
                    tile.Location = new Point(j * TILE_SIZE, i * TILE_SIZE);
                    tile.Height = TILE_SIZE;
                    tile.Width = TILE_SIZE;
                    tile.BorderStyle = BorderStyle.FixedSingle;

                    // 通过行和列计算数组索引,直接获取对应的值
                    int gridValue = mapGrid[i * MAP_NUM_COLS + j];
                    tile.BackColor = gridValue == 0 ? Color.Red : Color.Orange;

                    items.Add(tile);
                    this.Controls.Add(tile);
                }
            }
        }
    }
}

关键改动说明

  1. 移除错误的foreach循环:直接通过i * MAP_NUM_COLS + j计算当前网格在mapGrid中的索引,一次性获取对应的值设置颜色,避免重复覆盖。
  2. 修正控件位置计算:将Location的X坐标设为j * TILE_SIZE(列方向),Y坐标设为i * TILE_SIZE(行方向),保证网格按正确的行列排列。
  3. 补充泛型类型:原代码中List items未指定泛型,改为List<PictureBox> items,符合C#语法规范。
  4. 优化控件命名:将Walls改为tile,更符合语义,避免误解。

内容的提问来源于stack exchange,提问作者SuckatCSharp

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 04:55:23