Крестики-нолики для новичков в игровой логике с JS.
Одна из лучших вещей во время обучения - это то, что ваш мозг пытается найти место для этой новой информации и понять ее, а также то, как она может быть полезна с тем, что вы уже знаете, вот как это работает для меня, и именно так я пришел к Идея создания игры, потому что в начале моей первой недели чтения материала javascript я прочитал, насколько хороши массивы для хранения данных, связанных с игрой.
Прежде всего я немного объясню, что такое массивы и как они работают на языке программирования javascript.
Массивы
Объект JavaScript Array
- это глобальный объект, который используется при построении массивов; которые представляют собой высокоуровневые объекты в виде списков.
var fruits = ['Apple', 'Banana']; console.log(fruits.length); // 2
var first = fruits[0]; // Apple
Теперь, когда у вас есть эта новая или, может быть, не та новая информация, связанная с массивом, я объясню, какую логику я использовал для создания этой игры.
Хотя для своей игры я использовал html и css UI (пользовательский интерфейс), я приведу общий пример, который работает либо для этого, либо для консольных приложений.
Объявление переменных.
После мозгового штурма я пришел к выводу, что лучший способ сохранить вводимые пользователем данные и обновить игровое поле - это использовать фактическую переменную игрока, которая будет назначаться игроку случайным образом в начале каждой игры и будет обновляться после каждого ввода игрока до тех пор, пока произошла победа или ничья, для которой в начале каждой игры объявляются две дополнительные переменные со значением false.
let winner = false; let draw = false; let actualPlayer = null;
Для игровой доски, основываясь на ранее прочитанном материале, я решил, что для сохранения пользовательского ввода я должен создать 3 массива, каждый из которых имеет длину 3 объявления с пустыми строками, и сохранил эти массивы внутри объектной переменной, если вы внимательно посмотрите эти массивы выглядят как игровая доска в крестики-нолики с легким доступом к горизонтальным значениям, не таким легким доступом к вертикальным и тем, что потребовало немного больше кода, где значения диагональных линий для проверки статуса игры.
let gameArrays = { a:["", "", ""], b:["", "", ""], c:["", "", ""] };
Ввод игроков и проверка победителя.
Теперь вам нужно будет ввести координаты ввода, которые желают пользователи, и изменить это массивы в конкретном месте на фактическую букву пользователя, всегда убедитесь, что вы сообщаете пользователю, кто является фактическим игроком, а также отображаете пользователю представление о том, как выглядит таблица доски. В данный момент.
0 1 2 a [“o”,” “,”o”] b [“ “,”x”,” “] c [“x”,” “,” “]
Игрок сообщит вам, какой массив и индекс вы хотите выбрать, и после проверки того, что в этом индексе нет ни одной буквы желания, вы должны изменить значение этого элемента массива.
Перед проверкой победителя я также подсчитываю количество сделанных ходов на основе объединенной длины всех массивов, если длина равна 9 и нет победителя, ti означает, что игра закончилась ничьей.
Теперь, чтобы проверить победителя, я сначала создал функцию, которая принимает объединенный массив (строку) в качестве аргумента, проверяет, нет ли победителя и если длина массива равна 3, после этого мы разбиваем строку на массив и проверьте, все ли значения массива одинаковы, и если это так, измените значение переменной победителя на истинное, в противном случае оно сделает его ложным.
Для этого мы использовали метод массива every ().
const checkForWinnerArray = (array) => { if(array.length == 3 && winner === false){ winner = array.split('').every(element => element == actualUser); } };
Чтобы найти победителя, я создал переменные, которые будут отправляться через функцию checkForWinnerArray (), пока не будет найден победитель.
Сначала я создал переменную для горизонтальных массивов и проверяю победителя в зависимости от последнего затронутого индекса массива, независимо от массива (a, b, c), мы делаем это, ожидая, что positionMoved var будет чем-то вроде «A2».
// Saving the movement on the object gameArrays[positionMoved[0]][positionMoved[1]] = actualUser; // Checking for winner horizontally based on last game move const lastMoveArrayHor = gameArrays[positionMoved[0]].join(''); checkForWinnerArray(lastMoveArrayHor); // Checking for winner vertically based on last game move const lastMoveArrayVert = Array.from("abc", key => gameArrays[key][positionMoved[1]] ).join(''); checkForWinnerArray(lastMoveArrayVert);
Чтобы создать необходимые массивы для функции проверки победителя, я создал новую вспомогательную функцию, которая должна была принимать целое число в качестве аргумента, а затем на основе этого создать массив и вернуть его для проверки.
Функция создает массив из заданной строки и индекса, затем добавляет еще одно число к индексу, пока не запустится с начальных значений «abc».
const findXarrayValues = (i) => { let valuesString; if(i == 0){ valuesString = Array.from("abc", x => { let value = gameArrays[x][i]; i++; return value; }).join(''); } else { valuesString = Array.from("abc", x => { let value = gameArrays[x][i]; i--; return value; }).join(''); } return valuesString; }
После этого мы можем пойти и проверить, есть ли победитель на этих двух новых массивах, основываясь на диагональных возможностях доски для крестиков-ноликов.
// Checking for diagonal winner from a0 to c2 const arrayAAscending = findXarrayValues(0); checkForWinnerArray(arrayAAscending); // Checking for diagonal winner from a2 to c0 const arrayADescending = findXarrayValues(2); checkForWinnerArray(arrayADescending);
После этого процесса можно проверить, есть ли победитель, ничья или ни один из них, и если ничего не изменилось, мы продолжаем игру и меняем фактического игрока на другого, отличного от фактического, например
const amountOfMoves = findAmountOfMoves(); if (amountOfMoves >= 8 && winner === false){ draw = true; console.log(`Is a draw!!!`) } else if (winner === true) { console.log(`${actualUser} is the winner`) } if(winner === false && draw === false) { actualUser == “x” ? actualUser = “o” : actualUser = “x”; }
Заключение
Это основная попытка объяснить некоторую логику, необходимую для создания структуры игры в крестики-нолики, и то, как я заставил ее работать с ванильным javascript.
Вот пример того, как эта логика воплотилась в жизнь и превратилась в простое веб-приложение.