2016-03-26 25 views
1

Javascript'i anlamaya çalışıyorum ama bunun neden javascript'in güzel kitabında bahsedilen satranç tahtası görevi için iç içe bir döngü olarak işe yaramayacağını göremiyorum. Çözümü ve nasıl yapılacağını biliyorum, ancak aşağıda gösterilen kodun neden çalışmadığını merak ediyorum. Birisi bunu açıklayabilirse. Bu koddan yapmak için beklediğim şey, bir satranç tahtası yapmaktır, ama açıkça yanlış çıkıyor. Yani, yine bir satranç tahtası için bir çözüme ihtiyacım yok, sadece bunun neden çalışmadığına dair bir açıklama. Bunu beklediğimde, var tahta, ilk ifadenin doğru olması durumunda boş alanlarla doldurulacak ve bu yanlış ise, ek olarak, var x 9 ve x% (width-1) ifadesine kadar == 0 doğru olur, yeni satıra girer. Ama çıktı beklendiği gibi değil. Bu kodu verilmiştir:loop javascript için yuvalanmış satranç tahtası

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

cevap

1

Sizin sorun olduğunu hem (x + y)% 2 == 0 ve x% (genişlik - 1) == 0 (veya daha basit, x == genişlik - 1) aynı anda doğru tutabilir, bu durumda hangi koşul kontrolünün diğerine göre önceliği olmalıdır?

Örneğin,

X == 9 ve Y == 7,

(9 + 7)% 2 == 0

Yani, genişliği bağlı karşı x test etmek gerekiyorsa İstediğiniz çıktı için ilk; Bunun yerine, bunu denerdim, bunun yerine:

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

Evet, çok açık ve hala bunu özlüyorum. Teşekkür ederim! – Marco

3

Sen iç içe geçmiş bir döngü olarak bunu yapabilir, ama mantık kusurlu olduğu için yanlış çıkış için nedenidir.

sebep 1: Aslında x% 0 olduğunda (başlangıç ​​durumu) x% (width-1) === 0 olsun, bu da iç döngü başına iki kez tetikler.

reason 2: normalde bir "#" olduğunda burada x% (width-1) === 0 (yine her bir iç döngüde iki kere olur) noktasında da gelebilecek her garip değer için size deyimi ise bunun yerine başka değiştirerek bu sorunu gidermek Eğer şimdi bir '\ n'

geçerli:

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

ve iç döngü son bölümünde taşıyarak, bu işe yarar. Bununla birlikte, ben '\ n' eklemini dış döngüde hareket ettirmenin bir hayranıyım ve o zaman bu mantık hakkında endişelenmenize gerek yok. Eğer bir satır (bunu kod şekline göre, sonra ya) satranç tahtası önce görünmemesi konusunda endişe duyuyorsanız o zaman yeni satır eklenmesine ay> 0 onay yapabilirsiniz:

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