0

私はあなたが地図上で軍隊を動かす必要がある小さなゲームを作成しています。動きができるかどうかを検出するには、2つの正方形の間に方法があるかどうかを確認する必要があります。したがって、再帰的に1つの正方形から開始し、4つの正方形(上、下、左、右)を取得します。次の条件では、行き止まりまたは目的の正方形しか取得しないため、再帰的にテストを繰り返します。すべてのマス目はプレイヤーのコントロール下になければなりません。

私のクラスに再帰的なコード実装があります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;
}
  • 正方形のクラス名:ケース
  • マップデータ:Case[]ケース
  • プレイヤーID:joueur
  • 上記の場合:haut

そのコードは小さな地図(〜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)    {
// ...
4

2 に答える 2

1

クラスCaseにブール値を追加するだけで、このケースをテストする場合は、ブール値をtrueに設定します。後では入りません。改善は非常に重要です!それが約n^4(nはプレイヤーが所有するケースの数)テストになる前。今では約nです。私の最大のマップで、プレイヤーがマップ全体を所有しているので、エラーはありません。

于 2012-08-26T16:36:27.863 に答える
0

あなたの問題は、あなたのパスがボード上の正方形の数で指数関数的であるということです。スタックオーバーフローエラーは、再帰が多すぎることを意味します。各再帰はスタックスペースを占有し、それが不足しています(Chaque再帰は、l'espace sur le tile、et il y'en a trop、alors il nyaplusdを利用します。 'espace-et c'est unedépassementdepile)。

これを繰り返し行うことができ(再帰なし)、この問題に遭遇することはありません。ただし、可能なパスの数は依然として非常に多く、CPUを消費する可能性があることに注意してください。

お役に立てれば、

TG

于 2012-08-25T22:03:40.433 に答える