2016-07-23 11 views
0

Ich mache ein Schlachtschiff Spiel in Javascript. Momentan arbeite ich daran, die Boote zu platzieren und sicherzustellen, dass die Boote nicht übereinander liegen.Neustart Methoden in JavaScript

Um dies zu tun, verwende ich drei Methoden, eine, die eine Position für das Boot wählt, eine, die das Boot baut und eine Grenze um es macht, und eine dritte, die diese beiden Methoden ausführt. Wenn die zweite Methode eine Grenze um das Boot legt, geschieht dies durch Setzen einer Eigenschaft boatHere auf 1, und dann in der dritten Funktion überprüft es, ob die erste Funktion eine Position ausgewählt hat, die bereits die Eigenschaft boatHere = 1 hat. Ich möchte prüfen, ob dort schon ein Boot ist, und die dritte Funktion neu starten, um ein Boot woanders zu platzieren. Hier ist der Code:

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

Vorsicht, nicht deklarierte globale Variablen every !! –

Antwort

-1

Aus Ihrer Beschreibung sieht es aus wie Sie das wollen:

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

D.h. Wähle eine neue Position, bis du eine Stelle findest, die noch nicht besetzt ist, und baue dort ein Boot.

+0

Ich habe versucht zu sagen, ob es weniger als 3 Plätze zur Verfügung stehen. Ihre While-Schleife wird unendlich sein. –

+0

@AwakeningByte Das stimmt, aber das kann statisch durch den aufrufenden Code ausgeschlossen werden (indem sichergestellt wird, dass das Board immer genug Kacheln für alle Boote hat). – melpomene

2

Sie können eine separate placeSingleBoat() Funktion verwenden, um ein Boot zu platzieren, das zurückgibt, wenn es erfolgreich war oder nicht. Die placeBoat() Funktion kann dann rufen placeSingleBoat() so oft wie nötig, bis es erfolgreich war:

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

Sie können den 'else {' '}' Teil entfernen. Die while-Schleife kann auf while (! This.placeSingleBoat (boatNum)) {} 'reduziert werden. – melpomene

+0

wenn weniger als 3 Plätze verfügbar sind. Ihre While-Schleife wird niemals aufhören. –

+0

@AwakeningByte: Wie würde es funktionieren, wenn 4 Schiffe funktionieren, wenn nur 3 Plätze zur Verfügung stehen? – sth