2016-07-23 63 views
0

我正在用Javascript製作戰艦遊戲。目前,我正在着手放置船隻,並確保船隻不會彼此重疊。JavaScript中的重新啓動方法

要做到這一點,我使用了三種方法,一種爲船隻選擇位置,一種建立船隻並在其周圍劃界,另一種則執行這兩種方法。當第二種方法在船的周圍形成邊界時,它通過將屬性boatHere設置爲1,然後在第三個函數中檢查第一個函數是否選擇了已具有屬​​性boatHere = 1的位置。我想檢查那裏是否有一艘船,並重新啓動第三個功能,以便在其他地方放置一艘船。下面是代碼:

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

@AakeningByte這是真的,但可以通過調用代碼靜態排除(通過確保董事會對所有船隻都有足夠的瓦片)。 – 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

@AakeningByte:如果只有3個點可用,如何放置4艘船? – sth