- PVSM.RU - https://www.pvsm.ru -

Dagaz: Ошибки

imageДело помощи утопающим —  
дело рук самих утопающих.

И.Ильф и Е.Петров.
 
 
Ошибки ошибкам рознь. Работая над проектом [1], я веду свой личный рейтинг ошибок [2]. Что-то исправляется совсем легко, при первом запуске, что-то намертво прибито гвоздями к архитектуре и потому отравляет жизнь годами. Некоторые ошибки просто вымораживают. Когда их исправляешь — чувствуешь, что живешь. Я люблю такие ошибки.

Всё время писать одинаковые игры было бы не интересно. К счастью, игры разные. Некоторые игры более разные чем другие. Честно говоря, я и берусь то за них, в основном, из за уникальности их игровых механик. Для меня такие игры — своего рода вызов.

Dagaz: Ошибки - 2

Hanga Roa

Эта игра [3] ломает стереотипы и рвёт шаблоны. Не обманывайтесь поверхностным сходством с Шахматами [4]. На Шахматы она совершенно не похожа. Цель игры — провести своего «Короля» (Moai) к противоположному краю доски. Вот только, сам по себе, Moai ходить по доске не умеет. Эта фигура ходит только «по камушкам» (строго своего цвета), перемещаясь на одну соседнюю клетку в любом из восьми направлений (использованный камень с доски убирается). Шаги можно повторять, пока есть такая возможность.

MataToa (на доске она похожа на пешку) также перемещается на один шаг, в любом из восьми направлений и может разрушать вражеские «дороги», забирая камни чужого цвета (по пустым полям она, разумеется, также перемещаться может). В остальном, «шахматное взятие» в игре не используется, фигуры с доски убираются совсем по другому. Для снятия с доски фигуры, её необходимо окружить своими камнями таким образом, чтобы она не могла двигаться (очевидно, что поймать MataToa, таким образом, невозможно). Если удалось окружить Moai — игра на этом и заканчивается. С Ariki, последней оставшейся фигурой, дело обстоит по другому.

Ariki — фигура строитель (на доске изображена как ладья), которая бросает те самые «камушки» на доску. Ход выполняется следующим образом: фигура перемещается на любое расстояние по любому из восьми направлений (как шахматный ферзь, только без боя), после чего, производит два «выстрела». Камни также летят на любое расстояние, в любом из восьми направлений. Если удаётся завалить камнями вражескую Ariki, она снимается с доски, но не навсегда. Игрок, которому она принадлежит, может поставить её на доску снова, в один из последующих ходов, но только на первую горизонталь. Пожалуй, это самая удивительная шахматная механика, из тех что я видел.

Всё дело в этих самых «стреляющих» фигурах. Сам по себе «выстрел» кодируется довольно просто, но для того, чтобы появилась возможность «стрелять» два раза подряд, пришлось залезть в ядро [5]. Дело в том, что ещё со времён с Zillions [6], такая последовательность действий трактуется как составной ход, то есть последовательность частичных ходов, выполняемых одной фигурой, а «выстрел» — это, по сути, перемещение той же фигуры на другую позицию. Не на ту, с которой должен выполняться следующий частичный ход (второй «выстрел»). С этим пришлось повозиться.

Поскольку я пока не придумал, как реализовать бота для этой игры, то сделал её в режиме «интеллектуальной доски», контролирующей соблюдение правил, но без игрового AI. Это сыграло со мной злую шутку. Ошибка совершенно никак не проявлялась при ручном управлении фигурами, но стала очевидна, как только я начал делать бота для "Амазонок [7]".

Строго говоря есть ещё одна игра с похожей механикой

Dagaz: Ошибки - 3


Но для неё [8] я бота тоже не делал. Думаю, вы понимаете почему.

В случае с «Амазонками» я нашёл обходной путь [9] и не стал лазать в ядро, но для Hanga Roa такое решение не подходило. Поскольку бота для игры всё равно не было, я забросил это дело в долгий ящик (и оно продолжало грызть меня изнутри). Так бы и продолжалось, если бы, работая над "Квантовым Моррисом [10]", я не наткнулся на такое вот паскудство:

Dagaz: Ошибки - 4


Проблема усугублялась тем, что ошибка, по всей видимости, проявлялась в зависимости от фаз Луны. Это (а также ряд других случаев) наглядно показало, что пришло время для переписывания кода анимации перемещения фигур, с которого проект практически начинался. Поймите меня правильно, я не ринулся переписывать view [11] сразу. Я убеждал себя в том, что это необходимо, ещё около месяца. И в конце концов, убедил [12]. Код стал проще и понятнее. Попутно, стали более очевидны и другие ошибки, мучившие меня долгое время.

Dagaz: Ошибки - 5


Картинка кликабельна. Полюбуйтесь, как чёрный шарик, завершив ход, превращается в белый (хотя и совсем не должен этого делать). Со старым 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