2017-09-23 1 views
1

Ich habe eine Aufgabe in meiner Javascript-Klasse, die eine Frage aufwirft Ich fühle mich wie ich in der Nähe zu beantworten bin, aber gerade nicht ganz dahin.Alien Name Generator

Eine Sache, die mich verwirrt ist, warum Entwickler-Tools mir sagen, die Variable "Nachricht" ist null. Ich kann es nicht herausfinden. Alles auf der Aufgabe vor diesem Problem (die ähnliche Probleme waren), konnte ich in Windeseile kommen. Ich bin vielleicht darüber hinweg.

Problem: „Erstellen Sie eine Anwendung, die einen Satz von fünf zufällig generieren‚in in ihnen fremden Namen‘, wenn eine Schaltfläche geklickt wird diese fremden Namen müssen mindestens einen Vokal haben und sollte zwei wiederholt haben Zeichen irgendwo. Der Name lautet Beispiel: 'llag', 'Uffrd' und 'Dxxi'.

Diese Namen sollten dem Benutzer im DOM angezeigt und bei nachfolgenden Klickern durch neue ersetzt werden. "

My-Code (wurden damit um ziemlich viel Hantieren und sie nicht vor dem Einfügen hat zu überprüfen, so verzeiht mir, wenn es schwer zu navigieren ist. Lassen Sie mich wissen, wie Sie über die Lösung dieses mit Javascript gehen würde.

//declares and assaigns the message (text where names will be printed) 
 
    var message = document.querySelector("#message"); 
 
    //declares the array and gives it 5 spots for names 
 
    var nameArray = ["", "", "", "", ""]; 
 

 
    // declares the name generating function 
 
    function rando() { 
 
     //declares assigns name as empty for now 
 
     var name = []; 
 
     //randomizes length of the name 
 
     var namelength = Math.round(Math.random() * 7) + 4; 
 
     //declaring a vowel count 
 
     var vowelCount = 0; 
 
     //for loop to store each name into the array 
 
     for (var i = 0; i < 5; i++) { 
 
      //for loop to decide the letters for each 
 
      for (var i = 0; i < namelength; i++) { 
 
       //declares boolean variable that stores whether or not the current character is a vowel using the created is Vowel() function 
 
       var wasVowel = isVowel(name[i]); 
 
       //if the last character was a vowel 
 
       if (wasVowel) { 
 
        //counts vowels 
 
        vowelCount++; 
 
        //while loop 
 
        while (isVowel(name[i])) { 
 
         //declares the variable and assigns it to a random number between 0 and 25 
 
         var randomCharacterIndex = Math.round(Math.random() * 25); 
 
         //updates the current character based on the random variable equal to or above the unicode 97 ("a") 
 
         name[i] = String.fromCharCode(97 + randomCharacterIndex); 
 
        } 
 
        //if the previous character was not a vowel 
 
       } else { 
 
        //while loop 
 
        while (isVowel(name[i]) == false) { 
 
         //declares variable and assigns it to random number between 0 and 25 
 
         var randomCharacterIndex = Math.round(Math.random() * 25); 
 
         //updates the current character based on the random variable equal to or above the unicode 97 ("a") 
 
         name[i] = String.fromCharCode(97 + randomCharacterIndex); 
 
        } 
 
       } 
 
       //adds each letter to the name 
 
       name += name[i]; 
 
      } 
 
      //making the first letterz 
 
      name[0].toUpperCase(); 
 
      //adds each name to the array 
 
      nameArray[i] = name.join(""); 
 
      //name is reset to null for the next name loop 
 
      name = []; 
 
     } 
 
     //prints the names onto the DOM 
 
     message.innerHTML = nameArray.join(", "); 
 
    } 
 
    
 

 
    function isVowel(character) { 
 
     if (character == "a" || character == "e" || character == "i" || character == "o" || character == "u") { 
 
      return true; 
 
     } else { 
 
      //this is the 'default' 
 
      return false; 
 
    } 
 
}
 <button onclick="rando()">Random Names</button> 
 
     <div id="message"></div>

+0

Willkommen bei Stack Overflow. Bitte aktualisieren Sie Ihre Frage, um eine funktionierende Demo Ihres Codes zu erhalten, damit wir das Problem sehen können. Siehe [Erstellen eines minimalen, vollständigen und überprüfbaren Beispiels] (https://stackoverflow.com/help/mcve) und [Erstellen eines ausführbaren Code-Snippets] (https://stackoverflow.blog/2014/09/16/introducing-runnable-javascript-css-und-html-code-snippets /) – FluffyKitten

+0

Es ist null, weil Sie HTML hier haben. Wo ist dein HTML? Benutze auch den oder Operator '||' in deiner 'isVowel' Funktion und mache das in einer' if' Anweisung. Oder besser noch, verwenden Sie "einige". – jmargolisvt

+0

hey, ich habe meinen HTML-Code zu einer Antwort hinzugefügt, die ich gepostet habe. Das tut mir leid. Vielen Dank. Ich werde die isVowel Funktion verkürzen und || benutzen statt "oder". Ich weiß nicht, warum ich so viel Mühe auf diese – jtsports1217

Antwort

0

würde ich den folgenden Ansatz

  1. generieren zufällige Namenslänge

  2. Erzeugen Sie gelegentliche Doppelzeichenposition

  3. obligatorische Vokal Position, die nicht die beiden Zeichen zu wiederholen
  4. Build-Wort nicht schneidet, nach den Regeln aufstellen und die Erzeugung von Zufall Zeichen entsprechend

    var message = document.querySelector("#message"); 
    
    function rando() { 
    
        message.innerHTML = ""; 
    
        for (var j=0;j<5;j++) 
        { 
         var name = ""; 
         var namelength = Math.round(Math.random() * 7) + 4; 
         var pairPosition = Math.round(Math.random() * (namelength-1)); 
         var obligatoryVowelPos = Math.round(Math.random() * (namelength-1)); 
    
    
    
         while(obligatoryVowelPos == pairPosition || obligatoryVowelPos == (pairPosition+1)) 
         obligatoryVowelPos = Math.round(Math.random() * (namelength-1)); 
    
    
         for (var i =0;i<namelength;i++) { 
    
    
         if (i==pairPosition) 
         { 
          var character = generateRandomLetter(); 
          name = name + character + character; 
          i++; 
         } 
         else if (i==obligatoryVowelPos) 
         { 
          name = name + generateVowel(); 
         } 
         else 
         { 
          name = name+generateRandomLetter(); 
         } 
    
         name = name.charAt(0).toUpperCase() + name.slice(1); 
    
        //prints the names onto the DOM 
    
        } 
        message.innerHTML += name + "<br>"; 
        } 
    
    } 
    
    function generateVowel() 
    { 
         var aeiou = Math.round(Math.random()*4)+1; 
    
         switch (aeiou) 
         { 
          case 1:return 'a';break; 
          case 2:return 'e';break; 
          case 3:return 'i';break; 
          case 4:return 'o';break; 
          case 5:return 'u';break; 
         } 
    } 
    
    function generateRandomLetter() 
    { 
        var randomCharacterIndex = Math.round(Math.random() * 25); 
        return String.fromCharCode(97 + randomCharacterIndex); 
    } 
    

Obwohl nicht erforderlich, können Sie verwenden Sie auch Die originale isVowel-Funktion verhindert doppelte Vokale, wenn der Code eingegeben wird, oder fügt dem Wort einen Vokal hinzu, wenn nach dem Ende der Worterstellungsschleife keine Vokale hinzugefügt wurden. Es liegt wirklich an Ihnen, dieser Code löst Ihr Problem bereits.

+0

Wo ist' y' Vokal? Außerdem denke ich, dass du den Modulo willst und nicht mit 4 multiplizierst. –

+0

'y' kann je nach Kontext und sogar Sprache als Vokal oder Konsonant betrachtet werden; da OP es nicht in seine eigene 'isVowel()' Funktion eingeschlossen hat, habe ich es nicht berücksichtigt. Und nein, es ist *. Anders als die Methode C 'rand()' gibt Javascript 'Math.random()' einen Gleitkommawert zwischen 0 und 1 zurück, der multipliziert wird und einen Bruchteil der Zahl 4 ergibt. Er muss gerundet werden, damit wir eine ganze Zahl haben. und dann wird 1 hinzugefügt, so dass wir niemals Null bekommen. –