我正在制作一个程序,在玩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
答案 0 :(得分:1)
我认为有两种解决方案:
lightSourceId
属性。这样,就可以找到刚刚关闭的光源点亮的所有块