2016-02-10 14 views
6

मैंने स्टैक ओवरव्लो में अन्य सुझावों को खोज और कोशिश कर रहा है। दुर्भाग्यवश उत्तर मेरे लिए काम नहीं कर रहे हैं। वे 'के लिए' के ​​बजाय 'foreach' का उपयोग करने का सुझाव दे रहे हैं, लेकिन मैं कैसे कर सकता हूं ... अगर मैं केवल 50 बार फिर से शुरू करना चाहता हूं? : <जेएसलिंट: अप्रत्याशित 'के लिए'। अप्रत्याशित 'var'

ठीक है, मैं बस कोड पेस्ट कर दूंगा और देखते हैं कि कुछ अच्छे लोग मेरी मदद कर सकते हैं या नहीं।

JSLint समाप्त करने में असमर्थ था।

अप्रत्याशित 'के लिए'। के लिए (var i = 1; i < = 50; i + = 1) {
लाइन 6 कॉलम 8

अप्रत्याशित 'var'। के लिए (वर मैं = 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 काम करता है। लेकिन मैं इसे जेएसलिंट के साथ मान्य कर रहा था, जेएसलिंट में चेतावनियों के लिए 'सहनशील' भी काम नहीं करता है।

+5

यह सिर्फ Crockford, बेवकूफ जा रहा है फिर से, तुमसे कह 'for' छोरों कभी इस्तेमाल किया जा कभी नहीं करना चाहिए है। मैं बस इसे अनदेखा करूँगा। – adeneo

+0

यह प्रश्न इंगित करता है कि इस चेतावनी को 'सहन करने के लिए' अनदेखा करने का विकल्प है। http://stackoverflow.com/questions/30518554/jslint-unexpected- – miltonb

+0

हाँ, इसे अनदेखा करना सबसे अच्छा होना चाहिए ... लेकिन मैं वास्तव में यह जानना चाहता हूं कि इससे कैसे निपटें। मुझे पता है कि इस "समस्या" के साथ बहुत सारे धागे हैं लेकिन कोई भी मेरे लिए काम नहीं करता है।वैसे भी शुक्रिया! –

उत्तर

5

जब आप for सहन करने के लिए चुनते हैं, तो अगली बात इसके बारे में आपको चेतावनी है var i की वैश्विक घोषणा है की चोटी पर var i;। चूंकि आपको शीर्ष-स्तर पर फॉर-लूप मिला है, इसलिए i आपके प्रोग्राम में हर जगह उपलब्ध हो जाता है।

मैं बस for बर्दाश्त करूँगा और इसे आईआईएफई में लपेटूंगा। इस तरह, 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)); 
    } 
})(); 

तुम भी, वहाँ एक मौजूदा कार्यान्वयन का उपयोग को छोड़कर, एक समारोह है कि सामान्यीकृत "दोहराने n बार" परिभाषा बना सकते हैं।

अपने मामले में
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

अच्छा, यह फ़ंक्शन आपके कोड के लिए विशिष्ट है। फ़ंक्शन 'दोहराना()' बनाने से आपको रोकने के लिए कुछ भी नहीं है जो एक फ़ंक्शन और कई बार लेता है, और फ़ंक्शन को दी गई संख्या को कॉल करता है। यह वास्तव में क्या करता है लॉन्च करता है: https://lodash.com/docs#times – jdphenix

+0

इसके अलावा, वहां अन्य लोगों के साथ जावास्क्रिप्ट चॉप के साथ बहुत सारे लोग हैं जो बहुत अधिक मूर्खतापूर्ण या बेहतर हो सकते हैं - यह चेकमार्क अक्सर अधिक उत्तरों को हतोत्साहित करता है। यदि कुछ (कुछ?) दिनों के बाद यह आपके लिए सबसे अच्छा समाधान बना रहता है, तो यह तब उचित हो सकता है। – jdphenix

4

जेएसलिंट अति उत्साही है (कुछ कहेंगे), यह उम्मीद है कि सभी var कथन एक समारोह के शीर्ष पर होंगे।

आप जेएसलिंट को बता सकते हैं कि आप उस पंक्ति पर एक निर्देश टिप्पणी जोड़कर उस नियम की परवाह नहीं करते हैं जहां आप चर घोषित कर रहे हैं।

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

या आप स्थानांतरित कर सकते हैं सभी अपनी फ़ाइल/समारोह

+0

मैंने उस कोड को पहली पंक्ति में रखा लेकिन कुछ भी नहीं किया। इसलिए मैंने इस अन्य समाधान की कोशिश की, मैंने (var = i .... और घोषित var = i; शीर्ष पर स्थानांतरित किया। लेकिन अब यह कह रहा है: शीर्ष स्तर पर अप्रत्याशित 'के लिए' (i = 1; i <= 50; i + = 1) { –

+1

@JoseSerodio पहली पंक्ति में नहीं, आप उस टिप्पणी को लूप –

संबंधित मुद्दे