我正在创建一个小游戏,你需要在地图上移动部队。为了检测是否可以进行移动,我必须验证两个方格之间是否有路。 所以,递归地我从一个正方形开始并采取四个方格(上方,下方,左侧和右侧)和以下条件我递归地重复测试,因为我只得到死角或目标方块。所有的方块都必须在玩家的控制之下。
我的类Case中有我的递归代码实现:
public boolean isContiguJoueur(Case case_origine, Case case_destination, Case[] cases) {
boolean haut_true=false, droite_true=false, bas_true=false, gauche_true=false;
// Above
if(this.haut!=null) {
if(haut.joueur==this.joueur && this.haut!=case_origine) {
if(this.haut==case_destination) {
return true;
}
haut_true=haut.isContiguJoueur(this,case_destination, cases);
}
}
// ...
// Same code than Above, only variables names change
// ...
return haut_true||droite_true||bas_true||gauche_true;
}
该代码在小地图(~50到100个方格)上工作得非常好。但我得到了更大的那些:
08-25 11:26:31.912: E/AndroidRuntime(5497): FATAL EXCEPTION: main
08-25 11:26:31.912: E/AndroidRuntime(5497): java.lang.StackOverflowError
08-25 11:26:31.912: E/AndroidRuntime(5497): at mypackage.isContiguJoueur(Case.java:xxx)
... x 100
抱歉我的英文不好,谢谢你将来的帮助! : - )
修改:我忘了。为了避免大规模无用的递归测试,我已经这样做了:
if(this.droite!=null && !haut_true) {
// ...
if(this.bas!=null && !haut_true && !droite_true) {
// ...
if(this.gauche!=null && !haut_true && !droite_true && !bas_true) {
// ...
答案 0 :(得分:1)
我只是在我的类Case中添加一个布尔值,如果我测试这个Case,我将布尔值设置为true,我以后不会进来。改进非常重要! 之前它是关于n ^ 4(n是玩家拥有的案件数)测试。现在它是关于n。凭借我最大的地图和玩家拥有整个地图,我没有错误。
答案 1 :(得分:0)
您的问题是您的路径与电路板上的方块数呈指数关系。堆栈溢出错误意味着你递归的次数太多了:每次递归占用了堆栈空间,而你正在耗尽它(Chaque递归利用l'espace sur le pile,et il y'en a trop,alors il nya plus d 'espace - et c'estunedépassementdepile)。
你可以迭代地执行此操作(没有递归)并且不会遇到此问题。但请记住,可能路径的数量仍然非常大,这可能会消耗CPU。
希望这有助于,
TG