2016-07-23 4 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

@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: Как будет размещаться 4 корабля когда-либо, если есть только 3 места? – sth

Смежные вопросы