Я большой поклонник шахмат, и, когда этот учебный курс по программированию подходит к концу, я хотел посмотреть, смогу ли я использовать свои навыки для создания шахматной игры для двух игроков с использованием веб-сокетов. Чем масштабнее становилась программа, тем больше я осознавал, насколько важны были организация и структура. Я создал класс доски, который имеет 2D-массив строк и столбцов. Я создал класс для каждого предмета, который наследуется от класса предмета. Внутри каждого квадрата находится объект-ячейка со значениями, такими как row, col и piece. Атрибут кусок содержит экземпляр кусок.
Чтобы элемент мог изменять экземпляр платы, я установил массив платы в статическую переменную класса Board. Я использовал метод get в экземпляре платы, который указывает на эту статическую переменную. Затем я создал метод в классе частей, который изменяет эту статическую переменную.
Первым серьезным препятствием было, когда мне нужно было передать доску от клиента к серверу и обратно к клиенту. Я узнал, что экземпляры классов существуют в браузере и не могут быть переданы на сервер. Чтобы решить эту проблему, я решил, что будет разумнее передать объект, содержащий строку начального и посадочного квадратов перемещаемой фигуры. Перед передачей перемещение проверяется на стороне клиента, затем после проверки передается на сервер и отправляется обратно клиентам. Как только данные для хода получены через веб-узел на стороне клиента, фигура перемещается на доску.
Условия победы и ничьей были следующим большим препятствием, с которым я столкнулся. Мне нужно было найти способ выяснить, когда король находится под шахом. Я создал функцию, которая перебирает каждую фигуру на доске и отмечает квадраты, на которые она нацелена. Эти отмеченные квадраты были сохранены в массиве экземпляра доски. Каждый раз, когда король сидел на поле, на которое нацелена фигура противника, этот игрок находился под шахом.
Я работаю над этим проектом уже две недели, и, хотя я доволен достигнутым прогрессом, предстоит еще много работы. Все ходы для каждой фигуры и логика проверки работают, но мне все еще нужно написать код для таких ходов, как рокировка, продвижение пешки и мат / ничья. Чтобы компьютер знал о безвыходной ситуации, каждую фигуру нужно было бы перебрать и переместить на абстрактную доску вне поля зрения для каждого возможного хода, который он мог бы сделать. Если каждый ход ставит этого игрока под шах, то возникает безвыходная ситуация. Если король игроков находился под шахом и у него нет возможности вывести его из-под шаха, то это будет мат.
Развернутое приложение: https://play-me-chess.herokuapp.com/