2016-02-10 16 views
6

Ho cercato e provato altri suggerimenti in StackOverflow. Purtroppo le risposte non funzionano per me. Stanno suggerendo di usare "foreach" invece di "for", ma come potrei ... se voglio ripetere solo 50 volte? : <JSLint: "per" inatteso. Inatteso "var"

Bene, mi limiterò a incollare il codice e vediamo se alcune persone buone possono aiutarmi.

JSLint non è stato in grado di completare.

Inaspettato "per". per (var i = 1; i < = 50; i + = 1) {
riga 6 colonna 8

"var" imprevisto. for (var i = 1; i < = 50; i + = 1) {
linea 6 colonna 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!!"); 
    } 

Ci sono alcuni altri termini nel codice, ma sembra fermarsi al il primo. Grazie in anticipo! Hai dimenticato di dire che il codice funziona PERFETTO. Ma lo stavo solo validando con JSLint, anche "tollerante" per gli avvisi in JSLint non funziona.

+5

Questo è solo Crockford essere stupido, ancora una volta, che ti dice 'loop for' non dovrebbe mai essere usata mai. Lo ignorerei. – adeneo

+0

Questa domanda indica che esiste un'opzione per ignorare questo avviso "tollerare per". http://stackoverflow.com/questions/30518554/jslint-unexpected-for – miltonb

+0

Sì, ignorarlo dovrebbe essere il migliore ... ma voglio solo imparare davvero come affrontare questo. So che ci sono molte discussioni con questo problema "per" ma nessuno ha funzionato per me.Grazie comunque! –

risposta

5

Quando si sceglie di tollerare for, la prossima cosa che vi avverte circa è la dichiarazione globale del var i. Dal momento che hai il ciclo for al primo livello, i diventa disponibile ovunque nel tuo programma.

Mi piacerebbe solo tollerare for e avvolgerlo in un IIFE. In questo modo, i è disponibile solo all'interno di questa funzione e non perde l'ambito globale.

(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)); 
    } 
})(); 

Si potrebbe anche, il blocco delle chiamate utilizzando un'implementazione esistente là fuori, creare una funzione che generalizza la definizione di "repeat n volte".

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

Usa nel tuo caso sarà simile:

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

Impressionante, questo ha fatto il trucco. Grazie mille. Ci sono altre soluzioni? Rende il codice un po 'disordinato Sorriso So che forse sto chiedendo troppo! –

+0

Bene, questa funzione è specializzata nel codice. Non c'è nulla che ti impedisca di creare una funzione 'repeat()' che prende una funzione e un numero di volte e chiama la funzione il numero di volte specificato. Questo è ciò che lodash fa: https://lodash.com/docs#times – jdphenix

+0

Inoltre, ci sono un sacco di altre persone con le costolette di JavaScript là fuori che potrebbero avere qualcosa di più idiomatico o migliore - quel segno di spunta spesso scoraggia più risposte. Se dopo un paio (pochi?) Giorni questa rimane la soluzione migliore per te, allora potrebbe essere appropriato allora. – jdphenix

4

jslint è troppo zelante (alcuni direbbero), si aspetta che tutte le istruzioni var siano nella parte superiore di una funzione.

Puoi dire a jslint che non ti interessa di questa regola aggiungendo un commento di istruzione sulla riga sopra dove stai dichiarando la variabile.

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

Oppure si può spostare tutta la tua var i; alla parte superiore del file/funzione di

+0

Ho inserito il codice nella prima riga ma non ho fatto nulla. Così ho provato quest'altra soluzione, ho spostato il file for (var = i .... e dichiarato var = i; in alto.) Ma ora sta dicendo: Inaspettato 'for' al livello superiore. per (i = 1; i <= 50; i + = 1) { –

+1

@JoseSerodio Non nella prima riga, si aggiunge quel commento proprio sopra il ciclo for –

Problemi correlati