2015-12-13 3 views
0

У меня есть следующий тест многомерный массив, который отражает стандартный Connect Four: игрового поляJavascript - Connect Four игра проверки

var board = [['-','-','-','-','-','-','-'], 
      ['-','-','-','-','-','-','-'], 
      ['-','-','-','R','R','R','R'], 
      ['-','-','-','Y','Y','R','Y'], 
      ['-','-','-','Y','R','Y','Y'], 
      ['-','-','Y','Y','R','R','R']]; 

Я пишу проверки Js, который проверяет каждый элемент массива доски для 4- в любом виде, либо вниз, либо по диагонали. Глядя на тестовую панель выше, мой валидатор должен вернуть R в качестве правильного ответа, так как в третьем ряду есть соединительное соответствие 4 R элементов. Вот мой код:

function fourTogether(a,b,c,d) { 
    return (a != '-') && (a == b) && (a == c) && (a == d); 
} 

function connectFour(board) { 
    // check RIGHT 
    for (row=col=0; row<3 && col<7; row++, col++) { 
     if (fourTogether(board[row][col], board[row+1][col], board[row+2][col], board[row+3][col])) { 
     return board[row][col]; 
     } 
    } 
    // check DOWN  
    for (row=col= 0; row<6 && col<4; row++, col++) { 
     if (fourTogether(board[row][col], board[row][col+1], board[row][col+2], board[row][col+3])) { 
     return board[row][col]; 
     } 
    }  
    // check DIAGONAL to RIGHT 
    for (row=col=0; row<3 && col<4; row++, col++) { 
     if (fourTogether(board[row][col], board[row+1][col+1], board[row+2][col+2], board[row+3][col+3])) { 
      return board[row][col]; 
     } 
    } 
    // check DIAGONAL to LEFT 
    for (row=3, col=0; row<6 && col<4; row++, col++) { 
     if (fourTogether(board[row][col], board[row-1][col+1], board[row-2][col+2], board[row-3][col+3])) { 
     return board[row][col]; 
     } 
    } 
    return board.indexOf('-') > -1 ? 'in progress' : 'draw'; 
} 

Так что я в основном с помощью функции fourTogether установить 4-в своем роде соответствия, а также опуская '-' элементы (которые представляют собой незаполненные boardslots). Затем в функции connectFour я использую четыре разных цикла FOR для итерации по всему массиву в зависимости от отмеченного направления, затем добавляю оператор IF, который проверяет функцию fourTogether на добавочные элементы платы. Наконец, в конце есть тройное утверждение, которое должно возвращать либо «ничью», либо «игру в процессе», если на доске нет 4-х видов соответствия, в зависимости от наличия пустых '-' плацдармов. К сожалению, я возвращаю undefined, и я немного не понимаю, где именно код не работает. Любая помощь или указатели были бы очень оценены.

+0

'SyntaxError: Неожиданный маркер возврата (...)' , переместите свой 'return' перед тернарный оператор в конце функции. Кроме того, 'fourTogether' не имеет оператора возврата –

+1

Я уверен, что те, для циклов, не делают то, что вы ожидаете. – James

+0

спасибо Пол.У меня было заявление о возвращении в моих четырех словах, я ошибочно опущен здесь. Я отредактировал соответственно. – dpg5000

ответ

1

для петель, такие как:

for (row=col=0; row<3 && col<7; row++, col++) { 

Переберет (0,0),(1,1),(2,2). То, что вы хотите, - (0,0),(0,1),(0,2),...,(1,0),(1,1),(1,2),.... Для этого вы должны использовать вложенные петли:

for (row = 0; row<3; row++) { 
    for (col = 0; col<7; col++) { 
     // do that check 
    } 
} 
+0

Спасибо. Я предполагаю, что я переусердствовал, пытаясь включить в строку 'for' инструкцию строки и строки, специфичные для столбцов. Спасибо также за то, что именно было повторено в обоих случаях. – dpg5000

1

Используйте две вложенные петли и проверьте каждое из четырех направлений, если вам нужно.

var board = [['-','-','-','-','-','-','-'], 
 
      ['-','-','-','-','-','-','-'], 
 
      ['-','-','-','R','R','R','R'], 
 
      ['-','-','-','Y','Y','R','Y'], 
 
      ['-','-','-','Y','R','Y','Y'], 
 
      ['-','-','Y','Y','R','R','R']]; 
 

 
function fourTogether(a,b,c,d) { 
 
    return (a != '-') && (a == b) && (a == c) && (a == d); 
 
} 
 

 
function connectFour(board) { 
 
    var bl = board.length, bw = board[0].length; 
 

 
    // loop through the whole board once not a bunch of times 
 
    for (var row = 0; row < bl; row++) { 
 
    for (var col = 0; col < bw; col++) { 
 
     var sq = board[row][col]; 
 
     
 
     // check right if we have to 
 
     if (col < bw - 3 && 
 
      fourTogether(sq, board[row][col+1], board[row][col+2], board[row][col+3])) { 
 
     return sq; 
 
     } 
 
     // check down if we have to 
 
     if (row < bl - 3 && 
 
      fourTogether(sq, board[row+1][col], board[row+2][col], board[row+3][col])) { 
 
     return sq; 
 
     } 
 
     // down right 
 
     if (row < bl - 3 && col < bw - 3 && 
 
      fourTogether(sq, board[row+1][col+1], board[row+2][col+2], board[row+3][col+3])) { 
 
     return sq; 
 
     } 
 
     // down left 
 
     if (row < bl - 3 && col > 2 && 
 
      fourTogether(sq, board[row+1][col-1], board[row+2][col-2], board[row+3][col-3])) { 
 
     return sq; 
 
     } 
 
    }  
 
    } 
 
    //board.indexOf('-') > -1 ? return 'in progress' : return 'draw'; //????? 
 
    return "no winner"; 
 
} 
 
alert(connectFour(board));

+0

действительно приятное решение, и избавился от тонны ненужных циклов – dpg5000

1

Я бы решить эту проблему немного по-другому к вам ..

Сначала установите функции легко получить линии для тестирования

function row(board, i) { 
    return board[i].join(''); 
} 
function col(board, j) { 
    return board.map(e => e[j]).join(''); 
} 
function diagDown(board, i) { 
    return board.map((e, j) => e[i - board.length + j] || '').join(''); 
} 
function diagUp(board, i) { 
    return board.slice(0).reverse().map((e, j) => e[i - board.length + j] || '').join(''); 
} 

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

Теперь перебрать действительные линии

function whoWon(board) { 
    var i, s, r = 'RRRR', y = 'YYYY'; 
    // rows 
    for (i = 0; i < board.length; ++i) { 
     s = row(board, i); 
     if (s.indexOf(r)) return 'R'; 
     if (s.indexOf(y)) return 'Y'; 
    } 
    // cols 
    for (i = 0; i < board[0].length; ++i) { 
     s = col(board, i); 
     if (s.indexOf(r)) return 'R'; 
     if (s.indexOf(y)) return 'Y'; 
    } 
    // diagonals 
    for (i = 4; i <= board.length + board[0].length - 4; ++i) { 
     s = diagDown(board, i); 
     if (s.indexOf(r)) return 'R'; 
     if (s.indexOf(y)) return 'Y'; 
     s = diagUp(board, i); 
     if (s.indexOf(r)) return 'R'; 
     if (s.indexOf(y)) return 'Y'; 
    } 
    return '-'; 
} 

Теперь у

whoWon(board); // "R" 

Также отметим

function isDraw(board) { 
    return board[0].every(e => e !== '-'); 
} 
Смежные вопросы