我有一款城市模拟游戏,想要找到一种方法来检查我们的电力系统流量。
基本原理:
城市地图是基于瓷砖构建的(30 x 30个瓷砖 = 900个瓷砖)。
现在我从一个发电厂开始,进行递归邻居检查(上方,左侧,右侧,下方),以检查是否存在可传输电力的东西。如果有,我会继续检查这些瓷砖的邻居。
为了防止重复检查和/或无限递归调用,我使用ArrayList填充已处理的瓷砖,并检查新的瓷砖是否已被处理并添加到ArrayList中...
递归启动:
如果我可以相信日志输出,那么没有任何瓦片被尝试处理两次。这意味着,在递归调用中没有错误。这也意味着,堆栈太小了。
有人有什么想法来避免堆栈限制吗?
[更新和我的代码作为Erics答案的结果]
public void updatePowerEnvironment(int id, ArrayList<Integer> elements) {
Log.w("GT", "update env for id: " + id);
int newId = id - GameMap.mMapSize;
if (newId >= 0 && GameMap.mMapCells.get(newId).mPowerEnabled
&& !elements.contains(newId)) {
elements.add(newId);
updatePowerEnvironment(newId, elements);
}
newId = id + GameMap.mMapSize;
if (newId < GameMap.mMapCells.size() && GameMap.mMapCells.get(newId).mPowerEnabled
&& !elements.contains(newId)) {
elements.add(newId);
updatePowerEnvironment(newId, elements);
}
newId = id - 1;
if (newId >= 0 && GameMap.mMapCells.get(newId).mPowerEnabled
&& !elements.contains(newId)) {
elements.add(newId);
updatePowerEnvironment(newId, elements);
}
newId = id + 1;
if (newId < GameMap.mMapCells.size()
&& GameMap.mMapCells.get(newId).mPowerEnabled
&& !elements.contains(newId)) {
elements.add(newId);
updatePowerEnvironment(newId, elements);
}
}
如果我可以相信日志输出,那么没有任何瓦片被尝试处理两次。这意味着,在递归调用中没有错误。这也意味着,堆栈太小了。
有人有什么想法来避免堆栈限制吗?
[更新和我的代码作为Erics答案的结果]
public void updatePowerEnvironment(int id, ArrayList<Integer> elements) {
Stack<Integer> toProcess = new Stack<Integer>();
toProcess.push(id);
int mapSize = GameMap.mMapCells.size();
while (!toProcess.empty()) {
id = toProcess.pop();
Log.e("GT", "id to process: " + id);
if (elements.contains(id)) {
continue;
}
int[] neighborIds = computeNeighbors(id);
for (int neighbor : neighborIds) {
if (neighbor < 0 || neighbor >= mapSize) {
continue;
}
if (!GameMap.mMapCells.get(neighbor).mPowerEnabled) {
continue;
}
toProcess.push(neighbor);
}
elements.add(id);
}
}
private int[] computeNeighbors(int id) {
return new int[] {id + GameMap.mMapSize, id - GameMap.mMapSize, id + 1, id - 1};
}