我正在制作一个在玩 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