2016-09-17 5 views
0

私は戦艦ゲームを作っています。 3つのタイルのボートを3つ並べて、重ならないようにしたい。 リコール方法の問題

var boatGrid = { 

    placeBoat : function() { 
     for (boatNum = 1; boatNum < 4; boatNum++) { 
      console.log("boat placed now"); 
      this.selectPos(); 
      document.getElementById("boattest").innerHTML = boatPos; 
      if (document.getElementById(boatPos).hasBoat == 1) { 
       this.placeBoat(); 
       document.getElementById("boattest").innerHTML = "failed"; 
      } 
      else { 
       this.buildBoat();   
      } 
     } 
    }, 

    selectPos : function() { 
      xPos = Math.floor(Math.random() * 8 + 1); 
      yPos = Math.floor(Math.random() * 10 + 1); 
      boatPos = "cell_" + xPos + "_" + yPos; 
    }, 

    buildBoat : function() { 
     for (boatLen = 1; boatLen < 4; boatLen++) { 
      boatPos = "cell_" + xPos + "_" + yPos; 
      xPos = xPos + 1; 
      document.getElementById(boatPos).hasBoat = 1; 
      document.getElementById(boatPos).style.backgroundColor = "brown"; 
      console.log("placed one tile"); 
     } 

    }, 

    clearTable : function() { 
     for (y = 1; y < 11; y++) { 
      for (x = 1; x < 11; x++) { 
       boatPos = "cell_" + x + "_" + y; 
       document.getElementById(boatPos).hasBoat = 0; 
       document.getElementById(boatPos).boatHere = 0; 
       document.getElementById(boatPos).style.backgroundColor = "#34B0D9" 
       document.getElementById(boatPos).innerHTML = "<pre>  </pre>"; 
       boatGrid.hasChecked = 0; 
      } 
     } 
    }, 
} 

が(変数boatPos座標記憶)を2回選択される座標、関数placeBoat()は、それ自体を呼び出すことになっている:私は、次のコードを書かれています。しかし、実際に起こっているのは、buildBoat()関数が2回呼び出されていることです。あなたの誰かが問題を見ることができますか?私は現在、placeBoat()関数が内部からリコールする必要があることに問題があると考えていますが、その回避方法はわかりません。すべての助けに感謝します。

答えて

0

私はそのように、boatGrid内部グローバル変数としてboatPosを格納します:

var boatGrid = { 
    boatPos: 0, 

    placeBoat : function() { 
     for (boatNum = 1; boatNum < 4; boatNum++) { 
      //same code as before 
      if (this.boatPos == 1) { 
       this.placeBoat(); 
      // same code as before 
     } 
    }, 

    buildBoat : function() { 
     for (boatLen = 1; boatLen < 4; boatLen++) { 
      //same code as before 
      this.boatPos = 1; 
      // same code as before 
     } 
    }, 
} 

そして、あなたは(それはそうと)boatPosで複数のプロパティを保存する必要がある場合は、オブジェクトを使用します。

boatPos = { 
    hasBoat: 0, 
}, 

if (this.boatPos.hasBoat == 1) 

を:関数内

そして、

this.boatPos.hasBoat = 1; 
+1

私はそのようなオブジェクト定義の中に変数を宣言することは合法だとは思わない。あなたはそれを財産にすることを意味しましたか? – Andbdrew

+0

@Andbdrewはい、私は少し速かったです。コードにマッチする答えを編集しました。 – falkodev

+0

boatPosはオブジェクトの外側に定義されています。とにかく、buildBoat()関数を2回実行するのはなぜですか? –

関連する問題