
В начале было поле. И было на поле 64 клетки. Мы начинаем «МикроШахматы на JavaScript». Цель курса — запрограммировать все правила игры в шахматы. На выходе мы получим скрипт для игры в шахматы для двух игроков, с соблюдением всех правил.
На этом уроке мы выведем на экран доску, используя JavaScript и HTML. В каждом уроке кроме видео есть фото-инструкция по изменению кода. Задания, отмеченные звездочками, выполнять необязательно. Но они помогут вам выполнить работу на более высоком профессиональном уровне.
Самостоятельное задание:
Посмотреть видео и понять идею.
Создать файл chess.html.
Добавить два парных тега div и присвоить им id.
Добавить парный тег script и добавить функцию show_map.
Открыть файл chess.html в любом браузере и проверить его работу.
Сделать скриншот кода chess.html и результата в окне браузера.
* Сделать доску крупнее и раскрасить клетки.
** Проставить координаты клеток.
На этом уроке мы увеличим клетки нашей доски так, чтобы они были одинаковыми в любой ситуации. Уберём зазор между клетками. Также мы раскрасим доску по в соответствии с правилам игры — правая нижняя клетка должна быть светлой. Добавим координаты слева и снизу доски, и для полноты картины добавим заголовок.
Самостоятельное задание:
Сделать рамку тоньше и убрать зазор между клетками.
Добавить размер по ширине и высоте для клеток.
Правильно раскрасить клетки шахматной доски.
Добавить координаты слева и снизу.
Добавить заголовок.
Протестировать результат в браузере.
Приложить скриншот с кодом и результатом.
* Использовать стили для оформления таблицы.
На этом уроке мы отобразим «шахматные» буквы на доске. Для этого мы создадим массив, заполним его буквами,
которые кодируют фигуры по нотации FEN и сделаем их отображение в таблице.
Самостоятельное задание:
Создать функцию init_map() для инициализации массива фигур.
Добавить буквы в массив по необходимым координатам.
Добавить центровку фигур на доске.
Отобразить фигуры на доске.
Проверить результат в браузере.
Приложить скриншот результата и кода.
На этом уроке наши фигуры обретут свой облик. Для этого нам потребуется вспомогательная функция figure_to_html(), которая будет возвращать облик нужной нам фигуры в формате HTML-Unicode. Поиграем с размером и цветом фигур.
Самостоятельное задание:
Добавить функцию figure_to_html().
Добавить все фигуры в формате HTML-Unicode в функцию figure_to_html().
Использовать функцию figure_to_html() при генерации доски.
Сделать фигуры на доске крупнее.
Добавить возможность смены цвета фигур.
Убрать слово info под шахматной доской.
Проверить результат в браузере.
Приложить скриншоты результата и кода.
На этом уроке мы будем отмечать, какими фигурами можно ходить и куда можно ходить. Сначала реализуем простое правило: можно ходить на пустую клетку или клетку врага. Для этого мы добавим ещё один массив inf для хранения возможных ходов выбранной фигуры. Также мы доработаем функцию show_map () так, чтобы она отображала подсказки из массива inf.
Самостоятельное задание:
Создать массив inf.
Создать функцию init_inf() и добавить тестовые данные.
Доработать функцию show_map() для отображения подсказок.
Вызвать init_inf() после init_map().
Проверить результат в браузере.
Приложить скриншоты результата и кода.
* Предложить свой вариант подсветки возможных ходов.
На прошлом уроке мы статично отобразили выбранную фигуру и поля, куда эта фигура может пойти. Теперь наша задача реализовать это программно. Для этого нам понадобится переменная для хранения цвета хода и реализуем функции: mark_moves_from(), can_move_from() и get_color(). Протестируем результат изменив цвет хода.
Самостоятельное задание:
Добавить переменную move_color для хранения цвета хода.
Реализовать функцию mark_moves_from().
Реализовать функцию can_move_from().
Реализовать функцию get_color().
Приложить скриншоты результата и кода.
На этом уроке мы реализуем выбор фигуры для хода через клик левой кнопкой мышки по нужной клетке. Для этого мы сформируем вызов функции click_box() с координатами клетки, по которой было нажато.
Также нам понадобятся дополнительные функции:
click_box_from() и click_box_to() для реализации перемещения: откуда и куда мы хотим пойти выбранной фигурой.
Для подсветки полей мы напишем функции mark_moves_to() и вспомогательную для неё функцию can_move_to().
Самостоятельное задание:
Добавить функцию onclick ко всем клеткам нашей доски.
Реализовать функцию click_box().
Реализовать функцию click_box_from().
Реализовать функцию mark_moves_to().
Реализовать функцию can_move_to().
Добавить заглушку для функции click_box_to().
Приложить скриншоты результата и кода.
На этом уроке мы напишем:
функцию click_box_to() для движения фигуры в указанную клетку - нужно будет поменять место фигуры в матрице map;
функцию turn_move() для передачи права хода.
Самостоятельное задание:
Реализовать функцию click_box_to().
Реализовать функцию turn_move().
Реализовать функцию start().
Приложить скриншоты результата и кода.
* Разыграть партию и записать видео нужно в следующем уроке.
На этом уроке мы создадим функцию, которая будет проверять, может ли фигура выполнить ход так, как её попросят: то есть, реализовать алгоритмы передвижения для каждой фигуры.
Самостоятельное задание:
Создать функцию can_move().
Создать заглушку для фунции is_correct_move().
Добавить в функцию mark_moves_from() проверку can_move().
* Реализовать алгоритм is_correct_move().
Приложить скриншоты результата и кода.
На этом уроке мы реализуем функцию is_correct_move() и добавим в неё проверку всех возможных фигур. Также добавим заглушки корректности хода для каждой фигуры. Протестируем функции, найдём ошибку в коде и исправим её.
Самостоятельное задание:
Реализовать функцию is_correct_move().
Реализовать функцию is_king() и заглушку is_correct_king_move().
Реализовать функцию is_queen() и заглушку is_correct_queen_move().
Реализовать функцию is_bishop() и заглушку is_correct_bishop_move().
Реализовать функцию is_knight() и заглушку is_correct_knight_move().
Реализовать функцию is_rook() и заглушку is_correct_rook_move().
Реализовать функцию is_pawn() и заглушку is_correct_pawn_move().
* Напишите в отчёте сложность функций от 1 (простая) до 6 (сложная).
Протестировать, найти и исправить ошибку в коде.
Приложить скриншот кода и результата тестирования.
На этом уроке мы реализуем самую простую функцию:
is_correct_knight_move() — конь ходит буквой Г :)
Хакерский вариант для проверки корректности хода коня:
if (Math.abs((sx — dx) * (sy — dy)) ==2)
Самостоятельное задание:
Реализовать функцию is_correct_knight_move().
* Реализовать функцию is_correct_king_move().
Приложить скриншоты результата и кода.
На этом уроке мы реализуем функцию is_correct_king_move(), а потом немного повеселимся. Увидим самый быстрый мат и отрывок из к/ф "Джентльмены удачи".
Самостоятельное задание:
Посмотреть видео.
Реализовать функцию is_correct_king_move().
* Реализовать оставшиеся функции is_correct_*_move().
Приложить скриншот с результатом и кодом.
На этом уроке мы реализуем функцию:
is_correct_rook_move()
Ладья ходит по вертикали или горизонтали.
Самостоятельное задание:
Реализовать функцию is_correct_rook_move().
* Дописать функцию is_correct_rook_move().
Приложить скриншот с результатом и кодом.
На этом уроке мы доработаем функцию is_correct_rook_move(). Добавим проверку, находится ли кто-то на пути фигуры. Также мы добавим функцию on_map() для проверки нахождения координат в пределах доски.
Самостоятельное задание:
Оптимизировать проверку движения is_correct_rook_move().
Добавить в функцию is_correct_rook_move() проверку на преграды.
Реализовать функцию on_map().
Приложить скриншот с результатом и кодом.
На этом уроке мы реализуем функцию: is_correct_bishop_move(). Она будет похожа на is_correct_rook_move(), но с небольшими изменениями. Также оптимизируем циклы, добавим проверку границ доски. Добавим функцию is_empty(), которая будет проверять доступность хода на эту клетку.
Самостоятельное задание:
Оптимизировать функцию is_correct_rook_move().
Реализовать функцию is_correct_bishop_move().
Реализовать функцию is_empty().
Доработать функции can_move_from() и can_move_to().
Приложить скриншот с результатом и кодом.
На этом уроке мы ещё раз скопируем алгоритм проверки хода в функцию is_correct_queen_move(). С третьей попытки мы догадаемся вообще убрать проверку на корректность значений delta_x/delta_y. Ваше задание — предложить свой вариант выделения общего алгоритма из эти трёх функций — is_correct_move_queen/bishop/rook().
Самостоятельное задание:
Добавить функцию is_correct_queen_move().
Предложить свой вариант выделения общего алгоритма из эти трёх функций.
Приложить скриншот с результатом и кодом.
На этом уроке мы порефакторим наш код, выделив общий алгоритм из трёх функций: is_correct_move_queen/bishop/rook().
Самостоятельное задание:
Оптимизировать функции is_correct_*_move().
Вынесли общий код в функцию is_correct_line_move().
Реализовать функции is_correct_*_delta().
Приложить скриншот с результатом и кодом.
На этом уроке мы поговорим о пешках:
чем она отличается от других фигур?
какие у неё правила?
какие у неё исключения?
Мы реализуем функцию is_correct_pawn_move() и заглушки для вспомогательных функций: is_correct_white_pawn_move() и is_correct_black_pawn_move().
Лирическое задание — найти/нарисовать интересную картинку о пешках.
Самостоятельное задание:
Реализовать функцию is_correct_pawn_move().
Реализовать функции is_correct_*_pawn_move().
Написать любую поговорку/историю/анекдот про пешек
* Написать псевдоалгоритм для белой и чёрной пешек.
** Нарисовать блок схему.
Приложить красивую картинку на тему пешек.
На этом уроке мы воспользуемся сайтом draw.io для рисования схемы алгоритма пешки.
На схеме отобразим следующие правила для пешек:
направление зависит от цвета;
положение может быть на горизонталях 1-6;
могут ходить только прямо и только на одну клетку;
с 1/6 горизонтали могут ходить на две клетки через пустую;
рубят наискосок на одно поле вперёд-влево/вправо;
могут рубить на битое поле (взятие на проходе);
на последней линии превращается в слона/коня/ладью/ферзя своего цвета.
Превращение пешки будет реализовано в функции завершения хода box_click_to().
Блок схему сделал Ефим (см. ссылку внизу):
Самостоятельное задание:
Нарисовать блок-схему алгоритма пешки.
Приложить скриншот схемы.
На этом уроке мы реализуем часть алгоритма для функции is_correct_white_pawn_move() на основе схемы, созданной на прошлом уроке. Добавим заглушку для функции is_pawn_passant().
Самостоятельное задание:
Реализовать функцию is_correct_white_pawn_move().
Добавить заглушку для функции is_pawn_passant().
Приложить скриншоты результата и кода.
На этом уроке мы доработаем алгоритм для функции is_correct_white_pawn_move() на основе блок-схемы, которую мы также подкорректируем.
Самостоятельное задание:
Доработать функцию is_correct_white_pawn_move().
Доработать блок-схему алгоритма пешки.
Приложить скриншот исправленной блок-схемы.
На этом уроке мы реализуем алгоритм взятия фигуры на проходе. Для этого мы доработаем ранее созданную заглушку is_pawn_passant(). Добавим вспомогательные переменные для хранения координат возможного взятия на проходе — они нам пригодятся на следующем уроке.
Самостоятельное задание:
Доработать функцию is_pawn_passant().
Приложить скриншоты результата и кода.
* Описать своими словами алгоритм взятия фигуры на проходе.
Куда торопимся?
— Почему превышаем?
— Покажите ваши координатики...
— Пройдёмте, пешечка, в отделение...
На этом уроке мы доработаем функцию click_box_to(), добавив проверку прыгнула ли пешка через клетку. Если прыгнула, то мы сохраняем координаты, по которым её можно поймать. Вынесем написанный алгоритм в отдельную функцию check_pawn_attack() . После чего мы уберём пешку противника в отделение для сбитых фигур.
Примечание:
На 262 строчке ошибка, Её нужно записать так:
if (Math.abs (to_y — move_from_y) == 2)
Увидеть ошибку в работе можно, добавив в функцию show_info строчку:
html += "Pawn: " + pawn_attack_x + pawn_attack_y;
и походить пешками. Спасибо 11589.Ефиму (ссылка на аккаунт - внизу).
Самостоятельное задание:
Доработать функцию click_box_to().
Выделить код проверки в отдельную функцию check_pawn_attack().
Добавить удаление пешки врага при взятии на проходе.
Приложить скриншоты результата и кода.
На этом уроке мы реализуем правила движения чёрных пешек по аналогии с белыми.
Для начала мы перенесём общую проверку из функций is_correct_*_pawn_move() в функцию is_correct_pawn_move().
Доработаем функцию is_pawn_passant().
Объединим функции is_correct_*_pawn_move() в общую функцию is_correct_sign_pawn_move().
Самостоятельное задание:
Доработать функцию is_correct_pawn_move().
Доработать функцию is_pawn_passant().
Реализовать общую функцию is_correct_sign_pawn_move().
Удалить устаревшие функции is_correct_white_pawn_move() и is_correct_black_pawn_move().
* Напишите плюсы и минусы подобного объединения функций в одну.
Приложить скриншоты результата и кода.
На этом уроке мы исправим ошибку в функции click_box_to() таким образом, чтобы чёрные пешки тоже могли съедать после взятия на проходе. После чего мы перенесём рабочий код в функцию check_pawn_attack().
Посмотреть первый мультфильм про проходную пешку из видео по ссылке внизу урока.
Самостоятельное задание:
Исправить ошибку в функции click_box_to().
Перенести исправленный код в функцию check_pawn_attack().
Посмотреть мультфильм про проходную пешку.
Написать вывод из мультфильма.
На этом уроке мы реализуем алгоритм превращения пешки. Для этого нам понадобится новая функция promote_pawn(). Выбор фигуры реализуем через функцию prompt(). Добавим проверку, чтобы можно было выбирать только разрешённые фигуры. Доработаем функцию click_box_to() — добавим вызов превращения пешки если это необходимо.
Посмотрите видео (ссылка внизу) о том, как можно проиграть партию, если забыть превратить пешку в ферзя (первый сюжет)
Самостоятельное задание:
Доработать функцию click_box_to().
Реализовать функцию promote_pawn().
Приложить скриншоты результата и кода.
** Реализовать свой способ превращения фигуры.
На этом уроке мы реализуем функцию is_check() так, чтобы король не ходил на клетку, находящуюся под боем. На время теста мы уберём все пешки и добавим функцию is_check() , определив в ней генерируемую случайность шаха для всех фигур на поле.
Самостоятельное задание:
Доработать can_move().
Добавить функцию is_check().
Приложить скриншоты результата и кода.
Объяснить своими словами, почему не все ходы доступны.
На этом уроке мы опишем псевдокод для функции is_check(). Добавим две глобальных переменных: move_figure и to_figure. Также добавим функции: move_figure() и back_figure(). Модернизируем функции click_box_to() и promote_pawn() для поддержки новой системы передвижения фигур по доске.
Самостоятельное задание:
Добавить псевдокод в функцию is_check().
Добавить функции move_figure() и back_figure().
Модернизировать функции click_box_to() и promote_pawn().
Приложить скриншоты результата и кода.
На этом уроке мы добавим в функцию is_check() вызов move_figure() и back_figure(). Реализуем вспомогательную функцию find_figure() и поэкспериментируем.
Самостоятельное задание:
Добавить вызов move_figure() и back_figure() в функцию is_check().
Реализовать функцию find_figure().
Протестировать работу новых функций.
Напишите ваше отношение к нестандартным ситуациям.
Приложить скриншоты результата и кода.
На этом уроке мы продолжим дорабатывать функцию is_check(). Переберём все ходы противника, чтобы исключить из возможных ходов короля клетки, находящиеся под боем.
Самостоятельное задание:
Доработать функцию is_check().
Приложить скриншоты результата и кода.
* Какова сложность алгоритма функции is_check()?
На этом уроке мы выделим часть кода из функции is_check() в новую функцию: is_check_after_move(), которая будет вызываться для проверки возможности хода. Сама же функция is_check() останется независимой и сможет вызываться тогда, когда нам будет нужно.
Самостоятельное задание:
Модифицировать функцию is_check().
Реализовать функцию is_check_after_move().
Приложить скриншоты результата и кода.
На этом уроке мы выведем информацию о текущем состоянии игры. Для этого мы реализуем функцию show_info(), которая будет вызываться при каждой генерации доски. Также нам надо будет реализовать вспомогательные функции: is_checkmate() и is_stalemate(). Доработаем функцию mark_moves_from() для подсчёта количества возможных ходов текущего игрока. Оптимизируем определение очерёдности хода.
Самостоятельное задание:
Реализовать функцию show_info().
Реализовать функции is_checkmate() и is_stalemate().
Доработать функцию mark_moves_from().
Оптимизировать определение очерёдности хода.
Приложить скриншоты результата и кода.
На этом уроке мы добавим проверку на пешечный подвиг по спасению короля: может ли она взять на проходе вражескую пешку, которая угрожает королю шахом. Для этого вынесем проверку взятия на проходе в отдельную функцию move_pawn_attack(). Для корректной работы кода нам понадобится ещё одна функция back_pawn_attack().
Что произойдёт, если пешке доверить власть? Посмотрите красочный мультфильм об этом (ссылка внизу)
Самостоятельное задание:
Реализовать функцию move_pawn_attack().
Реализовать функцию back_pawn_attack().
Модифицировать функциии check_pawn_attack(), move_figure() и back_figure().
Приложить скриншоты результата и кода.
Посмотреть мультфильм.
Быстро сказка сказывается, не быстро дело делается. Наша программа практически завершена, осталось самую малость — научить короля прятаться за ладьёй. Это таинство называется "рокировка".
На этом уроке мы обсудим правила рокировки короля. Также обсудим необходимы действия для её совершения. Найти интересную картинку на тему рокировки.
В "живых" шахматах есть два правила рокировки:
рокировку нужно делать одной рукой;
сначала нужно перемещать короля.
Если противник нарушил первое правило, можно потребовать зачисление поражения противнику. Если противник нарушил второе правило — можно потребовать, чтобы противник пошёл только ладьёй.
Посмотрите видео о том, как гроссмейстеры нарушают оба правила.
Самостоятельное задание:
Составить псевдоалгоритм.
Найти/нарисовать картинку о рокировке и приложить.
* Составить блок схему и приложить к отчёту.
На этом уроке мы:
создадим 4 глобальных флага — can_white_castle_left, can_white_castle_right, can_black_castle_left, can_black_castle_right.
Реализуем вспомогательную функцию update_castle_flags().
Самостоятельное задание:
Добавить четыре флага — can_white/black_castle_left/right.
Реализовать функцию update_castle_flags().
Модифицировать функцию click_box_to().
Приложить скриншоты результата и кода.
На этом уроке мы добавим проверку для короля, может ли он сделать рокировку — can_castle(). Добавим заглушки для вспомогательных функций can_white_castle() и can_black_castle().
Самостоятельное задание:
Реализовать функцию can_castle().
Реализовать функции can_white/black_castle().
Приложить скриншоты результата и кода.
На этом уроке мы доработаем функцию can_castle(), добавив проверку на шах, и оптимизируем is_check().
Самостоятельное задание:
Доработать функцию can_castle().
Оптимизировать функцию is_check().
Приложить скриншоты результата и кода.
На этом уроке мы отрефакторим функцию can_castle(), добавив заглушки вспомогательных функций can_white/black_cl/cr().
Самостоятельное задание:
Отрефакторить функцию can_castle().
Добавить заглушки функций can_white/black_cl/cr().
Приложить скриншоты результата и кода.
На этом уроке мы реализуем функции can_white/black_cl/cr().
Самостоятельное задание:
Реализовать функции can_white/black_cl/cr().
Приложить скриншоты результата и кода.
На этом уроке мы реализуем функцию move_castling_rook() так, чтобы при рокировке наши ладьи тоже перемещались.
Самостоятельное задание:
Реализовать функцию move_castling_rook().
Приложить скриншоты результата и кода.
На этом уроке мы реализуем функцию mark_attack() так, чтобы отображать все битые поля на шахматной доске. То есть те поля, которые могут быть атакованы противником сразу после вашего хода. Доработаем функцию show_map() для отображения полей.
Самостоятельное задание:
Реализовать функцию mark_attack().
Доработать функцию show_map().
Приложить скриншоты результата и кода.
На этом уроке мы реализуем функцию doRandMove(), для случайного выбора фигуры, которой можно сделать ход. Также столкнём два "рандомайзера" на шахматной доске.
Самостоятельное задание:
Реализовать функцию doRandMove().
Победить бота или столкнуть их между собой.
* Назвать функцию в едином стиле с другими функциями: do_rand_move ().
* Сделать так, чтобы компьютер сам ходил за чёрных.
* Записать видео, как вы обыграли рандомайзера.
*** Написать функцию для оценки позиции и сделать выбор лучшего хода.
На этом курсе мы создадим на JavaScript алгоритмы для игры в Шахматы.
Создадим пользовательский интерфейс на HTML и запустим игру на телефонев браузере.
Мы напишем алгоритмы генерации и проверки ходов по всем шахматным правилам.
Все занятия практические - повторяй и получай, всё подробно и поэтапно.
Этот курс - прелюдия более крупного проекта "Шахматы по сети на C#",
в котором создаётся клиент-серверная программа для игры через Интернет.
На этом курсе мы создадим на JavaScript алгоритмы для игры в Шахматы.
Создадим пользовательский интерфейс на HTML и запустим игру на телефонев браузере.
Мы напишем алгоритмы генерации и проверки ходов по всем шахматным правилам.
Все занятия практические - повторяй и получай, всё подробно и поэтапно.
Этот курс - прелюдия более крупного проекта "Шахматы по сети на C#",
в котором создаётся клиент-серверная программа для игры через Интернет.
На этом курсе мы создадим на JavaScript алгоритмы для игры в Шахматы.
Создадим пользовательский интерфейс на HTML и запустим игру на телефонев браузере.
Мы напишем алгоритмы генерации и проверки ходов по всем шахматным правилам.
Все занятия практические - повторяй и получай, всё подробно и поэтапно.
Этот курс - прелюдия более крупного проекта "Шахматы по сети на C#",
в котором создаётся клиент-серверная программа для игры через Интернет.
На этом курсе мы создадим на JavaScript алгоритмы для игры в Шахматы.
Создадим пользовательский интерфейс на HTML и запустим игру на телефонев браузере.
Мы напишем алгоритмы генерации и проверки ходов по всем шахматным правилам.
Все занятия практические - повторяй и получай, всё подробно и поэтапно.
Этот курс - прелюдия более крупного проекта "Шахматы по сети на C#",
в котором создаётся клиент-серверная программа для игры через Интернет.