2015-06-22 4 views
-2

Напишите программу, которая создает строку, представляющую сетку 8 × 8, используя символы новой строки для разделения строк. В каждой позиции сетки есть либо пробел, либо символ «#». Персонажи должны сформировать шахматную доску.Eloquent Javascript: Chessboard

Мой код сохраняет структуру 8 x 8 со всеми хэшами. Может кто-нибудь предложить некоторые советы по редактированию моего кода?

var size = 8; 

var str = ""; 

var altern = false; 
var line = 1; 

while (line <= size) { 
    var character = 1; 
    while (character <= size) { 
     if (altern) { 
      if (character % 2 === 0) { 
       str += "#"; 
       console.log(character); 
       console.log(str); 

      } else { 
       str += " "; 
       console.log(character); 
       console.log(str); 
      } 

     } else { 
      if (character % 2 === 0) { 
       str += " "; 
       console.log(character); 
       console.log(str); 
      } else { 
       str += "#"; 
       console.log(character); 
       console.log(str); 
      } 
     } 

     altern = !altern; 
     character++; 

    } 

    str += "\n"; 
    line++; 
} 

console.log(str); 
+0

Можете ли вы изменить свой вопрос с большим количеством объяснений и меньше кода? Сейчас неясно, о чем вы спрашиваете. –

+0

Вот один лайнер 'if (column-row% 2)% 2' == 0 – Rishav

ответ

1

Используя оба altern и character % 2 выбрать ветвь с # каждой итерации. Используйте только один из двух.

0

Я подозреваю, что вы хотите, чтобы переключить altern с каждой новой линии, а не с каждым площади.

У вас есть петля внутри петли здесь. Переместите ваш altern код переключения из внутреннего цикла во внешний цикл.

while (line <= size) { 
    var character = 1; 
    while (character <= size) { 
     // inner loop code here 
     character++; 
    } 

    // Outer loop end code. HERE is where you toggle altern 
    str += "\n"; 
    line++; 
    altern = !altern; 
} 
0

Ниже приведено несколько работ, но я заменил пространства Os (capital o's) и немного изменил ваш код.

var size = 8; 

var str = ""; 

var altern = false; 
var line = 1; 

while (line <= size) { 
    var character = 1; 
    while (character <= size) { 
     console.log('altern: ' + altern + 'character: ' + character); 
     if (altern) { 
      if (character % 2 === 0) { 
       str += "O"; 
       console.log(character); 
       console.log(str); 

      } else { 
       str += "#"; 
       console.log(character); 
       console.log(str); 
      } 

     } else { 
      if (character % 2 === 0) { 
       str += "O"; 
       console.log(character); 
       console.log(str); 
      } else { 
       str += "#"; 
       console.log(character); 
       console.log(str); 
      } 
     } 

     altern = !altern; 
     character++; 

    } 

    str += "\n"; 
    line++; 
} 

// console.log(str); 
alert(str); 

Это работает, но нет, я предлагаю вам попробовать переписать этот код в лучшем виде. Подсказка: обратите внимание на то, что сказали @koenpeters.

0

Вместо того, чтобы использовать все эти петли вы могли бы сделать это:

var width = 8, 
    height = 8, 
    str = new Array(1 + (width * height + height)/2).join('# ').replace(new RegExp('(.{' + width + '}).', 'g'), '$1\n'); 

работает до тех пор, ширина даже не в то время как в то же время высота нечетное.

Если вам просто нужно для этого один конкретного случая, вы можете также избавиться от немногих накладных расходов и просто использовать это:

var str = new Array(37).join('# ').replace(/(.{8})./g, '$1\n') 
-1

Существенной вещь, чтобы понять, что с учетом N-й строка, его первый квадрат будет черным, если N нечетно, а белый - в противном случае.

Кроме того, если первый квадрат заданного ряда является черным, то для данного столбца M квадрат будет черным, если M нечетным и белым, если M четным.

Аналогично, если первый квадрат белого цвета, то для столбца М, квадрат будет белым, если М нечетны, и черные в противном случае.

Надеюсь, что это поможет.

EDIT:

попробовать это, если вы поклонник нечитаемый код:

for i in range(8): 
    s = '' 
    for j in range(8): 
     if (i - j%2) % 2 == 0: 
      s = s + "#" 
     else: s = s + 'O' 
    print s 
0

Вместо петли в то время как и над повторением ваших дел в зависимости от местоположения (т.е. даже против нечетное) используйте два для циклов и один аргумент case для того, требуется ли местоположение # vs "". Сохраните их в var, а затем распечатайте var, как только он будет завершен.

var board = ""; 
var countX = 0; 
var countY = 0; 
var size = 8; 

for(var i = 0; i < size; i++) { 
    for(var j = 0; j < size; j++) { 
     if((countX + countY) % 2 == 0) { 
      board += " "; 
     } 
     else { 
      board += "#"; 
     } 
     countX++; 
    } 
    board += "\n"; 
    countY++; 
} 
console.log(board); 

выход платы:

# # # # 
# # # # 
# # # # 
# # # # 
# # # # 
# # # # 
# # # # 
# # # # 
Смежные вопросы