2016-07-23 5 views
0

私はJavascriptで戦艦ゲームを作っています。現時点では、私はボートを配置し、ボートが互いの上に置かれていないことを確認しています。JavaScriptでの再起動方法

これを行うには、ボートの位置を選択するメソッド、ボートを作成して境界線を作るメソッド、およびこれらの2つのメソッドを実行する3つのメソッドを使用しています。 2番目の方法でボートの周囲に境界線を作成すると、プロパティboatHere1に設定し、3番目の関数で、最初の関数が既にプロパティーboatHere = 1を持つ位置を選択したかどうかを確認します。私は既にそこにボートがあるかどうかをチェックし、ボートをどこかに置くために3番目の機能を再開したい。ここでは、コードは次のようになります。

placeBoat : function() { //chooses position, checks to see if eligible and builds boat 
     for (boatNum = 1; boatNum < 4; boatNum++) { 
      this.selectPos(); 
      if (document.getElementById(boatPos).boatHere == 1) { 
       return; 
      } 
      else { 
       this.buildBoat();    
      } 
     } 
    }, 

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

    buildBoat : function() { //builds boat 3 tiles long and boundary 7 tiles long 
     for (boatLen = 1; boatLen < 4; boatLen++) { 
      xPos = xPos + 1; 
      boatPos = "cell_" + xPos + "_" + yPos; 
      document.getElementById(boatPos).hasBoat = 1; 
      document.getElementById(boatPos).style.backgroundColor = "brown"; 
      console.log("placed one tile"); 
     } 
     xPos = xPos - 6; 
     for (boatBox = 1; boatBox < 8; boatBox++) { 
      xPos++; 
      boatPos = "cell_" + xPos + "_" + yPos; 
      document.getElementById(boatPos).boatHere = 1; 
      document.getElementById(boatPos).innerHTML = " X";//visual reminder of where boundary is 
     } 
+2

everywere、宣言されていないグローバル変数を注意してください! –

答えて

-1

あなたの説明から、あなたはこれをしたいように見える:

for (boatNum = 1; boatNum < 4; boatNum++) { 
     do { 
      this.selectPos(); 
     } while (document.getElementById(boatPos).boatHere == 1); 
     this.buildBoat();    
    } 

すなわち、あなたがすでに占領されていないものを見つけるまで新しい地位を選択し続け、そこにボートを建てる。

+0

私は、利用可能なスポットが3つ未満であれば、言おうとしていました。あなたのwhileループは無限になります。 –

+0

@AwakeningByteそれは本当ですが、それは呼び出しコードによって(ボードが常にすべてのボートに十分なタイルを持っていることを確認することによって)静的に除外することができます。 – melpomene

2

別のplaceSingleBoat()関数を使用して、成功したかどうかを返すボートを配置することができます。 placeBoat()機能は、それが成功した終えるまで、必要に応じてplaceSingleBoat()を呼び出すことができます。

placeSingleBoat: function(boatNum) { //chooses position, checks to see if eligible and builds boat 
    this.selectPos(); 
    if (document.getElementById(boatPos).boatHere == 1) { 
     return false; 
    } 
    else { 
     this.buildBoat();    
    } 
    return true;  
}, 

placeBoat : function() { 
    for (boatNum = 1; boatNum < 4; boatNum++) { 
     var placed = false; 
     while (!placed) { 
      placed = this.placeSingleBoat(boatNum); 
     } 
    } 
}, 
+0

'else {' ''} '部分を削除することができます。 'while'ループは' while(!this.placeSingleBoat(boatNum)){} 'に減らすことができます。 – melpomene

+0

利用可能なスポットが3つ未満の場合。あなたのwhileループは決して止まらないでしょう。 –

+0

@AwakeningByte:利用可能なスポットが3つしかない場合、4隻の船を就航させるにはどうすればいいですか? – sth

関連する問題