На прошлой неделе у меня была возможность поработать с кем-то над улучшением кода, который я написал. Полученный код включал двумерные массивы. В прошлом у меня были проблемы с многомерными массивами, так как я мало ими пользовался, поэтому я обнаружил, что это очень полезный опыт обучения. Это также вдохновило меня на дальнейшую практику, поэтому я пишу базовое руководство о том, как использовать многомерные массивы в javascript для поиска победителя в простой игре в крестики-нолики.
Во-первых, давайте изобразим доску для игры в крестики-нолики:
В крестиках-ноликах есть восемь потенциальных выигрышных комбинаций, состоящих в том, чтобы собрать 3 клетки подряд с вашим маркером (традиционно X или O), играя поперек, вниз или по диагонали.
Итак, выигрышные комбинации:
123 456 789 147 258 369 159 357
Мы можем думать о каждом из них как о собственном массиве:
[1, 2, 3] [4 ,5, 6] [7, 8, 9] [1, 4, 7] [2, 5, 8] [3, 6, 9] [1, 5, 9] [3, 5, 7]
Многомерные массивы являются вложенными массивами. Таким образом, мы можем хранить (и вкладывать) эти выигрышные комбинации в один большой массив, который мы можем позже перебирать, когда проверяем, есть ли победитель:
largeArray = [ [1, 2, 3], [4 ,5, 6], [7, 8, 9], [1, 4, 7], [2, 5, 8], [3, 6, 9], [1, 5, 9], [3, 5, 7] ]
Итак, в чем разница между получением элемента из одномерного массива и двумерного массива?
Что ж, с одномерным массивом вы получаете элемент по его индексу, что просто:
array[i]
С двумерным массивом вы также получаете элемент по его индексу, но у вас есть несколько массивов для просмотра, поэтому вы также будете просматривать несколько индексов. Двумерный массив выглядит так:
largeArray[i][j]
Давайте разберем это…
Часть largeArray[i] — это самый внешний массив (в нашем случае largeArray). Часть [j] массива largeArray[i][j] — это индекс внутреннего (вложенного) массива внутри largeArray.
Предположим, что i = 0 и j = 0, так как мы хотим перебирать массивы с самого начала. Итак, наш массив будет выглядеть так:
largeArray[0][0];
Индекс 0 большого массива — это первый элемент (в данном случае это еще один массив из [1, 2, 3]). Здорово. Вторая часть также просматривает индекс 0, но внутри вложенного массива (а не во внешнем largeArray). Итак, внутри [1, 2, 3]. Первый элемент (индекс [0]) равен «1».
Итак, bigArray[0][0] = «1»!
Помните! Массивы используют индексацию с отсчетом от нуля, поэтому 0 означает, что это первый элемент в этом массиве.
Давайте посмотрим на другой пример. Каким будет bigArray[3][2]?
Разбейте его на части: во-первых, largeArray[3] — это массив из [1, 4, 7].
Далее, что представляет собой элемент с индексом [2] в этом массиве?
Правильно, это 7!
largeArray[3][2] = 7
Теперь, когда мы знаем, как работают многомерные массивы, давайте выясним, как мы можем использовать их, чтобы найти победителя в нашей игре в крестики-нолики.
Я не буду расписывать код всей игры, так как это не является целью данной статьи. Но предположим, что когда игрок решает поместить свой маркер в поле, поле становится либо «X», либо «O» (в зависимости от того, чей сейчас ход). Если на ящике еще нет маркера, ящик пустой/пустой.
После того, как игрок сделал свой ход и поместил свой маркер, запускается функция checkForWinner:
checkForWinner() { for (var i = 0; i <largeArray.length; i++) { x = largeArray[i][0]; y = largeArray[i][1]; z = largeArray[i][2]; if (box[x].marker == box[y].marker) { if (box[y].marker == box[z].marker) { if (box[x].marker != blank) { winner = box[x].marker; } } } } return winner; }
Хорошо, что здесь происходит? Давайте разделим это:
Мы просматриваем наш двумерный массив, просматривая каждую выигрышную комбинацию по одной.
В операторах if мы сначала проверяем, совпадает ли маркер в 1-м поле (largeArray[i][0]) с маркером во 2-м поле (largeArray[i][ 1]). Если это то же самое, он затем проверит, совпадает ли маркер в 1-м поле с маркером в 3-м поле (largeArray[i][2]). Если это так, это означает, что все три ящика из одной из выигрышных комбинаций в нашем массиве largeArray одинаковы, поэтому должен быть победитель, верно?! Не совсем…
Нам нужно убедиться, что ящики не пусты, так как может быть 3 пустых ящика подряд. Поэтому, прежде чем мы объявим победителя, мы проверим, пусто ли первое поле. Если это не так, значит, и двух других ящиков тоже нет (поскольку они все одинаковые, помните?). Так что, если он не пустой и в нем действительно есть маркер, у нас есть три выигрышных комбинации подряд с одним и тем же маркером.
Победитель, победитель ужина с курицей!
Победителем становится игрок, поставивший свой маркер последним (игрок, чей ход в настоящее время наступает, когда функция checkForWinner была запущена после того, как он поместил свой маркер).
В противном случае, если победителя нет, игра продолжается еще один ход.
Спасибо за чтение!
Надеюсь, вы смогли следовать за мной, даже несмотря на то, что у меня не было всей кодовой базы для полной игры в крестики-нолики.
Важно продолжать учиться и совершенствовать свои навыки программиста. Многомерные массивы были моей слабостью, поэтому я хотел лучше понять их и попрактиковаться в их использовании, поскольку знаю, что буду часто сталкиваться с ними в своей карьере.
Ваше здоровье!