|
152 / 136 / 29
Регистрация: 02.07.2013
Сообщений: 996
|
|
Генератор лабиринтов02.09.2022, 23:40. Показов 3118. Ответов 38
Здравствуйте, товарищи, вот собственно хочу сделать небольшую демку на WPF по генерации лабиринтов. алгоритмически проблем нет, а вот с тем как правильно все лепить на WPF MVVM есть путаница.
в качестве "заготовки" для генерации лабиринта будет квадратная решетка размера m*n (в идеале настраиваемая). изначально в каждой ячейке по 4 стены, потом по кнопке алгоритм запускается и потом за шаг алгоритма из стартовой ячейки в случайном направлении убираются стены в соседнюю клетку, а те клетки, которые в "Стеке" окрашиваются в какой-то цвет, ну алгоритм сам не особо важен, но в итоге убирания некоторых стенок в клетках получится лабиринт. в итоге имеем демонстрацию работы алгоритма наглядно и по шагам. вот вопросы к знающим: как сделать UniformGrid, размеры которого подстроятся при изменении размеров решетки в текстбоксе (как сделать красиво чтобы не сильно портить MVVM). предположим что при смене размера уже сгенерированное будет сбрасываться и будет чистая квадратная решетка. примерно такое имею ввиду: понимаю как делать "влоб", но результатом доволен не буду, потому подскажите какие классы надо написать и что они будут делать чтобы был MVVM. вообще есть ли что-то на роль "листбокса" для как раз таких целей? можно, конечно сделать одномерный массив и работать с ним, притвояясь что он двумерный, засунуть его в листбокс (ну или ItemsControl) Нужна ли тут использовать модель? мне вообще кажется что нет, можно ли обойтись без нее только вьюшкой и вьюмоделью?
0
|
|
| 02.09.2022, 23:40 | |
|
Ответы с готовыми решениями:
38
Генератор лабиринтов
Генерация лабиринтов в двухмерном массиве |
|
1182 / 624 / 160
Регистрация: 19.04.2018
Сообщений: 2,923
|
|
| 26.09.2022, 04:47 | |
|
golosalex, могу предположить, что если Вы сделаете окно шире, то всё будет как надо.
Мне кажется что последняя колонка не влезла и разбилась в строки.
0
|
|
|
152 / 136 / 29
Регистрация: 02.07.2013
Сообщений: 996
|
|||
| 26.09.2022, 05:10 [ТС] | |||
|
репозиторий: https://github.com/golosalex/l... ee/Develop скрин ошибки: стыдно признаться все работает, это я невнимателен был и написал вместо ModelsRows написал ModelRow и не заметил ошибку. жаль что иногда студия не хочет подсказывать имена свойств... Добавлено через 4 минуты пробовал и так и этак, чего только не посоветуют в интернетах , а студия меня предала и не подсказала мне имя свойства когда я его набирал, похоже ителисенс не будут править для WPF и придется страдать((
0
|
|||
|
Модератор
|
||||
| 26.09.2022, 08:12 | ||||
|
Добавлено через 3 минуты Добавлено через 2 минуты
0
|
||||
|
152 / 136 / 29
Регистрация: 02.07.2013
Сообщений: 996
|
||||
| 26.09.2022, 12:33 [ТС] | ||||
|
0
|
||||
|
Модератор
|
|||
| 26.09.2022, 12:44 | |||
|
В общем случае это имеет отношение к шаблону элемента. А их определение в основном используется в Custom Control. Ему на это (что это можно использовать только в шаблоне элемента) указали в обсуждении и в ответе используется Custom Control. Добавлено через 23 секунды Как появится время.
0
|
|||
|
Модератор
|
||||||||||||||||
| 26.09.2022, 15:09 | ||||||||||||||||
|
Поля хранящие значения свойств по функционалу должны быть инкапсулированы свойствами. То есть нигде в коде кроме тела их свойств к таким полям не следует обращаться. В данном случае это не вызывает логических ошибок, но в другом случае может вызвать. Поэтому лучше сразу отвыкать от "плохих" приёмов кодинга.
В нём же нет никакого функционала. Добавлено через 58 минут По большому счёту здесь напрашивается реализация INPC. Но если хочется сделать кастомное событие, то зачем два раза передавать this? Нужно использовать или просто EventHandler или сделать свой нормальный аргумент события или даже делегат события.Что-то в таком духе:
Достаточно так set => Set(ref _leftWall, value);Добавлено через 5 минут Launcher относится к слою View.И VM никоим образом недолжна о нём что-либо знать. Добавлено через 6 минут golosalex, вы как-то через чур запутано и сложно делает. Чем это вызвано? Такое ТЗ?
0
|
||||||||||||||||
|
152 / 136 / 29
Регистрация: 02.07.2013
Сообщений: 996
|
||||||||
| 26.09.2022, 17:11 [ТС] | ||||||||
я хочу чтобы из модели торчало наружу 2 евента: первый уведомляет, что был создан новый массив из ячеек, а второй будет уведомлять, что какая-то ячейка изменилась и в аргументе евента показывать какая именно ячейка. первое решается тривиально, а вот для второго самое очевидное это сделать эвент изменения ячейки в классе Cell, и подписаться к каждой ячейкой в коллекции и при событии в любой из них вызывать событие в модели. мне показалось удобно вынести этот функционал наружу в отдельный класс, потому как счел это отдельной зоной ответственности. небольшая прослойка, которая объединяет подписку на все ячейки в одну подписку.идея у меня такая: есть модель, из нее наружу торчат публичные свойства и события, которые будут говорить что какие-то свойства поменялись. в моем понимании критерий такой, что можно такой моделью пользоваться из консольного приложения и получить доступ ко всему функционалу без графического UI. в моем случае все получается. единственное что выдает такую модель - это события, подготовленные, чтобы привязаться из view модели (но без этого никуда). при таком подходе можно писать код модели воспринимая приложение как консольное. дальше я где-нибудь в MIRO рисую как примерно будет выглядеть View и верстаю что-то похожее. ну и в последнюю очередь делаю ViewModel. к сожалению МiewModel почти всегда получается похожей на Model и мучает соблазн пробрасывать связь напрямую Model - View, но я решил для себя честно конвертировать похожий объекты из модели во viewmodel даже если можно срезать. ну а зачем я прилепил сбоку лаунчер я уже написал выше. если есть традиции как делать многооконность без него, то с радостью послушаю другие решения. конкретно в этом случае подсказывать отказывается, если научите что хочет от меня дизайнер и студия, то буду рад.
0
|
||||||||
|
Модератор
|
|||||||||||
| 26.09.2022, 20:53 | |||||||||||
|
Если свойство не допускает null, то должна быть такая реализация:
И чем ваше событие лучше типичного и всем известного INPC? По функционалу, если вы ЗАМЕНЯЕТЕ Cell, то извещать об этом это функция коллекции или Модели. Но если вы изменяете СВОЙСТВО Cell. то извещать об этом должна сам объект. Смысла прокидывать событие на уровнь коллекции или Модели нет. Можно, конечно, реализовать в коллекции интерфейс IBindingList, но это сложно и избыточно - WPF всё равно с ним работает только как с INCC коллекции и INPC элементов. Добавлено через 1 час 9 минут И чем ваше событие лучше типичного и всем известного INPC? По функционалу, если вы ЗАМЕНЯЕТЕ Cell, то извещать об этом это функция коллекции или Модели. Но если вы изменяете СВОЙСТВО Cell. то извещать об этом должна сам объект. Смысла прокидывать событие на уровнь коллекции или Модели нет. Можно, конечно, реализовать в коллекции интерфейс IBindingList, но это сложно и избыточно - WPF всё равно с ним работает только как с INCC коллекции и INPC элементов. Можно сделать Cell полноценными "модельками" - для этого достаточно в них добавить реализацию INPC. И после этого можно их использовать вплоть до View. Если хочется инкапсулировать их создание и изменение их свойств, то сделать тогда публичный интерфейс ICell и приватную вложенную реализацию в Модели типа Cell. Всё намного упростится. Но ViewМодель для чего об этом знать? По функционалу - это даже не View, а уровень App. И кроме App о нём никто не должен "знать".
0
|
|||||||||||
|
152 / 136 / 29
Регистрация: 02.07.2013
Сообщений: 996
|
|||
| 26.09.2022, 20:58 [ТС] | |||
|
не думаю что мое событие лучше чем INPC. просто для меня INPC это специфичное событие, сделанное под привязку. думаю могу по примеру игры 2024 повторить подход, но мне мой кажется проще.
0
|
|||
|
Модератор
|
|||
| 26.09.2022, 21:02 | |||
|
Как появится - разберусь поглубже. Добавлено через 2 минуты Вот он пусть и прослушивает изменения свойств Cell.
0
|
|||
|
152 / 136 / 29
Регистрация: 02.07.2013
Сообщений: 996
|
||
| 26.09.2022, 21:05 [ТС] | ||
|
0
|
||
|
Модератор
|
|||||||
| 26.09.2022, 21:10 | |||||||
|
Вот что-то подобное должно быть:
Вы же стремитесь правильную реализацию написать. А в правильной реализации VM должна уметь работать с View любого типа. Даже с Консолью. И как ваша VM будет в консоли окна открывать? Должны быть диалоги которые внедряются в VM при её создании. А что там за логика в диалоге VM знать не нужно. Может окно откроется, а может в файл что-то будет записано/прочитано.
0
|
|||||||
|
152 / 136 / 29
Регистрация: 02.07.2013
Сообщений: 996
|
||
| 26.09.2022, 21:21 [ТС] | ||
![]() теоритическая возможность работать VM с любой View это, конечно, хорошо, но я не находил удобного способа открывать окошки, как View может создать окошко, на основании уже существующей модели(или ее части), которую отделяет аж 2 стены? а потом еще и закрыть его.
0
|
||
|
Модератор
|
||
| 26.09.2022, 21:30 | ||
|
В диалоге уже может быть инкапсулировано создание и открытие окна. Но VM об этом не будет знать. Добавлено через 2 минуты golosalex, я вам советую с учебной целью, для практики разделить все слои приложения по разным проектам. Тогда вам будет проще понять, кто, что и о ком должен "знать". Структура связей в WPF Решении Структура WPF решения Потоки в асинхронном MVVM Структура WPF+БД решения
0
|
||
|
152 / 136 / 29
Регистрация: 02.07.2013
Сообщений: 996
|
|
| 26.09.2022, 21:35 [ТС] | |
|
0
|
|
|
Модератор
|
||
| 26.09.2022, 22:13 | ||
|
Надо поискать. Добавлено через 2 минуты Как правильно в MVVM реализовать сервис диалогов? Добавлено через 1 минуту Для начала освойте сам принцип создания диалогов.
0
|
||
|
Модератор
|
|
| 27.09.2022, 10:33 | |
|
golosalex, давайте подойдём концептуально к решению, раз вы хотите сделать максимально правильную реализацию.
Требования к Модели сформируем в виде её интерфейса. 1) В Модели есть матрица ячеек. Изменять ячейки может только Модель. Соответственно, ячейка доступна только через иммутабельный интерфейс или DTO. Для изменения свойства нужно заменять полностью экземпляр; 2) Для создания матрицы нужен публичный метод с её размерами; 3) Возможно нужен метод для изменения размера матрицы; 4) Нужен метод для изменения ячейки; 5) Событие извещающее о создании (или изменении) матрицы. В параметре события аргумент со свойствами: строк, колонок, список (последовательность) новых ячеек; 6) Событие извещающее о замене ячейки. В параметре изменённая ячейка. Этого достаточно на работы с БЛ Модели? Или ещё что-то надо? Добавлено через 1 минуту Интерфейс Модели (и типов которые он используется) создаётся в отельном проекте. Модель его реализующая будет в другом отдельном проекте.
0
|
|
|
152 / 136 / 29
Регистрация: 02.07.2013
Сообщений: 996
|
|
| 27.09.2022, 19:50 [ТС] | |
|
если делать ячейки иммутабельными и пересоздавать их при изменении любой стенки или внутреннего состояния (входит в стек алгоритма, изолирована или в массиве) то не будет ли лишнего гемора при создании связи от модели ко вью? такой вариант я рассматривал, но отказался в пользу обычных свойств. вообще мне нравиться больше вариант сделать структуру с перечислением всех стенок и вот его уже сделать иммутабельным. как вы и предлагали вначале.
думал сначала доделать реализацию нескольких алгоритмов генерации, подправить верстку, чтоб было покрасивее, а потом взяться за рефакторинг и сделать правильную реализацию, потому как код MVVM (но с некоторыми оговорками) уже чудесным образом работает и все что я делаю в модели корректно отображается в окошке.
0
|
|
|
Модератор
|
||||
| 27.09.2022, 20:11 | ||||
|
Её передача всегда порождает новый экземпляр, поэтому изменение её свойства вне Модели ни как на БЛ влиять не будет. На мой взгляд, всегда лучше сначала Модель "довести до ума".
0
|
||||
| 27.09.2022, 20:11 | |
|
Как написать программу по созданию лабиринтов Как переделать программу для генерации лабиринтов по алгоритму Эллера в WinForms? генератор лабиринтов Генератор лабиринтов Разработать генератор случайных лабиринтов Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык.
Возвращает он вот это:
https:/ / i. **********/ vqBWLe2. png
Нужную строчку в 3й колонке просто выдумал. .
Это. . .
|
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor.
Это. . .
|
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js.
В помощники взял Яндекс-Алису.
Было создано три зала на разные интересы.
исторические и ретро
сериал Хичкок. . .
|
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
|
|
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#.
Название изменил на ColorStep.
Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
|
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами:
- ВидТО (СправочникСсылка. ВидыТО);
- ВидГСМ. . .
|
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала.
Ниже прикреплён. . .
|
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F
Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU.
Опрашиваются регистры. . .
|