Я не буду делать требование, что это является эффективным методом наиболее, но это уменьшает количество операций, значительно по сравнению с &&
цепочки и нескольких in_array()
вызовов.
Что мы будем делать, так это сохранить двумерный массив возможных комбинаций выигрышей: строк, столбцов, диагоналей, в качестве подматриц. Затем в цикле foreach
над этим 2D-массивом проверьте текущее состояние массива пользователя на комбинацию строк с помощью array_intersect()
. Если вся выигрышная комбинация присутствует в массиве пользователя, результат array_intersect()
будет равен 3, которые вы можете проверить с помощью count()
.
Поскольку одного матча достаточно для победы, вы можете выйти из цикла в первом матче, чтобы объявить победу.
$combinations = array(
// Rows
array(0,1,2),
array(3,4,5),
array(6,7,8),
// Columns
array(0,3,6),
array(1,4,7),
array(2,5,8),
// Diagonals
array(0,4,8),
array(2,4,6),
);
// Loop over the array of winners and test array_intersect()
// If 3 values intersect, the full win combination was matched
foreach ($combinations as $combination) {
if (count(array_intersect($combination, $user)) == 3) {
// User wins! Take whatever action necessary...
// Exit the loop
break;
}
}
Вот демонстрация, в которой 2 из 3 комплекта для $user
являются победителями: http://codepad.viper-7.com/Mvu0wa
Есть алгоритмические способы получения выигрышных комбинаций, а не жесткого кодирования их, но есть только восемь возможных комбинаций так это не так сложно, и здесь нужно использовать array_intersect()
, чтобы найти подмножество текущих мест размещения пользователя.
Вы можете использовать [ 'array_intersect()'] (http://php.net/manual/en/function.array-intersect.php), чтобы сравнить массив, представляющий строку '[0,1, 2] 'с массивом пользователя и проверить вывод пересечения имеет' count() == 3', что означает, что все 3 были сопоставлены. Среди обширного набора PHP [функции массива] (http://php.net/manual/en/ref.array.php) есть много способов, которые могут быть использованы так, чтобы удовлетворить ваши потребности так или иначе. Вы планируете сохранить список возможных значений, составляющих строку (простое), или вы хотите, чтобы эти алгоритмы были определены алгоритмически (немного сложнее)? –
Это может быть интересно: http://www.ocf.berkeley.edu/~yosenl/extras/alphabeta/alphabeta.html –
Для tic-tac-toe я бы выбрал работу с двумерной матрицей aka array , заполненное тремя возможными значениями 0 (незанятое пространство), 1 (x) и -1 (o), а затем подсчитывает суммы для строк, столбцов и диагоналей. –