2016-03-26 13 views
1

Ich versuche, Javascript zu verstehen, aber ich kann nicht sehen, warum nicht diese Arbeit als eine verschachtelte Schleife für eine Schachbrettaufgabe in Javascript eloquent Buch erwähnt würde funktionieren. Ich kenne die Lösung und wie es geht, aber ich frage mich nur, warum der unten gezeigte Code nicht funktioniert. Wenn jemand es erklären könnte. Was ich von diesem Code erwartet habe ist, ein Schachbrett zu machen, aber es gibt offensichtlich falsch aus. Also brauche ich auch keine Lösung für ein Schachbrett, nur eine Erklärung, warum das nicht funktioniert. Ich habe erwartet, dass, var board, wird mit leeren Felder gefüllt werden, wenn zuerst if-Anweisung wahr war, und wenn das falsch ist, wird es erhalten # zusätzlich, bis var x ist 9, und die Anweisung x% (width-1) == 0 wird wahr, es kommt in neue Zeile. Aber die Ausgabe ist nicht wie erwartet. Dies ist der Code:geschachtelt für Schleife Javascript Schachbrett

 var height = 8; 
    var width = 10; 
    var board = ""; 

    for (var y = 0; y < height; y++) { 
     for (var x = 0; x < width; x++) { 
     if ((x + y) % 2 == 0){ 
      board += " "; 
     } 
     else if(x%(width-1) == 0){ 
      board += "\n"; 
     } 
     else{ 
      board += "#"; 
      } 
     } 
    } 

    console.log(board); 

Antwort

1

Ihr Problem ist, dass beide (x + y)% 2 == 0 und x% (width - 1) == 0 (oder einfacher, x == width - 1) kann gleichzeitig gelten, also welche Zustandsprüfung sollte Vorrang vor der anderen haben?

ZB

wenn x == 9 und y == 7, dann

(9 + 7)% 2 == 0

Also, sollten Sie x gegen seine Breite gebunden testen zuerst für Ihre gewünschte Ausgabe; Das würde ich stattdessen versuchen:

for (var y = 0; y < height; y++) { 
    for (var x = 0; x < width; x++) 
    { 
    if (x == width - 1) { 
     board += "\n"; 
    } else if ((x + y) % 2 == 0){ 
     board += " "; 
    } 
    else { 
     board += "#"; 
    } 
    } 
} 
+0

Ja, so offensichtlich und ich habe es immer noch vermisst. Vielen Dank! – Marco

3

Sie können es als eine verschachtelte Schleife tun, aber der Grund für die fehlerhafte Ausgabe ist, weil Ihre Logik fehlerhaft ist.

Grund 1: Sie erhalten tatsächlich x% (width-1) === 0, wenn x ebenfalls 0 ist (der initialisierte Zustand), so dass dies zweimal pro innere Schleife auslöst.

Grund 2: für jeden ungeraden Wert, der auch an einem Punkt kommen würde, wo x% (Breite-1) === 0 (was wiederum zweimal pro innere Schleife passiert) wo normalerweise ein '#' wäre jetzt ein ‚\ n‘

ist

wenn Sie dieses Problem beheben, indem Sie stattdessen diese else if-Anweisung zu ändern zu:

if(x%(width-1) === 0 && x>0){ 
    board += "\n"; 
} 

und es auf den letzten Teil der inneren Schleife bewegt, wird dies funktionieren. Allerdings bin ich ein Fan davon, die '\ n'-Ergänzung stattdessen in die äußere Schleife zu verschieben, und dann müssen Sie sich über diese Logik überhaupt keine Sorgen machen. Wenn Sie sich Sorgen um ein Newline nicht vor dem Schachbrett erscheinen (oder nach, je nachdem wie man es Code), dann können Sie eine y> 0 Scheck für die Newline zusätzlich zu tun:

var height = 8; 
var width = 10; 
var board = ""; 

for (var y = 0; y < height; y++) { 
    if(y>0) board += "\n"; 
    for (var x = 0; x < width; x++) { 
     if ((x + y) % 2 == 0){ 
      board += " "; 
     } else { 
      board += "#"; 
     } 
    } 
} 

console.log(board); 
Verwandte Themen