Горячее
Лучшее
Свежее
Подписки
Сообщества
Блоги
Эксперты
Войти
Забыли пароль?
или продолжите с
Создать аккаунт
Регистрируясь, я даю согласие на обработку данных и условия почтовых рассылок.
или
Восстановление пароля
Восстановление пароля
Получить код в Telegram
Войти с Яндекс ID Войти через VK ID
ПромокодыРаботаКурсыРекламаИгрыПополнение Steam
Пикабу Игры +1000 бесплатных онлайн игр Лови знакомую рыбу, открывай новые места и стань мастером рыбалки в сердце России!

Рыбалка по-русски

Казуальные, Симуляторы, На ловкость

Играть

Топ прошлой недели

  • solenakrivetka solenakrivetka 7 постов
  • Animalrescueed Animalrescueed 53 поста
  • ia.panorama ia.panorama 12 постов
Посмотреть весь топ

Лучшие посты недели

Рассылка Пикабу: отправляем самые рейтинговые материалы за 7 дней 🔥

Нажимая «Подписаться», я даю согласие на обработку данных и условия почтовых рассылок.

Спасибо, что подписались!
Пожалуйста, проверьте почту 😊

Помощь Кодекс Пикабу Команда Пикабу Моб. приложение
Правила соцсети О рекомендациях О компании
Промокоды Биг Гик Промокоды Lamoda Промокоды МВидео Промокоды Яндекс Маркет Промокоды Пятерочка Промокоды Aroma Butik Промокоды Яндекс Путешествия Промокоды Яндекс Еда Постила Футбол сегодня
0 просмотренных постов скрыто
4663
dnevteh
dnevteh

Стало известно, что на 90-ом году жизни умер Никлаус Вирт — создатель языка программирования «Паскаль»⁠⁠1

1 год назад
Стало известно, что на 90-ом году жизни умер Никлаус Вирт — создатель языка программирования «Паскаль»

Стало известно, что на 90-ом году жизни умер Никлаус Вирт — создатель языка программирования «Паскаль».

Специалист в области информатики, один из известнейших теоретиков в области разработки языков программирования ушел из жизни 1 января 2024 года в своём доме в окружении семьи и близких.

Дневник технаря

Показать полностью 1
Паскаль Программирование Telegram (ссылка) Личность Некролог
431
6
stalkself
stalkself
Серия Программирую, пока программируется

Немного о создании лабиринтов (Delphi)⁠⁠

1 год назад

Заинтересовался идеей создания двухмерных лабиринтов, после того, как случайно набрел на ресурс https://www.mazegenerator.net/.

Полез изучать тему, нашел интересную статью на Хабре, где расписывались особенности типы и способы создания таких лабиринтов. К сожалению, представленный в ней материал оказался не очень понятным и наглядным, поэтому решил самостоятельно придумать алгоритм, способный быстро создавать лабиринт произвольного размера.

Насколько понял, подавляющее большинство существующих алгоритмов используют принципы рекурсивного поиска, с записью данных в стек, из которого они потом по мере необходимости берутся для возобновления этого самого поиска, в случае, когда трактор (условная машинка, которая грызет проход в монолите) попадает в тупик.

Мне такой подход крайне не понравился, и я придумал алгоритм, который осуществляет поиск таких путей за два прохода матрицы лабиринта. Возможно этот алгоритм уже кем-то придуман, но раньше мне такое на глаза не попадалось, поэтому смело называю его своим именем.

Итак, предлагаю вашему вниманию двухходовый алгоритм stalkself построения идеального прямоугольного лабиринта произвольной формы. Идеальный, в нашем случае означает, что две любых точки лабиринта можно соединить единственным путем. И соответственно к ним относятся точки входа и выхода.

Вот фрагмент получаемого лабиринта.

Важная особенность моего алгоритма – отсутствие привязки к этим точкам, поскольку для идеального лабиринта в любом случае сохраняется возможность найти единственный путь между ними.

Два этапа алгоритма:

Создание пространства путей в матрице за один ее проход

Объединение путей в единственный также за один проход

Программу писал на Паскале, поскольку это лучшее, что придумало человечество (ну или потому, что других языков не знаю), взяв за основу Эмбаркадеровскую Дельфи.

Бросил на форму два TEdit, чтобы указывать в них размерность матрицы лабиринта по Х и по Y. И компонент TImage для отрисовки лабиринта.

В первую очередь указываем тип матрицы:

type

cell = record

group:integer;

r,d:integer;

end;

И наши переменные:

var

form1: Tform1;

count:integer; //счетчик групп

cel:array of array of cell; //массив ячеек

x,y:integer;

Каждая ячейка в массиве cel имеет три поля:

group – номер группы

r и d – правая и нижняя границы соответственно (стенки лабиринта)

Создаем и заполняем массив после нажатия на кнопку:

x:=strtoint(edit1.Text); //Наши значения размера массива из эдитов

y:=strtoint(edit2.Text);

setlength(cel,x+1,y+1); //Задаем размеры массива ячеек с запасом +1, чтобы не возиться с нулевыми индексами

for j := 1 to y do //Заполняем пространство group нолями, а все стенки делаем закрытыми

for i := 1 to x do

begin

cel[i,j].group:=0;

cel[i,j].r:=1;

cel[i,j].d:=1;

end;

Все, теперь можем начинать работу алгоритма

1. Этап - создаем пространство путей, которые будут проложены трактором.

count:=1; // Наш счетчик номеров и количества групп

for j := 1 to y do //Первый проход матрицы по высоте и ширине

for I := 1 to x do

if cel[i,j].group=0 then //Находим пустую клетку и пускаем из нее трактор

begin

track(i,j);

inc(count); //Увеличиваем счетчик, после того, как трактор построил путь

end;

Собственно, код трактора:

procedure tform1.track(x1: Integer; y1: Integer);

var

k,mx,my:integer;

label start;

begin

//Процедура прохода и построения трактором лабиринта

mx:=x1;my:=y1;

cel[mx,my].group:=count; //присваиваем стартовой клетке номер новой группы

start:

k:=random(4)+1; //Случайное направление движения

case k of

1:

if (mx>1) then

if (cel[mx-1,my].group=0) then //Если слева пусто, идем туда и заодно убираем стенку

begin

cel[mx-1,my].r:=0;

cel[mx-1,my].group:=count;

mx:=mx-1;

goto start;

end;

2:

if (mx<x) then //Аналогично остальные направления

if (cel[mx+1,my].group=0) then

begin

cel[mx,my].r:=0;

cel[mx+1,my].group:=count;

mx:=mx+1;

goto start;

end;

3:

if (my>1) then

if (cel[mx,my-1].group=0) then

begin

cel[mx,my-1].d:=0;

cel[mx,my-1].group:=count;

my:=my-1;

goto start;

end;

4:

if (my<y) then

if (cel[mx,my+1].group=0) then

begin

cel[mx,my].d:=0;

cel[mx,my+1].group:=count;

my:=my+1;

goto start;

end;

end;

//Проверяем не тупик ли

if canmove(mx,my) then goto start;

end;

В конце проверка на возможность дальнейшего движения для трактора:

function tform1.canmove(x1: Integer; y1: Integer): LongBool;

begin

//Проверка на возможность хода

result:=false;

if x1>1 then if cel[x1-1,y1].group=0 then

begin

result:=true;exit;

end;

if x1<x then if cel[x1+1,y1].group=0 then

begin

result:=true;exit;

end;

if y1>1 then if cel[x1,y1-1].group=0 then

begin

result:=true;exit;

end;

if y1<y then if cel[x1,y1+1].group=0 then

begin

result:=true;exit;

end;

end;

Все, наше пространство путей готово. Оно будет иметь примерно такой вид:

Соответствующая ему матрица групп:

Как видно из точки S в точку F дойти невозможно, тем не менее у нас уже есть четыре отдельных группы, каждая из которых представляет собой путь, пройденный трактором.

Чем более крупным является лабиринт, тем больше таких путей. Каждый из них является идеальным, поскольку изначально построен так, чтобы исключить вероятность создания петлей и замкнутых областей.

Осталось объединить их в один идеальный путь:

for i:= 1 to x do //Запускаем второй проход матрицы (первая ячейка всегда имеет номер группы 1)

for j:= 1 to y do

begin

if i<x then if cel[i+1,j].group<>1 then //Если находим группу справа от нас отличную от единицы то присоединяем к нашей единичной следующим образом:

begin

cel[i,j].r:=0; //Убираем заодно стенку

del(cel[i+1,j].group,i+1); //Меняем все найденные индексы группы на нашу единицу, для оптимизации процесса делаем это не с начала, а с ряда, где находится наша найденная клетка

end;

if j<y then if cel[i,j+1].group<>1 then //Аналогично смотрим клетку снизу

begin

cel[i,j].d:=0;

del(cel[i,j+1].group,i);

end;

end;

Процедура замены на единички:

procedure tform1.del(x1,x2: Integer); //x1 – наша группа, х2 – точка старта

var

i,j,f:integer;

begin

for i:= x2 to x do

begin

f:=0; //Флаг поиска групп в ряду для оптимизации

for j:= 1 to y do

if cel[i,j].group=x1 then

begin

cel[i,j].group:=1;

f:=1;

end;

if f=0 then exit; //Если не найдено групп в хотя бы в одном ряду, то в оставшихся рядах и искать нет смысла, чтобы не тратить ресурсы ПК

end;

end;

В результате получаем одну группу, которая соединяет все клетки лабиринта в один единственный путь.

Осталось только нарисовать любым доступным способом, например, так:

image1.width:=x*20;

image1.Height:=y*20;

image1.Picture.Bitmap.Width:=x*20;

image1.Picture.Bitmap.Height:=y*20;

with image1.Canvas do

begin

brush.Color:=clwhite;

fillrect(rect(0,0,width,height));

pen.Color:=clblack;

pen.Style:=psSolid;

pen.Width:=2;

Rectangle(1,1,x*20,y*20);

for j := 1 to y do

for i := 1 to x do

begin

moveto(i*20,(j-1)*20);

if cel[i,j].r=1 then lineto(i*20,j*20);

moveto((i-1)*20,j*20);

if cel[i,j].d=1 then lineto(i*20,j*20);

end;

Ну тут и объяснять ничего не надо.

Из особенностей этого алгоритма можно отметить высокую скорость работы – генерация матрицы размером 5000 на 5000 без отрисовки заняла всего 2 минуты, на моем не самом быстром домашнем ПК, а это 25 миллионов ячеек. Генерация 500х500 с отрисовкой – всего 6 секунд!

У меня нет возможности сравнить с другими алгоритмами, но там, в статье как раз на скорость и жаловались. Генерация маленьких лабиринтов – мгновенна. Стандартный размер 200х200 делает как раз за секунду.

Естественно рисовать таким способом большой лабиринт нет смысла – никакой памяти не хватит, можно делать частичную отрисовку на TImage и распечатывать частями. Но для лабиринтов размером до 300-400 ячеек на сторону подходит вполне.

Из недостатков стоит отметить как раз отсутствие привязки к точкам входа и выхода, а значит нет готового решения для тех, кто хотел бы иметь его сразу. Придется брать карандашик в руки и искать его самостоятельно, но в этом же ведь и суть любого лабиринта?

Еще недостаток – на мой взгляд, не слишком высокая сложность, но, если сделать хотя бы 15х15 уже сразу глазом не зацепишься за правильное решение.

Готовую программу выложил на Гитхабе, если кому интересно – можете скачать здесь. Хотелось бы услышать мнение специалистов.

Другие проекты:

Игра в пазлы: https://github.com/stalkself/SuperPuzzleMaster

Показать полностью 3
[моё] Программирование Паскаль Windows IT Программа Delphi Лабиринт Длиннопост
12
SL.Clemens1835

Помощь по информатике⁠⁠

2 года назад

Добрый день други, нужна помощь. Есть тест из 10 вопросов по Паскалю. Я в некоторых уверен, но хотелось бы убедиться, что это так, как я думаю.

  1. Var z: array[1..5, 1..2] of integer;

Укажите вариант ответа, в которых верно использован оператор присваивания.

Выберите один ответ:

z[2,2]:=15.2; z[5,1]:=z[1,2] z[1,4]:=15 z[5]:=17

3 Отметьте вариант ответа, в котором правильно построена операция присваивания для массива A и переменных X и Y

Var x: real;

y: integer;

a: array [2..5] of integer;

Выберите один ответ:

a[3]:=x; x:=a[4]; a[1]:=y; a[4]:=a[0].

7 Найдите значение переменной xпосле выполнения следующего фрагмента программы:

x:=0;

Repeat x:=x+1 Until x<=4;

8 Найдите значение переменной xпосле выполнения следующего фрагмента программы

x:=0;

While x<=4 do x:=x+1;

Мои ответы:

  1. z[5,1]:=z[1,2] (думаю, потому что это двумерный массив).

  2. a[4]:=a[0] (потому что x,a - вещ тип, y - целочисленный, их нельзя приравнивать).

  3. 5

  4. 4

Показать полностью
[моё] Информатика Паскаль Текст
38
SL.Clemens1835

Паскаль⁠⁠

2 года назад

Нужен коллективный разум.

Есть программа, но выдает ошибку, что параметр цикла for должен описываться в заголовке. Подскажите, кто в курсе, как исправить.

[моё] Паскаль Программирование Инфографика Текст
20
stalkself
stalkself
Серия Программирую, пока программируется

Бесполезное⁠⁠

2 года назад

Попался на глаза псто: Бесполезный сайт.

Заинтересовал алгоритм, решил попробовать воссоздать его на Дельфи.

Оказалось, он достаточно прост, не пришлось долго думать.

Ну собственно, получилось такое:

Бесполезное

Скачать, если интересно, можно здесь:

https://disk.yandex.ru/d/TqO3ppfOquhXlQ

Показать полностью 1
[моё] Delphi Паскаль Программирование Алгоритм IT
3
2
stalkself
stalkself
Серия Программирую, пока программируется

Игра на Дельфи - кольца⁠⁠

2 года назад

Попалась как-то на глаза интересная игра - кольца: https://www.min2win.ru/game/koltsa.html

Решил попробовать сделать такую с нуля, используя Дельфи. Собственно результат:

Игра на Дельфи - кольца

Было интересно понять логику разработчиков и сделать аналогичную игру. Сам алгоритм не очень сложный, но в паре моментов пришлось почесать репу и почеркать в тетрадке. Сделал по возможности один в один, но добавил пару свистелок и перделок, плюс алгоритмы у нас получились немного разными. Это первый проект, в котором не использовал ни одного виузального компонента, только девственно чистая форма.

Думаю это был интересный опыт.

Скачать, если интересно, можно здесь: https://disk.yandex.ru/d/3AM_Pbo8mBikEg

Все бесплатно. Никакой рекламы телеграм каналов, донатов и попрошайничества.

Считаю, что творчество должно быть бесплатным и доступным для всех.

Другие мои проекты на Дельфи:

Игра ИнфиниЛуп:

https://disk.yandex.ru/d/qdss12g6u71Z7A

+ предыдущая версия игры (на прохождение 100 уровней):

https://disk.yandex.ru/d/Hf5w_XL00GypyA

Игра "Веселый водопроводчик": https://disk.yandex.ru/d/3onnil49XyTNDQ

Пазлы (есть сохранение, можно создавать пазлы любого размера и формы): https://disk.yandex.ru/d/8RccyBgVWKevgA

Игра 2048: https://disk.yandex.ru/d/3Ks13TA2dDy4ow

Показать полностью 1
[моё] Компьютерные игры Программирование Игры Gamedev Инди игра Разработка Инди Delphi Паскаль
7
LudaVinci23
LudaVinci23
Эзотерика и магия

28 мая⁠⁠

2 года назад

28 мая!
День лаконичности!)

Лаконичность - краткое и ясное выражение мыслей.

Краткость очень хороша в принципе:  и в случае, когда нас понимают, и в случае, когда нас не понимают.)

Однажды Блез Паскаль, середина 17 века (один из основателей математического анализа, теории вероятностей и проективной геометрии, создатель первых образцов счётной техники, автор основного закона гидростатики) написал:
"Это письмо получилось таким длинным потому, что у меня не было времени написать его короче.")

В 1862 году, когда Гюго захотел узнать о том, как публика восприняла только что изданный роман-эпопея "Отверженные", то послал издателю телеграмму с одним-единственным символом: "?"

Издатель ответил также: "!"

Пожалуй, это самая короткая в мире переписка.

Вот и сегодня день, когда можно и полезно  быть кратким!

Луна  в Деве!
"Краткость - сестра таланта!"
Хороши оздоровительные процедуры.
Можно добиться успеха, хоть и не в полной мере, но явно в сторону улучшений!

Счастливое число  - 2200
Парадный цвет  -  черно-белый
Волшебное слово - краткость
Счастливый символ - !

Этикетка дня:
Необходимо ли уметь коротко говорить о длинных вещах?)

Показать полностью
[моё] Прогноз Эзотерика Виктор Гюго Паскаль Краткость Лаконичность Успех Мистика Текст
6
20
VerhovniyMemolog
VerhovniyMemolog
Twitter

Это большая честь⁠⁠

2 года назад

Телеграм - Три мема внутривенно

Это большая честь
Показать полностью 1
Юмор Скриншот X (Twitter) Актеры и актрисы Педро Паскаль Паскаль Языки программирования
13
Посты не найдены
О нас
О Пикабу Контакты Реклама Сообщить об ошибке Сообщить о нарушении законодательства Отзывы и предложения Новости Пикабу Мобильное приложение RSS
Информация
Помощь Кодекс Пикабу Команда Пикабу Конфиденциальность Правила соцсети О рекомендациях О компании
Наши проекты
Блоги Работа Промокоды Игры Курсы
Партнёры
Промокоды Биг Гик Промокоды Lamoda Промокоды Мвидео Промокоды Яндекс Маркет Промокоды Пятерочка Промокоды Aroma Butik Промокоды Яндекс Путешествия Промокоды Яндекс Еда Постила Футбол сегодня
На информационном ресурсе Pikabu.ru применяются рекомендательные технологии