2016-02-10 3 views
6

Я искал и пробовал другие предложения в StackOverflow. К сожалению, ответы на меня не работают. Они предлагают использовать «foreach» вместо «for», но как я могу ... если я хочу повторять только 50 раз? : <JSLint: Неожиданно «для». Неожиданный «var»

Ну, я просто вставлю код и посмотрим, поможет ли мне какой-нибудь хороший народ.

JSLint не смог завершить игру.

Неожиданный «для». для (var i = 1; i < = 50; i + = 1) {
строка 6 колонка 8

Неожиданный «вар». для (вар я = 1; я < = 50; I + = 1) {
строка 6 колонка 13

"use strict"; 

    var campo = []; 
    var ronda = 0; 

    // Llenamos el campo de 50 humanos/maquinas/extraterrestres = 150 jugadores 
    for (var i=1;i<=50;i+=1){ 
     campo.push(new Human("h"+i)); 
     campo.push(new Machine("m"+i)); 
     campo.push(new Alien("e"+i)); 
    } 

    // Array.prototype.suffle para barajar el Array 
    Array.prototype.shuffle = function() { 
     var input = this; 

     for (var i=input.length-1;i>=0;i-=1){ 
      var randomIndex = Math.floor(Math.random()*(i+1)); 
      var itemAtIndex = input[randomIndex]; 

      input[randomIndex]=input[i]; 
      input[i] = itemAtIndex; 
     } 
    }; 

    // Barajamos el Array campo 
    campo.shuffle(); 

    // Comprobamos que quedan más de 1 jugador por ronda 
    while (campo.length>1) { 
     console.log("Iniciando ronda: " + ++ronda); 
     console.log(campo.length + " jugadores luchando."); 
     // Recorremos el campo, y luchamos 

     var muertos = 0; 

     for (var i=0; i<campo.length-1; i+=2){ 
      // Caso de numero impar de jugadores: 
      // Por ejemplo cuando solo quedan 3 jugadores. Pelean 1 vs 2. El 3 se libra. 
      // - Si siguen vivos y aguantan otra ronda, se barajan las posiciones otra vez y 
      // vuelven a pelear dos. Y el nuevo tercero no pelea. 
      // - Si uno de los dos muere, en la siguiente ronda ya solo quedan 2, y pelean normal. 

      campo[i].fight(campo[(i+1)]); 
      // # descomentar solo la siguiente linea para hacer comprobaciones # 
      // console.log("["+ campo[i].username + "] VS ["+ campo[(i+1)].username + "]"); 
      if (campo[i].health<=0) { 
       console.log("El " + campo[i].constructor.name + " llamado " + campo[i].showName() + " ha sido asesinado :<"); 
       var fallecido = campo.splice(i, 1); 

       // # descomentar solo la siguiente linea para hacer comprobaciones # 
       //console.log(fallecido[0]); 
       i--; // como el array se hace pequeño, hay que corregir el error para que no se salte jugadores 
       muertos++; 
      } else { 
       if (campo[(i+1)].health<=0) { 
        console.log("El " + campo[(i+1)].constructor.name + " llamado " + campo[(i+1)].showName() + " ha sido asesinado :<"); 
        var fallecido = campo.splice((i+1), 1); 

        // # descomentar solo la siguiente linea para hacer comprobaciones # 
        // console.log(fallecido[0]); 
        i--; // como el array se hace pequeño, hay que corregir el error para que no se salte jugadores 
        muertos++; 
       } 
       else { 
        // # descomentar solo la siguiente linea para hacer comprobaciones # 
        // console.log("Siguen vivos"); 
       } 
      } 
     } 

     console.log("Fin de ronda!") 
     if (muertos === 1) { 
      console.log("Ha muerto " + muertos + " jugador."); 
     } else { 
      console.log("Han muerto " + muertos + " jugadores."); 
     } 

     // Al final de la ronda barajamos de nuevo 
     campo.shuffle(); 
    } 

    if (campo.length === 1) { 
     console.log("Vaya!! Ha sido una memorable batalla!"); 
     console.log("Después de tantos bits derramados y de " + ronda + " rondas... el jugador '" + campo[0].constructor.name + "' llamado '" + campo[0].showName() + "' se ha alzado con la victoria!!"); 
    } 

Есть некоторые другие в коде, но кажется, останавливаться на первый. Спасибо заранее! Забыл сказать, что код работает PERFECT. Но я просто проверял его с помощью JSLint, также «терпимый» для предупреждений в JSLint не работает.

+5

Это просто Крокфорд глупо, опять же, говорю вам, 'for' петли должны никогда никогда не будет использоваться. Я бы просто проигнорировал это. – adeneo

+0

Этот вопрос указывает, что есть возможность игнорировать это предупреждение «терпеть». http://stackoverflow.com/questions/30518554/jslint-unexpected-for – miltonb

+0

Да, игнорирование должно быть лучшим ... но я просто хочу научиться справляться с этим. Я знаю, что существует много потоков с этой проблемой «для», но никто не работал на меня.В любом случае, спасибо! –

ответ

5

При выборе терпеть for, следующая вещь, это предупреждает вас о том, глобальная декларация var i. Поскольку у вас есть цикл for-loop на верхнем уровне, i становится доступен везде в вашей программе.

Я бы просто потерпел for и завернул его в IIFE. Таким образом, i доступен только внутри этой функции и не просачивается в глобальную область.

(function() { 
    var i = 0; 
    for (i=1;i<=50;i+=1) { 
     campo.push(new Human("h"+i)); 
     campo.push(new Machine("m"+i)); 
     campo.push(new Alien("e"+i)); 
    } 
})(); 

Вы могли бы также, за исключением использования существующей реализации там, создать функцию, обобщающее определение «повтор п раз».

function repeat(fn, n) { 
    var i = 0; 
    for (;i < n; i += 1) { 
    fn(); 
    } 
} 

Использование в вашем случае будет выглядеть следующим образом:

function initialize() { 
    campo.push(new Human("h"+i)); 
    campo.push(new Machine("m"+i)); 
    campo.push(new Alien("e"+i)); 
} 

// then later 
repeat(initialize, 50); 
+0

Удивительный, это трюк. Большое вам спасибо. Есть ли другие решения? немного грязно :-) Я знаю, может быть, я слишком много спрашиваю! –

+0

Ну, эта функция специализируется на вашем коде. Ничто не мешает вам создать функцию 'repeat()', которая принимает функцию и количество раз, и вызывает функцию заданное количество раз. Это действительно то, что делает lodash: https://lodash.com/docs#times – jdphenix

+0

Кроме того, есть много других людей с отладками JavaScript, которые могут очень хорошо иметь что-то более идиоматическое или лучшее - эта галочка часто отговаривает больше ответов. Если после пары (несколько?) Дней это будет лучшим решением для вас, тогда это может быть уместно. – jdphenix

4

jslint является чрезмерно усердным (некоторые скажут), он ожидает, что все var утверждений находятся в верхней части функции.

Вы можете указать jslint, что вы не заботитесь об этом правиле, добавив комментарий команды в строку выше, где вы объявляете переменную.

// Llenamos el campo de 50 humanos/maquinas/extraterrestres = 150 jugadores 
/*jslint for:true */ 
for (var i=1;i<=50;i+=1){ 

Или вы можете переместить все ваши var i; в верхней части файла/функции

+0

Я поместил этот код в первую строку, но ничего не сделал. Поэтому я попробовал это другое решение, я переместил for (var = i .... и объявил var = i вверху, но теперь он говорит: «Неожиданно» для «на» на верхнем уровне. for (i = 1; i <= 50; i + = 1) { –

+1

@JoseSerodio Не в первой строке вы добавляете этот комментарий прямо над циклом for –

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