2016-03-05 2 views
3

Я студент по веб-разработке, работающий над игрой Tic Tac Toe.проверка вложенных массивов для выигрышной комбинации w/JavaScript/jQuery

Предполагая, что квадраты на доске пронумерованы 1-9, у меня есть массив из трехэлементных массивов, представляющих выигрышные комбинации. Мне нужен способ проверить квадраты каждого игрока, принадлежащие этим комбинациям. Я думаю, что мне понадобятся вложенные петли for, но я не могу заставить его работать. Я испробовал поиск owned для winners и ищу winners для owned.

Любые мысли? Я использую jQuery, но буду счастлив с помощью решения для ванильного JavaScript.

EDITED: для того чтобы быть четким, в Tic Tac Toe порядок winners и порядок перемещения игроков не имеет смысла. В конце типичной игры xOwned может быть [9, 4, 7, 3, 8], и это должно привести к «победе X!». потому что в нем есть [7, 8, 9].

var xOwned = []; 
    var oOwned = []; 
    var winners = [ 
    ["1", "2", "3"], 
    ["4", "5", "6"], 
    ["7", "8", "9"], 
    ["1", "4", "7"], 
    ["2", "5", "8"], 
    ["3", "6", "9"], 
    ["1", "5", "9"], 
    ["7", "8", "9"] 
    ]; 

//when a player clicks on a square the value/number 
//of that square (i.e., 1-9) is pushed into their array. 

var game = { 
    score: function(){ 
    for (var i = 0; i <= xOwned.length; i++) { 
     for (var j = 0; j < 3; j++) { 
     if($.inArray(xOwned[i], winners[j]) !== -1) { 
      victory.html("X wins!"); 
     } 
     } 
    } 
    for (var k = 0; k <= oOwned.length; k++) { 
     for (var l = 0; l < 3; l++) { 
     if($.inArray(oOwned[k], winners[l]) !== -1) { 
      victory.html("O wins!"); 
     } 
     } 
    } 
    } 
}; 
+0

Что такое содержимое 'xOwned' и' oOwned'? –

+0

У нас нет способа узнать, что интерфейс действительно заполняет массивы. – charlietfl

+0

Извините, я не включил всю программу - когда игрок нажимает на квадрат, значение push/number этого квадрата (то есть 1-9) толкается в их массив. –

ответ

2

Хорошо, вам нужно убедиться, что xOwned или oOwned содержит одну из последовательностей в победителях массив и последовательность выигрышей всегда 3 элемента. Это можно было бы сделать так:

for(var i=0; i<winners.length; i++) { 
    // It's only 3 elements do you really need to loop? 
    if (xOwned.indexOf(winners[i][0]) > -1 
     && xOwned.indexOf(winners[i][1]) > -1 
     && xOwned.indexOf(winners[i][2]) > -1) { 
     // x won! 
     break; 
    } else if (oOwned.indexOf(winners[i][0]) > -1 
     && oOwned.indexOf(winners[i][1]) > -1 
     && oOwned.indexOf(winners[i][2]) > -1) { 
     // o won! 
     break; 
    } 
} 

Или меньше кода, но менее ясно:

for(var i=0; i<winners.length; i++) { 
    if (!winners[i].some(function(n) { return xOwned.indexOf(n) < 0; })) { 
     // x won! 
     break; 
    } else if (!winners[i].some(function(n) { return oOwned.indexOf(n) < 0; })) { 
     // o won! 
     break; 
    } 
} 

Ссылка MDN

Хорошо, я попробую объяснить состояние во второй части кода: если нет элементы выигрышной последовательности не находятся в последовательности «ходов» игроков, означает, что все элементы в выигрышной последовательности находятся в последовательности «ходов» игроков, и поэтому игрок выигрывает.

+0

Отредактировано оригинальное сообщение, чтобы быть более четким о роли последовательностей. –

+0

Мой ответ не зависит от порядка – Tomas

+0

Всего рад. Спасибо за помощь. –

1

Предполагая var xOwned = []; имеет три результата, такие как:

var xOwned = ["1","2","3"], 
    oOwned = ["2","2"]; 


score: function() { 
    var _x = xOwned.sort(), 
    _o = oOwned.sort(), 
    xWin = false, 
    oWin = false; 

    winners.forEach(function(i) { 
    var _i = i.sort(); 
    for(var l = 0; l < i.length-1; l++) { 
     xWin = _x[l] === _i[l]; 
     oWin = _o[l] === _i[l]; 
    } 
    }) 
    if(oWin) victory.html("O wins!"); 
    if(xWin) victory.html("X wins!"); 
} 

See fiddle

+0

Игроки перемещаются в странных порядках, и они могут не получить выигрышную комбинацию до тех пор, пока не сыграет последний квадрат на доске. –

+0

Я отредактировал свой ответ, если вам не нужно учитывать порядок ответа игрока – cl3m

+0

Я туман, откуда приходит аргумент 'i'. Должен ли я проходить в «победителях» там (т. Е. Массив массивов)? –

2

Вы можете использовать функцию, которая проверяет каждую выигрышную позицию:

function win(array) { 
 
    return [ 
 
     [1, 2, 3], 
 
     [4, 5, 6], 
 
     [7, 8, 9], 
 
     [1, 4, 7], 
 
     [2, 5, 8], 
 
     [3, 6, 9], 
 
     [1, 5, 9], 
 
     [3, 5, 7] // <-- please change this line to this value! 
 
    ].some(function (a) { 
 
     return a.every(function (b) { 
 
      return ~array.indexOf(b); 
 
     }); 
 
    }); 
 
} 
 

 
document.write(win([1, 4, 7]) + '<br>'); 
 
document.write(win([1, 4, 8]) + '<br>'); 
 
document.write(win([9, 4, 7, 3, 8]) + '<br>');

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