2014-10-13 2 views
1

До сих пор я выполняю функции по размещению кораблей на борту, и у меня есть некоторые проблемы с функцией проверки - это какое-то поле. Моя основная идея заключается в том, чтобы иметь один метод, который будет вызываться по нажатию кнопки:Я пытаюсь создать «Тонущие корабли» с помощью jQuery

$("#dodaj1x1").click(function(){ 
     var raspolozivo=parseInt($("#raspolozivo1x1").text()); 
     if(raspolozivo>0){ 

      generisi1x1();//call for function that generate random field 

      var novoRaspolozivo= raspolozivo-1; 
      $("#raspolozivo1x1").html(novoRaspolozivo); 
     } 
     else{ 
      alert("Rasporedjeni svi raspolozivi brodovi ovog tipa!"); 
     } 
    }); 

и он будет вызывать функцию для генерации случайного поля:

function generisi1x1(){ 
      var minR = 0; 
      var maxR = 9; 
      var minK = 0; 
      var maxK = 9; 
      randRed=Math.floor(Math.random() * (maxR - minR + 1)) + minR; 
      randKol=Math.floor(Math.random() * (maxK - minK + 1)) + minK; 
      proveri1x1(randRed,randKol);//call to function to check is field available 
    } 

чем функции generisi1x1() вызывает функцию, которая проверяет является что поле доступно:

function proveri1x1(randRed,randKol){ 
     for(i=randRed-1;i<randRed+2;i++){ 
      for(j=randKol-1;j<randKol+2;j++){ 
       if($(".red"+i+".kolona"+j+"").hasClass('deoBroda')){ 
        alert("red:"+" "+i+" kolona:"+j); 
        generisi1x1(); 
       } 
       else { postavi1x1(randRed,randKol);} 
      } 
     } 
    } 

и моя проблема заключается в том, что иногда эта работа велика (по крайней мере, это выглядит, что работа велика, может быть, везение), а иногда порождают только 3 кораблей 1 x1 (должно быть 4), иногда показывают мне сообщение о проблеме и генерировать 5 судов (4 на нужных местах, 1 на плохой) и т.д.

Printscreen плохого случая: Added ship 1x1 on position 5,3 right next to ship 4x1

Вот живой демо весь код: Live demo

До сих пор я предоставлял возможность вставлять корабли 4x1 и 1x1 и делать проверку только для 1x1, план должен делать то же самое для всех кораблей, любая помощь будет отличной.

ответ

1

Вы найдете его легче понять, если proveri1x1() выполняет проверку и возвращает true или false и generisi1x1() выполняет postavi1x1() действие;

function generisi1x1() { 
    var minR = 0, maxR = 9, minK = 0, maxK = 9; 
    randRed = Math.floor(Math.random() * (maxR - minR + 1)) + minR; 
    randKol = Math.floor(Math.random() * (maxK - minK + 1)) + minK; 
    if(proveri1x1(randRed, randKol)) { //call to function to check is field available 
     postavi1x1(randRed,randKol);//set 
    } else { 
     generisi1x1();//try again 
    } 
} 

function proveri1x1(randRed, randKol) { 
    for(var i=randRed-1; i<randRed+2; i++) { 
     for(var j=randKol-1; j<randKol+2; j++) { 
      if($(".red" + i + ".kolona" + j).hasClass('deoBroda')) { 
       return false; 
      } 
     } 
    } 
    return true;//<<<< note the position of this return statement 
} 
+0

@ user3294091, В дополнение к моему ответу, вы можете уменьшить объем кода и сделать его гораздо легче определить новые типы судов, как [это] (http://jsfiddle.net/c0u19o7z/11/). Примечание. Изменения в HTML и javascript, но не в CSS. –