正确逐渐减少网格中的值

时间:2012-08-27 13:00:04

标签: java grid minecraft

我正在制作一个程序,在玩Minecraft时使用,它是一个模拟地板的网格,我想做的是能够点出障碍物和灯光,并计算出什么“块”可以获得足够的光量。这是一个计划工具,所以你可以对地板进行概览,并用充足的闪电制作漂亮的东西。

我可以指出障碍物和光线,创造正确的传播,但我的问题在于我想用这个程序解决的问题的性质,我搞砸了很多,所以必须重做一切所以我希望能够除去灯光,当然还有灯光发出的光线。

点亮灯光时的光计算代码。

public void changeLightUp(int light)
    {           
        //no light left, return
        if(light == 0)
            return;

        //not a source or block, change light
        if(type == 0)
        {
            //light is greater, return
            if(lightLevel >= light)             
                return;
            lightLevel = light;
        }
        //solid block, ignore
        else if(type == 1)
            return;

        if(xCoord != main.gridSizeX - 1)
            main.grid[xCoord + 1][yCoord].changeLightUp(light-1);
        if(xCoord > 0)
            main.grid[xCoord - 1][yCoord].changeLightUp(light-1);
        if(yCoord != main.gridSizeY - 1)            
            main.grid[xCoord][yCoord + 1].changeLightUp(light-1);
        if(yCoord > 0)              
            main.grid[xCoord][yCoord - 1].changeLightUp(light-1);
    }

所以它的作用是:我检查是否有任何光线(方法是递归的,所以我将灯发送到下一个块,减去1),然后我检查它是否是“地板”块,只要新的亮点更大 - 更新。如果它不是障碍物,我将灯(减1)发送到相邻的四个块,直到完成所有操作。

我想不出一个好的方法来“倒退”,这不是第一个问题,所以我确定答案就在那里!不知道该搜索什么。对不起,如果答案遍布网络:)

编辑: 我似乎对实际问题不够清楚。 网格由“块”组成,每个块都带有自己的光级。当一个源被添加到网格中时,它会向它的邻居“发出”光,这是通过一个递归方法完成的,可以在代码片段中看到。 问题是,当我删除一个块时,我不知道如何以正确的方式移除光线,很容易简单地计算被源“击中”但不接受的块。如果我只是将所有内容都设置为0,那么附近可能存在其他来源以便光级别是错误的。 希望能够解决问题,并再次感谢所有能回答我问题的优秀人才< 3

1 个答案:

答案 0 :(得分:1)

我认为有两种解决方案:

  • 您可以在块类中添加lightSourceId属性。这样,就可以找到刚刚关闭的光源点亮的所有块
  • 每次更改(添加/删除/移动)任何光源时,您都可以重新计算所有网格。