私はあなたが地図上で軍隊を動かす必要がある小さなゲームを作成しています。動きができるかどうかを検出するには、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) {
// ...