Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.93/15: Рейтинг темы: голосов - 15, средняя оценка - 4.93
2 / 2 / 0
Регистрация: 22.09.2012
Сообщений: 202
1

Игра "Лабиринт". Отделить логику от интерфейса

15.01.2013, 10:01. Показов 3089. Ответов 17
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Привет всем, извините за возможно глупый вопрос, но что значит отделить логику от интерфейса. Пишу игру лабиринт, компьютер должен найти кратчайший путь. Я так понимаю, что необходимо создать отдельный класс -Алгоритм решения, еще один класс который будет рисовать на поле формы. Из главной формы буду передавать размеры лабиринта в класс вычисления, в котором будет один public метод который вернет массив, содержащий путь в класс отрисовки. Еще мне нужно сохранять игру, открывать, на это тоже наверно нужен класс? Я думаю сохранять текущий массив на поле в файл, а когда открывать его отрисовывать. Может быть совсем неправильно рассуждаю, подскажите как лучше сделать. Заранее спасибо
0
15.01.2013, 10:01
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
15.01.2013, 10:01
Ответы с готовыми решениями:

Игра лабиринт. ИИ в лабиринте. Как задать лабиринт
У меня есть следующее задание: Дано: - робот - лабиринт Задание: - Нужно реализовать искусственный интеллект для робота,...

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

Как правильно отделить логику от вида
Есть таблица в БД состоящая из четырех столбцов н.п. ID SURNAME NAME PHONE 1 Петров Петя 1111 2 Иванов Вова 2222 ...

17
Автор FAQ
Автор FAQ
 Аватар для Rockedit
1803 / 615 / 37
Регистрация: 22.12.2009
Сообщений: 1,544
15.01.2013, 14:41 2
Здравствуйте!
Я думаю сохранять текущий массив на поле в файл, а когда открывать его отрисовывать
Я думаю, вам поможет - "Сериализация"
отделить логику от интерфейса
Хороший пример этому технология - "WPF".

Класс - представляет собой одну сушность.
К примеру - игровое поле это отдельный класс.
Элемент поля(клетка), если он сложный - тоже отдельный класс
Игрок - отдельный класс
Всю логику , не связанную с полем и игроком - например действия противника, если такой имеется - тоже оформить в класс.

Я думаю смысл понятен)
1
Эксперт .NET
 Аватар для kolorotur
17798 / 12949 / 3381
Регистрация: 17.09.2011
Сообщений: 21,236
15.01.2013, 15:06 3
Цитата Сообщение от Kreativ Посмотреть сообщение
что значит отделить логику от интерфейса
Это значит, что можно взять весь код, который выполняет основную задачу - поиск пути в лабиринте, перенести его в консольное приложение, абсолютно ничего в нем не меняя, и он будет там работать точно так же, только вместо графического отображения пути в консоль будет вывод, например, "налево-направо-прямо".
1
2 / 2 / 0
Регистрация: 22.09.2012
Сообщений: 202
15.01.2013, 15:18  [ТС] 4
в принципе разобрался, по ходу написания если вопросы возникнут, то еще отпишусь, спасибо
0
Администратор
Эксперт .NET
 Аватар для tezaurismosis
9648 / 4801 / 762
Регистрация: 17.04.2012
Сообщений: 9,636
Записей в блоге: 14
15.01.2013, 15:26 5
Прочтите тут: http://www.mono-project.com/Gui_Toolkits внизу страницы, раздел "Alternative Implementation Approaches". Хороший пример использования отделения интерфейса от логики.
1
192 / 192 / 29
Регистрация: 03.12.2009
Сообщений: 853
15.01.2013, 17:06 6
Возможно стоит посмотреть в сторону паттерна MVVM, хотя я не уверен
1
2 / 2 / 0
Регистрация: 22.09.2012
Сообщений: 202
15.01.2013, 17:20  [ТС] 7
прочитал раздел "Alternative Implementation Approaches",потихоньку все проясняется. Насчет MVVM почитал, но кажется это уже слишком глубоко если можно так выразится. Мне сейчас просто нужно правильно определить классы, их связь - для начала, но в любом случае спасибо
0
Автор FAQ
Автор FAQ
 Аватар для Rockedit
1803 / 615 / 37
Регистрация: 22.12.2009
Сообщений: 1,544
15.01.2013, 17:32 8
Цитата Сообщение от Kreativ Посмотреть сообщение
прочитал раздел "Alternative Implementation Approaches",потихоньку все проясняется. Насчет MVVM почитал, но кажется это уже слишком глубоко если можно так выразится. Мне сейчас просто нужно правильно определить классы, их связь - для начала, но в любом случае спасибо
Кстати говоря про классы и их связь - если время позволяет, почитайте про паттерны.
0
2 / 2 / 0
Регистрация: 22.09.2012
Сообщений: 202
15.01.2013, 17:41  [ТС] 9
Цитата Сообщение от Rockedit Посмотреть сообщение
Я думаю, вам поможет - "Сериализация"
Возник вопрос по поводу сериализации, допустим я записываю массив в файл(сохраняю игру) трижды, под разными именами, как тогда можно десериализовать конкретный массив? Т.е. по имени сохраненной игры соотв массив.
каждый раз в новый файл как то не хочется.
0
 Аватар для Wolkodav
840 / 478 / 58
Регистрация: 18.09.2012
Сообщений: 1,688
15.01.2013, 18:49 10
Ну сопоставить в файли соответствие массиву- имя. И по введёному имени десериализировать.
0
2 / 2 / 0
Регистрация: 22.09.2012
Сообщений: 202
15.01.2013, 21:30  [ТС] 11
Цитата Сообщение от Wolkodav Посмотреть сообщение
Ну сопоставить в файли соответствие массиву- имя
я чет понять не могу, как сопоставить то?
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6100 / 4956 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
16.01.2013, 15:38 12
Kreativ, можно сериализовать массив игр (в одном и том же файле), ну или например словарь
Dictionary<string,Game>
то есть словарь, содержащий название игры - игру
1
Администратор
Эксперт .NET
 Аватар для tezaurismosis
9648 / 4801 / 762
Регистрация: 17.04.2012
Сообщений: 9,636
Записей в блоге: 14
17.01.2013, 20:16 13
Вы не видели примеров сериализации объектов? Тогда вот - MSDN
Сохранение идёт в файл, в который захотите. Просто сохраняете каждый раз массив в отдельный файл.
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6100 / 4956 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
17.01.2013, 20:19 14
tezaurismosis, вопрос: а как потом эти массивы загружать, если не знать имя игры? То есть пользователь сохранил игру "qwerty.save", как потом при запуске программа будет его загружать? Со словарем-то просто: при любом имени можно пройтись foreach, к тому же будет всего 1 файл сохранения, а не 100500, а вот для каждой игры свой файл - это не очень. Особенно, если нужно сохранения удалять.
0
Администратор
Эксперт .NET
 Аватар для tezaurismosis
9648 / 4801 / 762
Регистрация: 17.04.2012
Сообщений: 9,636
Записей в блоге: 14
19.01.2013, 23:00 15
Psilon, да точно, не правильно прочитал то, что просит автор темы, мне показалось, что нужно сохранять в разные файлы.
Цитата Сообщение от Psilon Посмотреть сообщение
То есть пользователь сохранил игру "qwerty.save", как потом при запуске программа будет его загружать?
По имени и будет. При десериализации тоже используется имя файла. Например:
C#
1
2
3
4
5
string path = "qwerty.save";
XmlSerializer serializer = new XmlSerializer(typeof(Save));
StreamReader reader = new StreamReader(path);
save = (Save)serializer.Deserialize(reader);
reader.Close();
И ещё: я сторонник раздельных сохранений, поскольку достаточно поиграл в глюченные игры - в случае вылета игры во время сохранения, игра унесёт за собой все сохранения, если они хранятся в одном файле, а так - только одно из сохранений.
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6100 / 4956 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
19.01.2013, 23:01 16
tezaurismosis, если мы заранее не знаем имени игры, как мы его восстановим?
Хотя лучше действительно в разные файлы Но в один массив проще
1
Администратор
Эксперт .NET
 Аватар для tezaurismosis
9648 / 4801 / 762
Регистрация: 17.04.2012
Сообщений: 9,636
Записей в блоге: 14
19.01.2013, 23:13 17
Psilon, если не знаем, то да. А я представил себе загрузочный экран типа:
Код
======= LOAD GAME ========
** 1.sav -------- <Load> |
** 2.sav -------- <Load> |
** n.sav -------- <Load> |
--------------------------
Какой надо - загружаешь.
1
2 / 2 / 0
Регистрация: 22.09.2012
Сообщений: 202
20.01.2013, 11:07  [ТС] 18
Извините, что так долго не отвечал,
tezaurismosis, действительно может быть будет лучше в разные файлы, я повспоминал игры какие играл, все профили хранились раздельно
0
20.01.2013, 11:07
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
20.01.2013, 11:07
Помогаю со студенческими работами здесь

Инкапсуляция или как правильно отделить логику
Делаю проект в WPF(но это не важно). Вопрос таков: может ли класс где обработчики всех событий формы, иметь переменную(другой класс, в...

Игра лабиринт
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication3 { ...

Игра Лабиринт
В лабиринте средством перемещения так сказать &quot;персонажа&quot; являются стрелки.Помогите пожалуйста сделать так чтобы стена была стеной...

Игра лабиринт!
Необходимо создать программу-игру лабаиринт!! на форме!! очень срочно нужно у кого есть исходники скиньте!!

игра-ЛАБИРИНТ!
Нужно написать игрушку-лабиринт, очень простую на С++! Она должна иметь несколько уровней (разных лабиринтов). Передвигается персонаж...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему

Редактор формул (кликните на картинку в правом углу, чтобы закрыть)
Новые блоги и статьи
Использование кэша Laravel - полный гайд
bytestream 18.02.2025
Кэширование - один из наиболее эффективных способов повышения производительности веб-приложений. В современном мире, где скорость загрузки страниц напрямую влияет на удержание пользователей и. . .
Создаем REST API в Laravel с аутентификацией через Passport
bytestream 18.02.2025
Разработка современных веб-приложений все чаще требует создания надежного и хорошо структурированного API. REST API стал стандартом де-факто для построения взаимодействия между клиентской и серверной. . .
Пайплайны в Laravel - полный гайд
bytestream 18.02.2025
Разработка современных веб-приложений часто требует обработки сложных процессов, состоящих из множества последовательных шагов. Например, при создании системы комментариев может потребоваться. . .
Как правильно использовать @required в Symfony
bytestream 18.02.2025
При разработке приложений на Symfony мы часто сталкиваемся с необходимостью внедрения зависимостей. Фреймворк предоставляет несколько способов управления этим процессом, и одним из таких инструментов. . .
Система безопасности в Laravel: возможности и примеры
Wired 18.02.2025
Каждый день появляются новые виды атак и уязвимостей, которые могут поставить под угрозу конфиденциальные данные пользователей и функционирование всей системы. В этом контексте выбор надежного. . .
Давайте сравним Django и Laravel
Wired 18.02.2025
Django и Laravel - два мощных инструмента, которые часто сравнивают между собой. Оба фреймворка предлагают разработчикам богатый набор возможностей для создания масштабируемых веб-приложений, но. . .
Laravel или React - что лучше?
Wired 18.02.2025
В разработке веб выбор правильного инструмента часто определяет успех всего проекта. Особенно интересным представляется сравнение Laravel и React - двух популярных технологий, которые часто. . .
Laravel 11: новые возможности, гайд по обновлению
Wired 18.02.2025
Laravel 11 - это новая масштабная версия одного из самых популярных PHP-фреймворков, выпущенная в марте 2024 года. Эта версия продолжает традицию внедрения передовых технологий и методологий. . .
Миграции в Laravel
Wired 18.02.2025
Разработка веб-приложений на Laravel неразрывно связана с управлением структурой базы данных. При работе над проектом часто возникает необходимость вносить изменения в схему базы данных - добавлять. . .
Аутентификация в Laravel
Wired 18.02.2025
В современном мире веб-разработки безопасность пользовательских данных становится критически важным аспектом любого приложения. Laravel, как один из самых популярных PHP-фреймворков, предоставляет. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru