- PVSM.RU - https://www.pvsm.ru -
Дело помощи утопающим —
дело рук самих утопающих.
И.Ильф и Е.Петров.
Ошибки ошибкам рознь. Работая над проектом [1], я веду свой личный рейтинг ошибок [2]. Что-то исправляется совсем легко, при первом запуске, что-то намертво прибито гвоздями к архитектуре и потому отравляет жизнь годами. Некоторые ошибки просто вымораживают. Когда их исправляешь — чувствуешь, что живешь. Я люблю такие ошибки.
Всё время писать одинаковые игры было бы не интересно. К счастью, игры разные. Некоторые игры более разные чем другие. Честно говоря, я и берусь то за них, в основном, из за уникальности их игровых механик. Для меня такие игры — своего рода вызов.
MataToa (на доске она похожа на пешку) также перемещается на один шаг, в любом из восьми направлений и может разрушать вражеские «дороги», забирая камни чужого цвета (по пустым полям она, разумеется, также перемещаться может). В остальном, «шахматное взятие» в игре не используется, фигуры с доски убираются совсем по другому. Для снятия с доски фигуры, её необходимо окружить своими камнями таким образом, чтобы она не могла двигаться (очевидно, что поймать MataToa, таким образом, невозможно). Если удалось окружить Moai — игра на этом и заканчивается. С Ariki, последней оставшейся фигурой, дело обстоит по другому.
Ariki — фигура строитель (на доске изображена как ладья), которая бросает те самые «камушки» на доску. Ход выполняется следующим образом: фигура перемещается на любое расстояние по любому из восьми направлений (как шахматный ферзь, только без боя), после чего, производит два «выстрела». Камни также летят на любое расстояние, в любом из восьми направлений. Если удаётся завалить камнями вражескую Ariki, она снимается с доски, но не навсегда. Игрок, которому она принадлежит, может поставить её на доску снова, в один из последующих ходов, но только на первую горизонталь. Пожалуй, это самая удивительная шахматная механика, из тех что я видел.
Всё дело в этих самых «стреляющих» фигурах. Сам по себе «выстрел» кодируется довольно просто, но для того, чтобы появилась возможность «стрелять» два раза подряд, пришлось залезть в ядро [5]. Дело в том, что ещё со времён с Zillions [6], такая последовательность действий трактуется как составной ход, то есть последовательность частичных ходов, выполняемых одной фигурой, а «выстрел» — это, по сути, перемещение той же фигуры на другую позицию. Не на ту, с которой должен выполняться следующий частичный ход (второй «выстрел»). С этим пришлось повозиться.
Поскольку я пока не придумал, как реализовать бота для этой игры, то сделал её в режиме «интеллектуальной доски», контролирующей соблюдение правил, но без игрового AI. Это сыграло со мной злую шутку. Ошибка совершенно никак не проявлялась при ручном управлении фигурами, но стала очевидна, как только я начал делать бота для "Амазонок [7]".
В случае с «Амазонками» я нашёл обходной путь [9] и не стал лазать в ядро, но для Hanga Roa такое решение не подходило. Поскольку бота для игры всё равно не было, я забросил это дело в долгий ящик (и оно продолжало грызть меня изнутри). Так бы и продолжалось, если бы, работая над "Квантовым Моррисом [10]", я не наткнулся на такое вот паскудство:
Проблема усугублялась тем, что ошибка, по всей видимости, проявлялась в зависимости от фаз Луны. Это (а также ряд других случаев) наглядно показало, что пришло время для переписывания кода анимации перемещения фигур, с которого проект практически начинался. Поймите меня правильно, я не ринулся переписывать view [11] сразу. Я убеждал себя в том, что это необходимо, ещё около месяца. И в конце концов, убедил [12]. Код стал проще и понятнее. Попутно, стали более очевидны и другие ошибки, мучившие меня долгое время.
Картинка кликабельна. Полюбуйтесь, как чёрный шарик, завершив ход, превращается в белый (хотя и совсем не должен этого делать). Со старым view он оставался чёрным и ошибка была не так очевидна. На view фигура оставалась чёрной, но управлять ей игрок более не мог (поскольку, в model то она была белой) и это бесило. Строго говоря, это ошибка модели, но к ней (как и к утилите конвертации ZRF-кода в JavaScript) уже и так накопилось много вопросов.
По хорошему, там всё надо переписывать, но я к этому пока морально не готов. Поэтому, я сделал очередной "быстрый фикс [13]" и в Фанорону [14], теперь, можно играть нормально, без сопутствующих чудес. В "Русские шашки [15]", кстати, тоже. Там был баг, связанный с реализацией правила "турецкого удара [16]", неожиданно легко исправленная этим [17] простым фиксом. Так я работаю над ошибками. Так я делаю проект лучше.
Автор: GlukKazan
Источник [18]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/javascript/320184
Ссылки в тексте:
[1] проектом: https://glukkazan.github.io/
[2] рейтинг ошибок: https://github.com/GlukKazan/Dagaz/blob/master/doc/bugs.txt
[3] игра: https://www.chessvariants.com/other.dir/hanga_roa/hanga_roa.html
[4] Шахматами: https://ru.wikipedia.org/wiki/%D0%A8%D0%B0%D1%85%D0%BC%D0%B0%D1%82%D1%8B
[5] ядро: https://github.com/GlukKazan/Dagaz/blob/master/src/debug/kernel/model/zrf-model.js
[6] Zillions: http://www.zillions-of-games.com/
[7] Амазонок: https://glukkazan.github.io/stalemate/amazons.htm
[8] неё: https://en.wikipedia.org/wiki/Ko_shogi
[9] обходной путь: https://github.com/GlukKazan/Dagaz/blob/master/src/debug/games/stalemate/amazons-extension.js
[10] Квантовым Моррисом: https://habr.com/ru/post/276329/
[11] view: https://github.com/GlukKazan/Dagaz/blob/master/src/debug/kernel/view/2d/2d-view-v2.js
[12] убедил: https://github.com/GlukKazan/Dagaz/blob/master/src/debug/kernel/view/2d/2d-view-v4.js
[13] быстрый фикс: https://github.com/GlukKazan/GlukKazan.github.io/commit/085ec9d99ef18bcee0b6323c82ee6d239411a923
[14] Фанорону: https://glukkazan.github.io/checkers-like/fanorona-normal.htm
[15] Русские шашки: https://glukkazan.github.io/checkers/russian-checkers.htm
[16] турецкого удара: https://ru.wikipedia.org/wiki/%D0%A2%D1%83%D1%80%D0%B5%D1%86%D0%BA%D0%B8%D0%B9_%D1%83%D0%B4%D0%B0%D1%80
[17] этим: https://github.com/GlukKazan/Dagaz/commit/69b71322cb87011a367b5768850f99f8eeff0650
[18] Источник: https://habr.com/ru/post/440116/?utm_campaign=440116&utm_source=habrahabr&utm_medium=rss
Нажмите здесь для печати.