2016-09-30 8 views
0

Ich versuche, eine Funktion, die switch() beteiligt und gibt mir Antworten auf bestimmte, zufällig generierte Zahlen. Irgendwie führt meine Funktion nicht den Fall aus, den sie ausführen soll. Es gibt mir nur den Standardfall, egal wie die Nummer ist.Switch() funktioniert nicht mit Math.random() Zahlen

Dies ist mein Code:

var i; 
var girl; 

function response() { 
    var girl = prompt("What girl do you like?"); 
    var r = (Math.random() * (3 - 1 + 1) + 1).toFixed(0); 
    var i = r; 

    switch(i) { 
     case (i == 1): 
      alert(girl + " likes you as a friend."); 
      break; 

     case (i == 2): 
      alert(girl + " does not really like you."); 
      break; 

     case (i == 3): 
      alert(girl + " has a crush on you."); 
      break; 

     case (i == 4): 
      alert(girl + " wants you to ask her out."); 
      break; 

     default: 
      console.log(i); 
    } 
} 
+0

'toFixed' konvertiert in einen String, so dass Sie vielleicht' Fall verwendet werden soll '1': ',' ​​case '2': ', etc. Auch Ihr Angebot wird auf alle Fälle nicht decken, Sie könnte var i = (Math.random() * 4 + 1) .toFixed (0); '. –

Antwort

4

Das ist nicht, wie ein Schalter funktioniert. Es vergleicht den Wert für jede case mit der switch.

Im Wesentlichen wird jetzt der Wert i mehrfach mit booleschen Werten verglichen (das Ergebnis von zB i == 1).

Auch Ihre Zufälligkeit wird nicht mehr zufällig durch Hinzufügen von Arithmetik mit statischen Werten in den Wert wie Sie getan haben. Sie sollten es durch 4 ersetzen. Sie sollten auch etwas wie Math.ceil() verwenden (da Sie den 0 Wert ignorieren, der wahrscheinlich auch keine gute Idee ist), nicht , der eine Zeichenfolge zurückgibt.

Sie benötigen auch nicht die Klammer um die zu vergleichenden Werte. Wenn Sie den Bereich der Zufallszahl kennen, brauchen Sie wahrscheinlich auch keinen Standardfall (da Sie bereits alle Möglichkeiten abdecken).

Sie können auch r direkt verwenden, müssen Sie es nicht neu zuweisen.

Ihre Variablen sind auch lokal für Ihre Funktion, also brauchen Sie sie wahrscheinlich nicht an der Spitze.

Hier ist, wie ich würde das Produkt neu schreiben:

function response() { 
    var girl = prompt("What girl do you like?"); 
    var r = Math.floor(Math.random() * 4); 

    switch(r) { 
     case 0: 
      alert(girl + " likes you as a friend."); 
      break; 

     case 1: 
      alert(girl + " does not really like you."); 
      break; 

     case 2: 
      alert(girl + " has a crush on you."); 
      break; 

     case 3: 
      alert(girl + " wants you to ask her out."); 
      break; 

    } 
} 

... oder sogar ...

function response() { 
    var answerSuffixes = [ 
     " likes you as a friend.", 
     " does not really like you.", 
     " has a crush on you.", 
     " wants you to ask her out." 
    ]; 
    var girl = prompt("What girl do you like?"); 
    var r = Math.floor(Math.random() * answerSuffixes.length); 

    alert(girl + answerSuffixes[r]); 
} 
+0

Aber wenn der i-Wert tatsächlich 3 ist, sollte das nicht für i == 3 gelten? Ist das nur mit if-Anweisungen möglich? E: Danke :) – Vincent

+0

@Vincent Nein, siehe aktualisierte Antwort :) – alex

+0

Update: Ich habe versucht, Ihren Code (aber den Teil von @Nina Scholz). Vielen Dank! Es funktioniert jetzt :) – Vincent

1

Die case-Anweisung in Javascript bereits ein Spiel tut auf dem Ziel i:

switch(i) { 
     case 1: 
      alert(girl + " likes you as a friend."); 
      break; 

     case 2: 
      alert(girl + " does not really like you."); 
      break; 

     case 3: 
      alert(girl + " has a crush on you."); 
      break; 

     case 4: 
      alert(girl + " wants you to ask her out."); 
      break; 

     default: 
      console.log(i); 
    } 

So gibt es keine Notwendigkeit, in jedem case vergleichen Ausdrücken zu haben.

0

switch ist streng zu vergleichen.

Sie müssen entweder

switch (i) { 
    case 1: 
     alert(girl + " likes you as a friend."); 
     break; 

Oder

switch (true) { 
    case i === 1: 
     alert(girl + " likes you as a friend."); 
     break; 
+0

Das === hat funktioniert! Danke, dass du mir geholfen hast!! – Vincent

+0

Der zweite ist sehr unintuitiv, wenn einer der Entwickler in meinem Team schrieb, dass ich ihm sagen würde, es zu wiederholen – Liam

+0

@ Liam, vielleicht, aber wenn es gemischte Typen gibt, dann würde es gehen. –

0

Wenn Sie einen Schalter erklären, verwendet die Variable auf jeden Fall verglichen wird, so Auswertungen nicht notwendig sind.

Es kann auch hilfreich sein, Ihre Antwort von 'r' in eine Ganzzahl zu zerlegen, um die Variablentypen in Schach zu halten.

function response() { 
    var girl = prompt("What girl do you like?"); 
    var r = parseInt((Math.random() * (3 - 1 + 1) + 1).toFixed(0)); 
    var i = r; 

    switch(i) { 
     case 1: 
      alert(girl + " likes you as a friend."); 
      break; 

     case 2: 
      alert(girl + " does not really like you."); 
      break; 

     case 3: 
      alert(girl + " has a crush on you."); 
      break; 

     case 4: 
      alert(girl + " wants you to ask her out."); 
      break; 

     default: 
      console.log(i); 
    } 
} 
Verwandte Themen