Исходник программы, показывающей пример создания пазла про сожженные спички, в котором нужно получить необходимое количество сожженных сегментов в каждом столбце и строке.
Инструкции к головоломке
Сетка содержит спички разной длины, которые могут быть полностью несгоревшими или полностью сожженными. Спички горят с головы (закругленный конец) до хвоста, не пропуская сегменты. Числа по краям сетки указывает количество сгоревших сегментов в соответствующей строке или столбце. Необходимо заштриховать сгоревшие сегменты так, чтобы сопоставились исходные числа.
Рисование спичек
Я решил нарисовать совпадения на холсте элемента управления TImage. Оказалось, что это было нечто большее, чем я думал изначально. Метод Ellipse рисует совпадающую головку с большой осью на несколько пикселей шире, чем второстепенная ось. Конечно, ориентация большой оси зависит от ориентации спички. Затем нам нужно провести две параллельные линии для части спичечной палочки между спичечной головкой и краем ячейки. Внутренние сегменты рисуются как параллельные линии по всей ширине или высоте каждой ячейки. Последний сегмент имеет укороченные линии краев и еще одну закрывающую линию через конец. Все линии нарисованы с использованием методов холста Moveto и Lineto. Я использую метод Floodfill, чтобы раскрасить сегменты как сгоревшие или несгоревшие, поэтому было важно, чтобы границы ячеек оставались видимыми, чтобы отмечать концы сегментов. Это также означало стирание небольшого кусочка спичечной головки там, где она встречается с палкой, чтобы Floodfill мог заполнить обе части. Если бы я начинал сначала, я бы попытался сначала нарисовать спички целиком, а затем нарисовать линии сетки поверх них, чтобы разграничить сегменты.
Обработка пользовательских кликов
Действия, предпринимаемые, когда пользователь щелкает ячейку, зависят от того, записан ли сегмент. Если не сгорел, я использую Floodfill, чтобы «сжечь» все сегменты обратно до спичечной головки (Headseg = True), используя оттенок коричневого. Если Burned, я "снимаю прожиг" все сегменты между текущей ячейкой и LastSeg совпадения, используя белый цвет кисти. Выход из события TImage OnMouseUp дает нам координаты мыши X и Y в пикселях относительно левого верхнего угла сетки. Разделение значений X и Y на вычисленную переменную Cellsize изначально дает координаты столбца и строки для индексации в массив MatchSegs. Это дает нам статус сожженной ячейки. Оттуда фактическое увеличение / уменьшение столбца или строки зависит от направления совпадения и от того, сжигается ли совпадение или нет. На то, чтобы все это заработало, потребовалось несколько часов.