2016-04-25 2 views
1

Я новичок в программировании, и мой друг дал мне следующую проблему.Three in a Row Check Bingo

Bingo- дана массив массивов, написать функцию, чтобы проверить, есть ли победитель (либо три СВОИХ подряд по диагонали, прямо вниз и т.д.)

 var bingo = [ 
     [0,0,0], 
     [0,0,0], 
     [0,0,0] 
     ]; 

Я работал в настройте его так.

 function winCheck(bingo) { 
     for (var i = 0; i < bingo[i].length; i++) { 
      if (/* ??????? */) { 
       /*?????*/ 
      } else { 
       /*?????*/ 
      } 
     } 
     } 

Я не уверен, как подойти к этому. Нужен ли цикл в цикле? По моим нынешним знаниям я знаю только, как перебирать один массив. Заранее спасибо.

+0

Матрицы всегда 3x3? – raven

ответ

1

передачи контура в это так много кода, чтобы сделать это так, как вы хочу, поэтому сначала убедитесь: действительно ли это необходимо? Если размер массива изменяется или неизвестен, мы не могли бы сделать любой оптимизации и наша функция будет тоскливо начать с проверки всех горизонтальных линий:

function winCheck(bingo) 
{ 
    // check for all values equals to 1 in any horizontal row: 
    for (var i = 0; i < bingo.length; i++) 
    { 
    winner = true; 

    for(var j=0; j < bingo[i].length; j++) 
    { 
     if(bingo[i][j] != 1) 
     { 
     winner=false; 
     break; 
     } 
    } 

    if(winner) 
     return true; 
    } 

    // now the same code for for vertical rows 
    // . . . 

    // and finally two simple loops to check diagonals 
    // . . . 

    return false; 
} 

Но если размер массива всегда 3 х 3, все меняется ! Мы можем запустить один единый цикл для проверки горизонтальных и вертикальных строк и, наконец, если мы имеем 1 в средней ячейке, сделать дополнительные проверки для диагоналей:

function winCheck(bingo) 
{ 
    var winner = false; 
    for (i=0; i<3; i++) 
    if(winner = (bingo[i][0]==1) && (bingo[i][1]==1) && (bingo[i][2]==1)) 
     break; 
    else if(winner = (bingo[0][i]==1) && (bingo[1][i]==1) && (bingo[2][i]==1)) 
     break; 

    if(!winner) 
    if(bingo[1][1]==1) 
     if(!(winner = (bingo[0][0]==1) && (bingo[2][2]==1))) 
     winner = (bingo[0][2]==1) && (bingo[2][0]==1); 

    return winner; 
} 
+1

Ваш первый код неправильный – raven

+0

@RobertoDeLaParra thanx! сделал исправление – kay27

+1

, если матрица n> 3 по-прежнему ошибочна, основываясь на этом «либо три в ряд по диагонали, прямо вниз и т. д.» Предположим, что это n = 4, и это первая строка: [1,1,1,0] – raven

1

Да, вы можете использовать вложенные циклы для этого, как так

for(var i = 0; i < bingo.length; i++) 
{ 
    for(var j = 0; j < bingo[i].length; j++) 
    { 
     //do some stuff with bingo[i][j] 
    } 
} 

не стесняйтесь спросить, если вам нужна дополнительная помощь на теле