|
4 / 4 / 0
Регистрация: 13.12.2016
Сообщений: 246
|
|||||||||||||||||||||
ASCII генератор карт в консоле26.01.2018, 12:01. Показов 7472. Ответов 47
Метки нет (Все метки)
Всем привет,пытаюсь написать небольшой генератор карт на С++ , для отображения использую консоль. Планирую перенести всё это дело в Unity. Сейчас есть небольшая программа, генерирующая только комнаты, но теперь проблема появилась такая:
Соединить всё это дело коридорами. Когда комнаты создаются, то я записываю значения в массив( координаты и размеры). После я хочу отсортировать эти данные, но вот тут проблема, как лучше поступить... Может глянет кто, подскажет как лучше сделать? Да, и программа иногда фризится почему-то без ошибок вообще. Либо в процессе, либо еще до начала... Вот код:
Добавлено через 14 минут Модератор, можешь пожалуйста весь код, который я ниже приложу, использовать выше? То есть всё, что выше заменить на этот: А то, я пока уже ошибки в программе нашел, а править нельзя) Спасибо
Теперь проблема, почему-то при маленьких размерах карт, плитки друг на друга наезжают, хотя я проверку делаю, перед тем как их рисовать.. Запустит кто, потестить? При больших картах - такого не наблюдал.
0
|
|||||||||||||||||||||
| 26.01.2018, 12:01 | |
|
Ответы с готовыми решениями:
47
Генератор карт в консоли, с ASCII симолами Вывод мастей карт через ASCII Написать генератор карт для игры «сапёр». |
|
13 / 15 / 5
Регистрация: 16.10.2016
Сообщений: 206
|
|
| 26.01.2018, 12:29 | |
|
Вопрос почему иногда программа перестает работать, даже если нажал не на х а на f?
QtCreator
0
|
|
|
4 / 4 / 0
Регистрация: 13.12.2016
Сообщений: 246
|
|
| 26.01.2018, 12:33 [ТС] | |
|
Вы о чём?
0
|
|
|
13 / 15 / 5
Регистрация: 16.10.2016
Сообщений: 206
|
||||
| 26.01.2018, 12:35 | ||||
|
Добавлено через 43 секунды
0
|
||||
|
4 / 4 / 0
Регистрация: 13.12.2016
Сообщений: 246
|
|
| 26.01.2018, 12:42 [ТС] | |
|
Радостная величина 50 на 50. Меняет местами ширину и высоту.
Добавлено через 2 минуты Я понимаю, что программа не идеал, и нужно продумать все условия ещё, что бы не было фризов, то есть максимальное значение комнат и их габариты, в зависимости от размера карты. Пока что у меня при размерах карты маленьких порядка 10х20 и комнатах равных 5. Происходит накоадывание друг на друга, хотя даже при размерах 60х100 такого не было. Функция, которая проверяет на пересечение - checkTiles() Добавлено через 37 секунд Лол, не "Радостная", а рандомная величина ![]() Добавлено через 1 минуту Я сделал пока только небольшую проверку вначале, но она точно не может предсказать фриз
0
|
|
|
13 / 15 / 5
Регистрация: 16.10.2016
Сообщений: 206
|
|
| 26.01.2018, 12:43 | |
|
Я думаю фриз может происходить из-за бесконечного цикла. Скоре всего где то, там где цикл зависит от рандомной переменной, так как фризится рандомно.
0
|
|
|
4 / 4 / 0
Регистрация: 13.12.2016
Сообщений: 246
|
|
| 26.01.2018, 12:48 [ТС] | |
|
Ну split точно не влияет, так координаты начальные учитывают ширину и высоту. То есть проблема не знаю в чём, я могу прокомментировать любую часть кода, если нужно. Там можно пробовать разные параметры вверху ставить перед запуском
Добавлено через 1 минуту То есть сначала генерируется ширина и высота, в только потом уже в зависимости от этих параметров начинается поиск координат, при которых такую комнату можно построить, Добавлено через 42 секунды Если что, код берите из последнего апдейтв, где я про фризы указал, так я уже наложил туда несколько кодов
0
|
|
|
13 / 15 / 5
Регистрация: 16.10.2016
Сообщений: 206
|
||||||
| 26.01.2018, 13:24 | ||||||
|
Код беру из последнего апдейта.
Если сможете напишете комментарии которые всеми коду, я пока что тоже новичок, а больше вам никто не помогает, так что будем вместе разбираться) Добавлено через 22 минуты Нашел проблему фриза. Фриз происходит при рисовании последней комнаты. Если рандом генерирует комнату, но она не может поместиться, то он не может ее вместить и зависает. Я вижу в вашем коде есть проверка на то если комната не помещается, то он генерирует заново, в ней нужно что-то исправить, посмотрите, я просто в вашем коде пока-что не разобрался Добавлено через 9 минут Нашел проблему почему пересекаются комнаты: В функции checkTile:
0
|
||||||
|
4 / 4 / 0
Регистрация: 13.12.2016
Сообщений: 246
|
|
| 26.01.2018, 13:40 [ТС] | |
|
Ого, спасибо, я вчера ночью писал его, уже видимо совсем про все условия проверки забыл, давайте вместе разбираться) Я сейчас не дома, но как приду - внесу фикс в свой код, и останется провести коридоры между комнат, пока думаю как реализовать это, и да, я перепишу весь код с комментариями для вас и скину, но увы только, как буду дома)
0
|
|
|
13 / 15 / 5
Регистрация: 16.10.2016
Сообщений: 206
|
|
| 26.01.2018, 13:42 | |
|
Всегда рад помочь!))
Буду ждать вашего кода
0
|
|
|
4 / 4 / 0
Регистрация: 13.12.2016
Сообщений: 246
|
|
| 26.01.2018, 13:48 [ТС] | |
|
Ааа, проблема понятна, вчера её не было, только потому, что не было ещё этого символа first
Я его для себя добавил, что различать начальную координаты комнаты) видимо, я добавил это символ в отрисовку, а в исключение забыл) Я сейчас думаю, как же можно все дело соединить между собой... Думал пускать как бы луч, в случайном направлении, и в зависимости о направления отправлю точку брать как одну из четырёх границ (граней комнаты) и от туда на дистанцию равную расстоянию до границ карты пускать. Если пересечение было, то выстроить новый символ по этому пути.., но тогда коридоры будут только прямыми, без букв ""г"Добавлено через 1 минуту Сейчас функция Raycast() только для первой комнаты работает и рисует точку, откуда нужно пускать луч Добавлено через 25 секунд Только код я ещё не запостил вроде (
0
|
|
|
13 / 15 / 5
Регистрация: 16.10.2016
Сообщений: 206
|
|
| 26.01.2018, 13:56 | |
|
не очень понял ваше обьяснения, конечно, но думаю разберемся)
0
|
|
|
4 / 4 / 0
Регистрация: 13.12.2016
Сообщений: 246
|
||||||
| 26.01.2018, 16:45 [ТС] | ||||||
|
Я позже объясню, сейчас комментарии написал, как дома буду - скину
Добавлено через 1 час 59 минут Update: Теперь буду думать как соединить эти комнаты...
0
|
||||||
|
13 / 15 / 5
Регистрация: 16.10.2016
Сообщений: 206
|
||||||||||||||||
| 26.01.2018, 18:53 | ||||||||||||||||
|
Посмотрел ваш код, полностью разобрался, есть моменты которые заинтересосвали:
1. В функции Draw()
2. Функция RayCast(),
Может быть я не правильно понял? ------------------------------------------------------------------------------------------------------------------------------------- Мои улучшения: 1. Улучшил проверку в main, теперь не должно быть фриза из-за бесконечного цикла
0
|
||||||||||||||||
|
4 / 4 / 0
Регистрация: 13.12.2016
Сообщений: 246
|
|
| 26.01.2018, 20:05 [ТС] | |
|
Сейчас гляну, как только комп включу)
Добавлено через 1 час 8 минут 1) два if - только потому, что бы сильно текст вниз не уходил, я перенос делаю после написания двух комнат подряд. Иначе бы список комнат вниз очень сильно уходил и карту почти не видно было бы 2)По поводу rand()%3+1 - я очень сильно запутался с этим, по идеи rand()%a - дает числа от 0 до a. То есть по логике rand()%3 дает от 0 до 3, и смещаем всё на 1? Я не прав? Просто на всех сайтах про rand() так, хотя когда тестил, тоже заметил, что 4 никогда не попадается. 3)Вот про проверку спасибо) Очень выручили с этим условием, еще бы научить программу выставлять минимальные значения, а не выходить из программы,если условие не выполняется) 4) Про коридоры: Было две идеи: От сортировать координаты комнат, а потом последовательно их соединять или же как я пытался, пускать как невидимые лучи на расстояние и если пересечение с комнатой было, то строить путь по этому лучу. Не объясните формулу для проверки программы вначале ?
0
|
|
|
13 / 15 / 5
Регистрация: 16.10.2016
Сообщений: 206
|
|||||||||||
| 26.01.2018, 20:18 | |||||||||||
|
1.Перенос можно сделать проще
2.rand() генерирует число от 0 до RAND_MAX (константа указана в том же файле что и функция rand(), ее значение не помню) Потом мы берём остаток от деления этого числа на 3, Например (11%3=3 остаток 2). Короче считайте чтобы получить число от a до b вам нужна формула
4. На счёт соединений комнат, подумаю как это сделать, может сегодня, может завтра отпишусь. P.S. можем обменяться контактными данными, чтобы учиться вместе, ведь так продуктивнее)
0
|
|||||||||||
|
4 / 4 / 0
Регистрация: 13.12.2016
Сообщений: 246
|
||||||||||||||||
| 26.01.2018, 20:35 [ТС] | ||||||||||||||||
|
Я так понимаю, логичнее всего будет сортировка + как я почитал - графы или очереди реализовать. Только сортировка по Х делать или же по Y? Мне надо слево сверху направо вниз реализовать скорее всего, а дальше уже графы или очереди
P.S Можно обменяться, только чем конкретно?) Skype, или что-то еще? Да, а формулу не подскажете как получили эту?
Я так понимаю, логичнее всего будет сортировка + как я почитал - графы или очереди реализовать. Только сортировка по Х делать или же по Y? Мне надо слево сверху направо вниз реализовать скорее всего, а дальше уже графы или очереди P.S Можно обменяться, только чем конкретно?) Skype, или что-то еще? Да, а формулу не подскажете как получили эту?
У меня проверка была на самый худший случай То есть Число комнат умноженная на площадь комнаты с максимальными габаритами. То есть number*pow(Max,2) - еще ведь для каждый комнаты нужно учесть вокруг свободные клетки, то есть (Max+1)*4?; Я понял почему у вас второе слагаемое такое, только мне кажется Max+2 даже, ведь чтобы обойти вокруг комнату, нужно снести координаты на 1 во все стороны.Как бы так: oooo oxxo oxxo oooo ooooo oxxxo oxxxo oxxxo ooooo Было Max=2; А длина свободного пространства(символ o) уже равна..хммм... (Max+2)*2+Max*2?? Ой запутался... А первое слагаемое это ведь должна быть сама комната? То есть в худшем случае равна number*pow(Max,2); То есть финальная формула: Правда только для квадратов, потому, что для разных длин уже другая формула нужна будет
0
|
||||||||||||||||
|
13 / 15 / 5
Регистрация: 16.10.2016
Сообщений: 206
|
|
| 26.01.2018, 20:42 | |
|
Я ни графы, ни очереди пока что не знаю. Но есть чуток другая идея.
У каждой комнаты может быть или два или один коридора, Бежим по карте сверху вниз и ищем О(начало первой комнаты) потом ищем следующую комнату. Берём рандоиные стороны этих комнат и соединяем. (Над реализацией надо ещё подумать, но зато можно попробовать сделать не только прямые коридоры) Формула: Сначала вычисляю общую площадь которую занимают комнаты: количество комнат * максимальная высота/ширина комнаты * 2(ведь максимально большая комната квадратная), Потом вычисляю количество свободного пространства вокруг каждой комнаты которое должно остаться (в вашем случае вы сделали по 1 клетке с каждой стороны) получается 4 стороны * максимальную длину комнату * количество комнат) Контакты: Viber, telegram - +992987632082, Skype (пока нету но могу зарегистрироваться), Пользуетесь ли вы Slack?
0
|
|
|
4 / 4 / 0
Регистрация: 13.12.2016
Сообщений: 246
|
|
| 26.01.2018, 21:25 [ТС] | |
|
Нет, но сейчас создал, думаю подойдет для этого: alicewithalex.slack.com
Добавлено через 3 минуты Можно, но тогда, раз прямые коридоры, то координаты этих двух комнат, то есть те места, где будет коридор начинаться - должны быть равны. Кстати, координаты "O" Уже есть у меня в массиве Room, только их бы отсортировать... Тогда поиском можно не заниматься, а просто соединять. Можно попробовать, Лишь бы смотрелось внешне это еще, ведь мне это потом в Unity переносить
0
|
|
|
13 / 15 / 5
Регистрация: 16.10.2016
Сообщений: 206
|
|
| 26.01.2018, 21:34 | |
|
Отправьте мне приглашение в ваше рабочее пространство в Slack.
0
|
|
| 26.01.2018, 21:34 | |
|
Помогаю со студенческими работами здесь
20
Генератор карт через структуру (список), странная ошибка, не понимаю в чём дело
Из колоды карт (36 карт) наудачу берут пять карт Сложный проект "Генератор карт для Valve Hammer Editor" В урне 10 белых,3 черных и 5 красных шаров // Из колоды карт,в которой 36 карт Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2.
При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
|
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут.
https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc
Первый документ красиво выглядит, но без схемы.
Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
|
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере".
Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
|
Команды формы и диалоговое окно
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти".
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2.
В качестве источника данных. . .
|
|
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер
Написал заготовку:
dotnet new console --aot -o UrlHandler
var items = args. Split(":");
var tag = items;
var id = items;
var executable = args;. . .
|
Отправка уведомления на почту при создании или изменении элементов справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере типового справочника "Склады" в конфигурации БП3.
Перед реализацией необходимо выполнить настройку системной учетной записи электронной. . .
|
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений.
9TO2GP2bpX4
a42b81fb172ffc12ca589c7898261ccb/
https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/
Слева синяя линия -. . .
|
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. .
Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
|