Создание Игры «Крестики-Нолики» С Использованием Typescript, React И Mocha

Представляем вам перевод статьи Джоша Каттлера, опубликованной на blog.bitsrc.io. Узнайте, как создать приложение Tic Tac Toe с помощью React и TypeScript.

Создание игры «Крестики-нолики» с использованием TypeScript, React и Mocha

Простая игра крестики-нолики, созданная по модульному принципу и загружено на сайт Bit .

Вы можете модифицировать компоненты моей игры и тестировать ее онлайн на Bit PlayGround, используя NPM, Yarn или Bit. Для этого перейти в мою коллекцию компонентов .

Когда вы создаете такие игры, как «Крестики-нолики», по модульному принципу, трудно найти причину, по которой компоненты пользовательского интерфейса когда-либо будут использоваться снова.

Поэтому я сосредоточился в основном на игровых утилитах.

Для программирования я выбрал язык TypeScript — код скомпилировал с помощью TypeScript на сайте Bit .

Затем я использовал для тестирования фреймворк Mocha. Чтобы установить компоненты из моего проекта, сначала настройте бит.dev в качестве области реестра (скопируйте и вставьте на свое устройство).

Это следует сделать только один раз! Когда вы продолжите использовать веб-сайт Bit, вам не потребуется его перенастраивать.

  
  
  
  
   

npm config set '@ bit:registry ' https://node.bit.dev

Затем установите компонент с помощью менеджеров пакетов Yarn или NPM:

npm i @bit/joshk.tic-tac-toe-game.game yarn add @bit/joshk.tic-tac-toe-game.game



Игровая составляющая

Компонент «Игра» является основным компонентом моего приложения — он создан с использованием одного компонента Board и двух компонентов.

Прайм Реакт .

Я использовал компоненты Кнопка И Ввод-текст для экрана настроек - вы можете протестировать и посмотреть их код Здесь .



Создание игры «Крестики-нолики» с использованием TypeScript, React и Mocha

Установите компоненты PrimeReact в свой проект:

yarn add @bit/primefaces.primereact.inputtext yarn add @bit/primefaces.primereact.button

После установки параметров можно нажать «Играть» и… играть!

Компонент платы

Компонент Доска создает динамическую таблицу с помощью Props, устанавливает очередь для игроков и определяет победителя.

Вы можете протестировать и посмотреть код Здесь .



Создание игры «Крестики-нолики» с использованием TypeScript, React и Mocha



Квадратный компонент

Компонент «Квадрат» представляет собой обычную ячейку, которая получает значение с необязательным цветом и отправляет событие компоненту «Доска» при изменении значения.

Вы можете протестировать и посмотреть код Здесь .



Создание игры «Крестики-нолики» с использованием TypeScript, React и Mocha



Функция пустой ячейки

Функция Empty cell — это вспомогательная функция для функции Winner-calc, которая проверяет, есть ли пустые ячейки в игровой таблице.

Бит позволяет увидеть документы компонентов и результаты испытаний:

Создание игры «Крестики-нолики» с использованием TypeScript, React и Mocha

Код функции

/** * @description * check if 2d array have an empty cell * @param {{Array.<string[]>}} matrix 2d array * @param {number} rowsNum number of rows * @param {number} colsNum number of columns * @returns {boolean} return true if empty cell was found, and false if not. * @example * import haveEmptyCell from '@bit/joshk.tic-tac-toe-game.utils.have-empty-cell'; * * const matrix = [ * ['X', 'O', 'X'], * ['O', 'X', 'O'], * ['O', 'X', 'O'] * ]; * const result = haveEmptyCell(matrix, 3, 3); * * export default result * @example * import haveEmptyCell from '@bit/joshk.tic-tac-toe-game.utils.have-empty-cell'; * * const matrix = [ * ['X', 'O', 'X'], * ['O', '', 'O'], * ['O', 'X', 'O'] * ]; * const result = haveEmptyCell(matrix, 3, 3); * * export default result * @example * import haveEmptyCell from '@bit/joshk.tic-tac-toe-game.utils.have-empty-cell'; * * const matrix = [ * ['X', 'O', 'X'], * ['O', , 'O'], * ['O', 'X', 'O'] * ]; * const result = haveEmptyCell(matrix, 3, 3); * * export default result * @example * import haveEmptyCell from '@bit/joshk.tic-tac-toe-game.utils.have-empty-cell'; * * const matrix = [ * ['X', 'O', 'X'], * ['O', null, 'O'], * ['O', 'X', 'O'] * ]; * const result = haveEmptyCell(matrix, 3, 3); * * export default result */ function haveEmptyCell(matrix: Array<Array<string>>, rowsNum: number, colsNum: number): boolean { let empty: boolean = false; for (let x = 0; x < rowsNum; x++) { for (let y = 0; y < colsNum; y++) { const element: any = matrix[x][y]; if (!element) { empty = true; break; } } if (empty) break; } return empty; } export default haveEmptyCell



Функция расчета победителя

Расчет победителя — функция, вычисляющая победителя по горизонтальной, вертикальной и диагональной плоскостям.

Бит позволяет увидеть документы компонентов и результаты испытаний:

Создание игры «Крестики-нолики» с использованием TypeScript, React и Mocha

Код функции

/** * @description * check winner horizontal, vertical and diagonal * @param {Array.<string[]>} matrix 2d array with X and O * @param {number} rowsNum number of rows * @param {number} colsNum number of columns * @param {number} numToWin the number of matching to win * @param {number} lastRow the row number of the square player click * @param {number} lastCol the column number of the square player click * @returns {string} return the winner, X or O or '' if no one win. * @example * import winnerCalc from '@bit/joshk.tic-tac-toe-game.utils.winner-calc'; * * const matrix = [ * ['O', 'O', 'X'], * ['O', 'X', ''], * ['X', '', ''] * ]; * const result = winnerCalc(matrix, 3, 3, 3, 0, 2); * * export default result */ import haveEmptyCell from '.

/HaveEmptyCell' function winnerCalc(matrix: Array<Array<string>>, rowsNum: number, colsNum: number, numToWin: number, lastRow: number, lastCol: number): string { let winner: string = ''; let match: number = 0; const lastValue: string = matrix[lastRow][lastCol]; //check Horizontal for (let c = 0; c < colsNum; c++) { let currentValue = matrix[lastRow][c]; if (currentValue === lastValue) match++; else match = 0; if (match === numToWin) { winner = lastValue; break; } } if (winner !== '') return winner; match = 0; //check Vertical for (let r = 0; r < rowsNum; r++) { let currentValue = matrix[r][lastCol]; if (currentValue === lastValue) match++; else match = 0; if (match === numToWin) { winner = lastValue; break; } } if (winner !== '') return winner; //check diagonal top-left to bottom-right - include middle match = 0; for (let r = 0; r <= rowsNum - numToWin; r++) { let rowPosition = r; for (let column = 0; column < colsNum && rowPosition < rowsNum; column++) { const currentValue = matrix[rowPosition][column]; if (currentValue === lastValue) match++; else match = 0; if (match === numToWin) { winner = lastValue; break; } rowPosition++; } if (winner !== '') break; } if (winner !== '') return winner; //check diagonal top-left to bottom-right - after middle match = 0; for (let c = 1; c <= colsNum - numToWin; c++) { let columnPosition = c; for (let row = 0; row < rowsNum && columnPosition < colsNum; row++) { let currentValue = matrix[row][columnPosition]; if (currentValue === lastValue) match++; else match = 0; if (match === numToWin) { winner = lastValue; break; } columnPosition++; } if (winner !== '') break; } if (winner !== '') return winner; //check diagonal bottom-left to top-right - include middle match = 0; for (let r = rowsNum - 1; r >= rowsNum - numToWin - 1; r--) { let rowPosition = r; for (let column = 0; column < colsNum && rowPosition < rowsNum && rowPosition >= 0; column++) { let currentValue = matrix[rowPosition][column]; if (currentValue === lastValue) match++; else match = 0; if (match === numToWin) { winner = lastValue; break; } rowPosition--; } if (winner !== '') break; } if (winner !== '') return winner; //check diagonal bottom-left to top-right - after middle match = 0; for (let c = 1; c < colsNum; c++) { let columnPosition = c; for (let row = rowsNum - 1; row < rowsNum && row >= 0 && columnPosition < colsNum && columnPosition >= 1; row--) { console.log(`[${row}][${columnPosition}]`); let currentValue = matrix[row][columnPosition]; if (currentValue === lastValue) match++; else match = 0; if (match === numToWin) { winner = lastValue; break; } columnPosition++; } if (winner !== '') break; } if (winner !== '') return winner; if(haveEmptyCell(matrix, rowsNum, colsNum) === false) { winner = '-1'; } return winner; } export default winnerCalc

Проект доступен в моей коллекции.

на бите и в моем Репозитории GitHub .

Не стесняйся прокомментируйте эту статью и подпишитесь на мой Твиттер .

Теги: #игры #Разработка игр #программирование #разработка приложений #программирование для начинающих #typescript #react #сделай сам #мокко #новичкам #программирование игр #крестики-нолики

Вместе с данным постом часто просматривают:

Автор Статьи


Зарегистрирован: 2019-12-10 15:07:06
Баллов опыта: 0
Всего постов на сайте: 0
Всего комментарий на сайте: 0
Dima Manisha

Dima Manisha

Эксперт Wmlog. Профессиональный веб-мастер, SEO-специалист, дизайнер, маркетолог и интернет-предприниматель.