0

我创建了一个结构列表,每个结构都有一些属性。我的意图是使用一个基本的 10x10 地图来练习/学习为我正在为其开发工具的游戏编写 A* 搜索算法。我的地图结构基本上是一个 Tile 对象数组,每个对象都具有以下属性:

    public struct Tile
    {
        public int x { get; set; }
        public int y { get; set; }
        public int cost { get; set; }
        public bool walkable { get; set; }
    }

我也有一个节点结构,虽然它与这个问题无关,真的,我会发布它,以防有人对我大喊大叫:

    public struct Node
    {
        public int x { get; set; }
        public int y { get; set; }
        public int total { get; set; }
        public int cost { get; set; }
        public Tile parent { get; set; }
    }

我的表单加载事件看起来像这样:

    private void Form1_Load(object sender, EventArgs e)
    {
        CheckBox[] chbs = new CheckBox[100];
        for (int x = 0; x < 10; x++)
        {
            for (int y = 0; y < 10; y++)
            {
                Map = new Structs.Tile[100];
                Map[x + y].x = x;
                Map[x + y].y = y;
                Map[x + y].cost = 100;
                Map[x + y].walkable = true;
                //MessageBox.Show(Convert.ToString(Map[x + y].x) + " : " + Convert.ToString(Map[x + y].y));
                if ( x == 5 )
                {
                    if (y == 4 | y == 5 | y == 6)
                    {
                        Map[x + y].walkable = false;
                    }
                }
            }
        }
        int i = 0;
        foreach (Structs.Tile tile in Map)
        {
            CheckBox chb = new CheckBox();
            chb.Location = new Point(tile.x * 20, tile.y * 20);
            chb.Text = "";
            chbs[i] = chb;
            i++;
        }
        this.Controls.AddRange(chbs);
    }

我事先声明了这一点,通过这个类在全球范围内使用:

Structs.Tile[] Map;

问题是,为什么这只添加了 2 个复选框?对于位于 X: 0, Y: 0, X: 1, Y: 1 的位置,似乎将它们添加到大约正确的位置,但没有添加其他位置?我已经将表格扩大到荒谬的尺寸,但仍然没有。我完全被它弄糊涂了。

结果如下,乘数分别设置为 2:

显示问题的测试程序屏幕截图

我相信我已经正确设置了它,但我无法弄清楚它为什么不起作用。我可以理解表格是否冻结,但事实并非如此,并且将值设置为愚蠢的高值(100+)并没有任何区别。WinForms 中的偏移量表明乘数需要大约为 12...

像往常一样,任何建议都非常受欢迎。我也会尽快在这里回答一些问题,因为我从你们这些了不起的人那里学到了很多东西!

谢谢!

修改后的表单加载:

    private void Form1_Load(object sender, EventArgs e)
    {
        int ind = 0;
        CheckBox[] chbs = new CheckBox[100];
        Map = new Structs.Tile[100];
        for (int x = 1; x < 11; x++)
        {
            for (int y = 1; y < 11; y++)
            {
                Map[ind].x = x;
                Map[ind].y = y;
                Map[ind].cost = 100;
                Map[ind].walkable = true;
                //MessageBox.Show(Convert.ToString(Map[x + y].x) + " : " + Convert.ToString(Map[x + y].y));
                if ( x == 5 )
                {
                    if (y == 4 | y == 5 | y == 6)
                    {
                        Map[ind].walkable = false;
                    }
                }
                ind++;
            }
        }
        int i = 0;
        foreach (Structs.Tile tile in Map)
        {
            CheckBox chb = new CheckBox();
            chb.Location = new Point(tile.x * 12, tile.y * 12);
            chb.Text = "";
            chbs[i] = chb;
            i++;
        }
        this.Controls.AddRange(chbs);
    }
4

1 回答 1

0

答案是我每次进入血腥循环时都在重置数组。呸,这下太晚了!

感谢所有看过/考虑过的人!

于 2013-02-14T22:10:43.153 回答