|
Каждому свое
533 / 219 / 81
Регистрация: 05.08.2013
Сообщений: 1,614
|
||||||||||||||||||||||||||
Создание игр в текстовом режиме17.02.2014, 00:43. Показов 8180. Ответов 67
Метки нет (Все метки)
Привет всем! Тут занялся написанием игрушек в текстовом режиме, типа змейки, тетриса и т.п. Суть в том, что я хочу как можно более правильно написать код, со стороны рефакторинга, со стороны выделения и освобождения памяти, и многих других аспектов. Думаю эта тема поможет многим новичкам, в написание чего-либо подобного, поэтому буду потихоньку выкладывать свои исходники и ждать ваших комментариев.Долго думал куда все-таки отнести эту тему, но решил остановиться здесь.
Итак, сейчас я хочу выложить класс интерфейса(менюшка), и данный класс будет использоваться в любой мной написанной игре. Файл _interface.h
У меня есть 8 методов в области видимости protected, которые будут доступны соответственно классу - потомку. Сейчас распишу примерно, что каждый метод делает: Кликните здесь для просмотра всего текста
int CurrentMenu() - Соответственно получает номер текущего меню. При создании первого экземпляра класса - потомка номер текущего меню равен 0.
static void NextMenu() - Изменяет номер текущего меню на следущее +1. static void BackMenu(); - Изменяет номер текущего меню на предыдущее -1. int CurrentCursor() - Получаем номер текущего пункта меню, где в данное время находится каретка указателя. void AddListMenu(wstring) - Так мы можем добавить пункт меню в список меню. void ClearListMenu() - Соответсвенно, что видно из название - очищаем список меню. int SizeListMenu() - Размер текущего списка меню(Количество пунктов меню данного списка). void DrawMenu() - Метод прорисовки списка меню и выбора определенного пункта меню. Теперь расскажу про область видимости private. Там находятся поля класса. Про них особо нечего рассказывать, практически все методы, которые были описаны выше, просто манипулируют этими полями и все: Кликните здесь для просмотра всего текста
static int current_menu - Номер текущего меню. Причем сколько бы экземпляров класса - потомка не было, это значение для всех общее.
int current_cursor - Номер текущего пункта меню, где в данное время находится каретка указателя. int x,y - Координаты вывода списка меню на экране. ListMenu *menu - Ну и конечно структура самого списка меню, состоящая из одного всего поля - вектора библиотеки STL, где хранятся все пункты меню. Ну и public: Кликните здесь для просмотра всего текста
_interface(int,int) - Конструктор как вы поняли.
~_interface() - Деструктор соответственно. virtual void Run() = 0 - Вот это самое интересное.Это чисто виртуальная функция, которая будет заводить всю систему меню. Она должна обязательно быть перегружена в классе - потомке, и все меню и события по нажатию на определенные пункты меню должны создаваться в ней. То есть все что связано с меню, должно выполняться именно в этой функции. virtual void Run(ListMenu*) = 0 - Метод Run(), это статическое управление списками меню, то есть я не могу создавать, изменять, удалять меню программно. Для этого я создал функцию Run(ListMenu*), которая делает все тоже самое что и Run(), только принимает в качестве формального параметра список меню, что следовательно,что я могу создать меню программно, что иногда очень бывает нужно. Выкладываю определение всех методов данного класса. Файл _interface.cpp
Давайте создадим меню из списка: START, OPTION, EXIT. По нажатию на START - Выводится сообщение "hello world" По нажатию на OPTION - Создается второе меню - DINAMIC CREATE MENU, MESSAGE, BACK По нажатию на EXIT - Выходим из программы Теперь распишем что будет делать второе меню,созданное по нажатию на OPTION. По нажатию на DINAMIC CREATE MENU - Создается динамическое меню, из 6 пунктов, если нажмем на один из первых трех - вернемся назад на второе меню, если нажмем на один из трех следующих - вернемся на START, ... По нажатию на MESSAGE - Выводится сообщение "I Love CyberForum" и возвращаемся на меню START, ... По нажатию на BACK - Возвращаемся назад на первое меню Ну вот более менее подходящее меню, чтобы задействовать всю мощь моего написанного класса) Реализовываем. Файл ___interface.cpp
1
|
||||||||||||||||||||||||||
| 17.02.2014, 00:43 | |
|
Ответы с готовыми решениями:
67
Создание интерфейса пользователя в текстовом режиме
Работа с экраном в текстовом режиме |
|
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
|
||
| 06.03.2014, 05:44 | ||
|
Чтобы предложить какое-нибудь решение, расскажите словами что хочется получить в итоге. Что из себя представляет карта, предполагается ли скроллинг, какие элементы уровня должны быть, что вы хотите делать с этой картой (сохранение, загрузка). Чтобы я не навязывал какое-то свое видение. Понятно, что это может показаться очевидным. "Карта - это набор клеток, каждая из которых может быть своего цвета". Но важно формализовать все детали. Возможно, характеристики объектов: проходимость, триггеры событий. Для какой вообще игры делается редактор. Или это будет семейство игр. Нужно понять что у них общего и в чем различия, чтобы либо принять решение где разделять интерфейс и реализацию, определить наиболее вероятные места изменений и т п.
0
|
||
|
Каждому свое
533 / 219 / 81
Регистрация: 05.08.2013
Сообщений: 1,614
|
||||||||||||||||||||||||||
| 07.03.2014, 22:17 [ТС] | ||||||||||||||||||||||||||
|
Короче по максимому изменил мой класс Меню,в лучшую сторону или нет, судить конечно не мне а Вам. А как мне кажется, он ниче так)
Во-первых, теперь он у меня не абстрактный.Потому что, я подумал что это не нужно в принципе. Во-вторых, я написал библиотеку графики,точнее стащил пол кода с книги Р.Лафоре, и сделал на его "Упрощенном варианте консольной графики" класс. Теперь этот класс я использую везде, где хочу изменить цвет, стереть с экрана что-нибудь, или расположить курсор в нужном мне месте. Думаю это стало более удобнее, чем было раньше. Но меню не будет работать без этого класса, поэтому его нужно таскать всегда с собой. В-третьих, избавился от функций run вовсе, они мне не нужны) Создаю меню я в главной функции main и все такое) Итак сами файлы: Файл Menu.h
0
|
||||||||||||||||||||||||||
|
Антикодер
1889 / 871 / 48
Регистрация: 15.09.2012
Сообщений: 3,092
|
|||
| 07.03.2014, 23:05 | |||
|
Я например недавно добавил в свою прогу JSON парсер на основе boost property tree[ поддерживает также XML и INI]. Это позволяет хранить конфигурационный файл проги в удобном виде. Решение в booste казалось бы красивое, но когда начинаешь рассуждать, оказывается, что можно сделать более универсальный и изящный код. Доходит до того, что хочется переделать весь C++. Раньше я считал, что языков программирования слишком много, терь я считаю, что недостаточно, так как нет подходящего.
0
|
|||
|
Каждому свое
533 / 219 / 81
Регистрация: 05.08.2013
Сообщений: 1,614
|
|
| 07.03.2014, 23:06 [ТС] | |
|
XRuZzz, кроме delete еще есть замечания?)
0
|
|
|
Антикодер
1889 / 871 / 48
Регистрация: 15.09.2012
Сообщений: 3,092
|
|||||||
| 08.03.2014, 00:59 | |||||||
|
Не смотря на то, что помогать разработчикам игр не очень хорошее занятие, дам вам ссылку на пример, который помог мне понять один из паттернов МVC[так как паттерны МVC бывают разные]: MVC в примере на С++ (консольное приложение) То что я рекомендую этот паттерн, означает только то, что я мало разбирался[экспериментировал] с другими. По проекту в целом, меня бы порадовали[многие не признают некоторые пункты]: -более высокий уровень описания требований к проекту -сценарии вариантов использования -UML диаграммы[они используются как дополнение к тексту. Немного порадовала диаграмма классов 0x10] -система контроля версий[я не сторонник смотреть код проекта в форуме] и т п Конечно вы просили оценить только код, но иногда полезно выйти за рамки темы. Давайте откроем любой участок кода boost [или другой библиотеки C++]:
Это формат doxygen. Этим я хотел сказать то, что даже в ваших комментариях есть что улучшать. Всё вышеперечисленное не является фундаментальными знаниями[такими как математика], на которые я вам советую опираться в первую очередь[уделять им больше времени].
1
|
|||||||
|
Каждому свое
533 / 219 / 81
Регистрация: 05.08.2013
Сообщений: 1,614
|
|
| 08.03.2014, 02:51 [ТС] | |
|
Полиморфизм и перегрузку я даже не знаю где здесь использовать,может она вовсе не нужна?
0
|
|
|
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
|
||||||
| 08.03.2014, 08:46 | ||||||
|
Bretbas, сразу же в глаза бросается: в меню остались статические методы и поля, при этом все действия производятся через объект. Вывод? static не нужен.
Пробегусь по отдельным моментам. Далее идет огромный switch, у которого есть еще и несколько вложенных. Это сложно для чтения и поддержки. Нужно побить на функции. Вынесение работы с графикой в отдельный класс - ок. Ну и хочется по некоторым пунктам дополнить XRuZzz.
1
|
||||||
|
Каждому свое
533 / 219 / 81
Регистрация: 05.08.2013
Сообщений: 1,614
|
|
| 09.03.2014, 01:34 [ТС] | |
|
1.Вы сказали лучше сделать класс MenuVisualizer, который будет знать о меню и графики,так?Значит нужно создавать именно объект этого класса в main?И работать с меню через этот объект?
2.Я не пойму что такое сценарии вариантов использования?Это то,для чего эта система меню нужна?Ну к примеру для создание меню в консольных играх.И это все что нужно описать? 3.А как сделать систему одноуровневого меню?К примеру я хочу по определенному пункту меню объекта menu1, перейти на другой список меню,для этого мне нужно создавать нужный новый объект menu2, и выполнять тоже самое?)Так чтоли? XRuZzz, ту статью про MVC которую вы мне дали,в первый раз я все понял)Все идеально и грамотно разжжевано,специально для новичков)Есть что то типо этого?)
0
|
|
|
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
|
||||
| 09.03.2014, 06:45 | ||||
|
Вообще мне кажется, что вопросы архитектуры надо постепенно закрывать - иначе скатимся в чтение курса лекций. Надо уже довести до конца хотя бы одну программу. Пусть она будет где-нибудь кривая и косая, но завершенная.
1
|
||||
|
Антикодер
1889 / 871 / 48
Регистрация: 15.09.2012
Сообщений: 3,092
|
||
| 09.03.2014, 10:55 | ||
|
Не прочитав этой книги, невозможно научиться работать с вариантами использования.
0
|
||
|
Каждому свое
533 / 219 / 81
Регистрация: 05.08.2013
Сообщений: 1,614
|
|
| 13.03.2014, 00:54 [ТС] | |
|
0x10, е-мое,опять не понял про MenuVisualizer...какая отрисовка?То есть метод draw_menu() будет принадлежать классу MenuVisualizer?А все остальные функции,такие как current_menu(),current_cursor() и тд,будут относиться к классу Menu.Так?И нужно создавать два объекта в main,соответственно обоих классов?
0
|
|
|
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
|
|
| 13.03.2014, 06:01 | |
|
0
|
|
|
Антикодер
1889 / 871 / 48
Регистрация: 15.09.2012
Сообщений: 3,092
|
|
| 13.03.2014, 10:34 | |
|
Скорее всего вам нужен всего один вариант использования (ВИ), назовём его "Пройти игру". Желательно иметь ещё глоссарий для проекта, но я сделаю первый набросок сценария ВИ (СВИ) пользовательского уровня:
ВИ "Пройти игру" Основной сценарий: 1. Пользователь посылает запрос для получения доступных действий. 2. Система подтверждает запрос и предоставляет пользователю список доступных действий(меню). 3. Пользователь посылает запрос для начала игры. 4. Система загружает игровой процесс и сообщает о начале игры. 5. Пользователь посылает запросы для выполнения необходимых действий в игре. 6. Система подтверждает выполнение действий в игре и сообщает об успешном завершении игры. Расширения(если что то пошло не так): 1a. Пользователю нужна справочная информация по игровому процессу. 1a1. Пользователь посылает запрос для получения справочной информации о игровом процессе. 1a2. Система предоставляет справочную информацию о игровом процессе. 1b. Пользователю нужно изменить настройки игрового процесса. 1b1. Пользователь посылает запрос на получение списка доступных настроек игрового процесса. 1b2. Система подтверждает запрос и предоставляет список доступных настроек пользователю. 1b3. Пользователь выбирает уровень сложности, карту игрового поля и посылает запрос на изменение настроек игрового процесса. 1b4. Система подтверждает настройки 3a. Пользователь совершил действия, которые привели к поражению в игре. 3a1. Система сообщает о проигрыше. ___________ Так как всё написано текстом, скорее всего вы поняли, что я хотел этим сказать(это преимущество написания СВИ в текстовом виде). Этим ВИ мы показываем основные способы достижения цели пользователя - пройти игру. Реализовать этот ВИ можно даже в консоли(так как я не упоминал детали интерфейса). Изменения в любом предложении этого сценария могут привести к тому, что весь код придётся переписывать заново. Например, ВИ сообщает нам, что у пользователя всего одна жизнь для прохождения всей игры. Нам необходимо дополнить этот ВИ такими требованиями: -Количество пользователей системы не должно превышать 1. -Игра должна запускаться на любых операционных системах, поддерживающих OpenGL. -Игра должна запускаться консольном и графическом режиме. -Игра должна иметь возможность расширять количество поддерживаемых языков. -Настройки игры должны храниться в формате JSON(может кто предложит формат лучше?) и т д Очевидно, что этот простой текст сильно изменит ваш код(в лучшую сторону)
0
|
|
|
Каждому свое
533 / 219 / 81
Регистрация: 05.08.2013
Сообщений: 1,614
|
|
| 14.03.2014, 01:18 [ТС] | |
|
0x10, завтра скину измененный код с добавлением нового класса)
XRuZzz, так,в принципе я понял,что такое варианты использования.Конечно,с ними код весьма быстрее читается и развивается правильно соответственно.Но вот у меня один вопросик назрел...Это случаем не частный случай блок схем? XRuZzz, 0x10, вам не кажется,что мы одни остались в этой теме?(
0
|
|
|
Антикодер
1889 / 871 / 48
Регистрация: 15.09.2012
Сообщений: 3,092
|
||
| 14.03.2014, 14:05 | ||
|
Блок схемы описывают работу функций и алгоритмов(в нотации UML вместо блок схем используются диаграммы активности) Лично я исключаю из СВИ возврат к предыдущим шагам, а на блок схеме это возможно. Мы можем представлять ВИ в виде блок-схем и диаграмм активности, но многие рекомендуют текстовую форму, так как она понятна даже не подготовленному человеку.
0
|
||
|
Каждому свое
533 / 219 / 81
Регистрация: 05.08.2013
Сообщений: 1,614
|
||||||||||||||||||||||||||
| 14.03.2014, 23:53 [ТС] | ||||||||||||||||||||||||||
|
Короче разделил я на 2 сущности мой класс меню.В итоге вот что получил:
Файл Menu.h
0
|
||||||||||||||||||||||||||
|
Антикодер
1889 / 871 / 48
Регистрация: 15.09.2012
Сообщений: 3,092
|
||
| 15.03.2014, 00:36 | ||
|
теперь смотрим расширение сценария:
Добавлено через 5 минут Меня всегда удивляет, когда люди описывают поведение живого существа в программе и не концентрируют внимание на сущности этого существа. Я бы выделил следующие сущности: Змейка Яблоки Иными словами, неужели вам не интересно создать классы с уникальным поведением типа Snakes, Apples? В которых бы отсутствовали операторы вывода графики, а присутствовала бы только сама логика сущностей.
0
|
||
|
Каждому свое
533 / 219 / 81
Регистрация: 05.08.2013
Сообщений: 1,614
|
|
| 15.03.2014, 00:40 [ТС] | |
|
XRuZzz, я не понял вас...я еще не выкладывал ни одну игру...выложил только класс меню...и сделал пример использования,не по теме игры вообще
0
|
|
|
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
|
|
| 15.03.2014, 07:16 | |
|
На самом деле, на этом предлагаю закругляться.
Вылизывать дальше пока смысла не вижу, иначе тут можно застрять надолго. Лучше просто двигаться дальше и довести хотя бы одну идею до конца. Из замечаний пока оставлю одно: слишком сложно. Использование класса меню занимает много места, присутствуют вложенные свитчи. Чтобы понять структуру меню и переходов приходится читать весь код. Хочется иметь отдельно более-менее декларативное описание структуры и отдельно логику обработки действий пользователя. Т.е. разделить данные и поведение. Пока кидаться делать это не надо, я уже говорил почему. Просто на будущее.
0
|
|
|
Антикодер
1889 / 871 / 48
Регистрация: 15.09.2012
Сообщений: 3,092
|
||
| 15.03.2014, 09:11 | ||
|
Потом всё меню будете переделывать для добавления справки? или во время игры будете подсвечивать клавиши, которые можно нажать в данный момент? Или будете добавлять обучающий уровень?
0
|
||
| 15.03.2014, 09:11 | |
|
ООП иерархия классов с выводом в текстовом режиме Нарисовать мышью прямоугольник в текстовом режиме экрана Как сделать прокрутку (в текстовом режиме) и менюшку в turbo c Работа с экраном в текстовом режиме (вывод всех цветов фона, разделяя цвета паузой) Создание приложения в визуальном режиме Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Особенности gif сгенерированных в Си
russiannick 21.10.2026
Рассмотрим генерацию gif файлов, которые в Си имеют свои особенности.
Gif представляет собой графический формат популярный в интернете. Посмотрим на палитру. Gif файл сгенерированный в си отличается. . .
|
FPS контроллер с анимированными Y-Bot и 3D-звуком miniaudio (Box3D, Recast, BehaviorTree.CPP, ozz-animation, ImGui, OpenGL и SDL3)
8Observer8 18.10.2026
Содержание блога | English Version
Полное мультиплатформенное руководство по стартовому проекту с FPS-контроллером игрока, анимированными роботами Y-Bot с 4-слойным блендингом, 3D-физикой Box3D,. . .
|
Локальный http сервер
Argus19 17.10.2026
Локальный http сервер
На работе, на двух локальных компьютерах круглосуточно работают программы опроса приборов с записью в книги Excel,которые раз в сутки записываются на сервер компании. Т. к. . . .
|
Копировать Windows на новый диск на UEFI
damix 17.10.2026
https:/ / uriesk. wordpress. com/ 2016/ 11/ 01/ move-window-10-to-ssd-on-a-uefi-dualboot-system-with-basic-linux-tools/
TL DR
Вставляем диск, а старый подключаем через переходник, грузимся с лайва. . .
|
|
ИИ не может найти нужный язык в списке
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
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
|