Каждому свое
533 / 219 / 81
Регистрация: 05.08.2013
Сообщений: 1,614
|
||||||||||||||||||||||||||
1 | ||||||||||||||||||||||||||
Создание игр в текстовом режиме17.02.2014, 00:43. Показов 6308. Ответов 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
Создание интерфейса пользователя в текстовом режиме Работа с экраном в текстовом режиме Работа с экраном в текстовом режиме ООП иерархия классов с выводом в текстовом режиме |
Каратель
|
|
17.02.2014, 01:15 | 2 |
сколько текста, а элементарных вещей нет:
геттеры делаем константными методами деструктор базового класса должен быть виртуальным что правда абстрактный? а по названию не скажешь...ещё эти вырвиглазные подчеркивания...погуглите c++ code style guide в хедерах не пишут (Создать базовый класс Car (машина), характеризуемый торговой маркой (строка), числом цылиндров, мощностью) почитайте в документации что возвращает size, если ваш код компилируется без предупреждений значит вы явно компилируете не с теми опциями и следует усилить уровень предупреждений Добавлено через 2 минуты нету проверки на nullptr Добавлено через 28 секунд main должна возвращать значение Добавлено через 27 секунд зачем это размещать в хипе?
1
|
Антикодер
1804 / 869 / 48
Регистрация: 15.09.2012
Сообщений: 3,081
|
|
17.02.2014, 02:37 | 4 |
Давайте откроем самое начало книги Страуструпа "Язык программирования C++"[4 издание]
почитаем его предложения для программистов C++[1.3.2]: самое время небольшой рекламы: Изучение Stroustrup "The C++ Programming Language" (4th Edition) По поводу рефакторинга ещё хотел заметить, что Фаулер в своей книге "Рефакторинг" говорит примерно следующее, что если вы нашли ошибку в коде, то это повод задуматься не только о том почему вы её допустили, но и о рефакторинге - чтоб не допустить такой ошибки в будущем. Как бы глобальный рефакторинг не всегда оправдан, поэтому Фаулер советует заниматься им по чуть чуть, когда это необходимо.
0
|
Каждому свое
533 / 219 / 81
Регистрация: 05.08.2013
Сообщений: 1,614
|
||||||
17.02.2014, 22:30 [ТС] | 5 | |||||
Jupiter, таааак))уже лучше)) буду все менять и выклпдывать сюда же на днях....но вначале есть несколько вопросов по вашему посту:
1.Почему объявление пространств имен не пишут в заголовочных файлах -using namespace std ??Тогда везде,где используется std к примеру,мне нужно будет писать std::объект 2.а что не так с методом вектора size()?На сколько я знаю,он возвращает количество элементов вектора.Но если это не так,то что тогда?И как по другому пройтись по элементам вектора без итераторов? 3.как сделать проверку на nullptr в данном методе void ___interface::Run(ListMenu *list)?Просто никогда не работал с nullptr...на вашем примере думаю пойму)) 4.обязательно чтобы main() возвращала значение? 5.а что не так с
6.И что в плане рефакторинга,что скажете по моим классам?
0
|
17.02.2014, 23:21 | 7 |
"Куча" -heap, стек/куча место хранятся данные (память), куча для динамического выделения памяти, стек -для статического..
Добавлено через 16 минут Посмотрите здесь, забавная штука может получится нечаянно: В чем ошибка? посты 12-17
2
|
Каратель
|
|||||||||||
18.02.2014, 00:57 | 8 | ||||||||||
несовпадение типов, у тебя переменная цикла имеет тип int, size() же возвращает
да и с указателями видно тоже не работал
1
|
18.02.2014, 00:58 | 9 |
Jupiter, а то, что *.size() возвращает значение безнакового типа действительно стоит того, чтобы упоминать об этом?
C++ for(int i = 0; i < list->item.size(); i++) { AddListMenu(list -> item[i]); }
1
|
Каратель
|
|
18.02.2014, 01:12 | 10 |
да действительно стоит того, не нужно давать повод компиляторам/анализаторам кода/etc на варнинги/ошибки и прочее - это раз. оставив его знаковым при сравнении компилятор будет его неявно кастовать в беззнаковый, зачем этот лишний каст? - это два. некомпетентный виновник найдется всегда, дай только повод - это три.
2
|
Антикодер
1804 / 869 / 48
Регистрация: 15.09.2012
Сообщений: 3,081
|
|
18.02.2014, 10:12 | 12 |
Может повторюсь, но Страуструп говорит о том, что нужно улучшать технику программирования. А рефакторинг это улучшение уже существующего кода. Почитать про паттерны (MVC например) помоему было бы полезнее. А изучить какое-нить новое мат. понятие и применить знания программе самое полезное занятие. Поэтому книга Кнута так популярна. Программы можно и нужно оставлять недоделанными если это мешает приобретению новых навыков.
0
|
18.02.2014, 10:27 | 13 |
Боюсь что не соглашусь с Вами: умение достичь поставленной цели, тоже дорого стоит. Набив шишки на лбу по корявому коду в следующий раз будешь понимать причину их и обходить. Поэтому я не понимаю Ваше высказывание:
В любом случае ты приобретаешь новые навыки. Если ты конечно не занят решением типовых задач конечно, но если это даже так то вряд ли ты их решаешь в этом случае по своей воли (для удовольствия своего), азначит ты их все равно должен решить....
0
|
Антикодер
1804 / 869 / 48
Регистрация: 15.09.2012
Сообщений: 3,081
|
|
18.02.2014, 10:37 | 14 |
Эта мысль более точно выражена в книге Дейтела, который говорил, что вы делаете только некоторое приближение к идеальной реализации.
Просто хотелось бы предостеречь от ситуации, когда долго что-то пишете бесконечно приближаясь к идеалу, а потом оказывается, что это уже давно реализовано лучшим образом в какой нибудь библиотеке, например в бусте. Впрочем я и сам этим страдаю.
0
|
18.02.2014, 10:49 | 15 |
А вот с этим, согласен. Постоянно совершенствовать не всегда целесообразно, иногда имеет смысл начать с начала и идти по новому пути. Но глагол "совершенствовать" применим к рабочему (законченному) проекту, а не к половинному (вот его бросать не рекомендую).
Все мы этим страдаем
0
|
Каждому свое
533 / 219 / 81
Регистрация: 05.08.2013
Сообщений: 1,614
|
|
21.02.2014, 02:51 [ТС] | 16 |
Jupiter,вы сказали,что мой класс делает все,и вы скорее всего имели ввиду,что его нужно разложить на более маленькие классы,чтобы лучше применить рефакторинг...скорее всего много чего лишнего уберется и изменится в лучшую сторону...но я не вижу где его изменить!может мне не хватает опыта?(можете приблизительно рассказать,как бы вы реализовали этот класс в лучшую сторону?
буду очень благодарен
0
|
Антикодер
1804 / 869 / 48
Регистрация: 15.09.2012
Сообщений: 3,081
|
|
21.02.2014, 09:38 | 17 |
я раньше писал статью на этот счёт, когда отвечал на вопросы на этом форуме.
Но так как я теперь использую https, в ссылках нужно заменять http на https. Возможно сегодня вечером поправлю ссылки. Используя преобразование диаграммы бизнес объектов в диаграмму классов, размер класса обычно не превышает 1000 строк.
0
|
Каждому свое
533 / 219 / 81
Регистрация: 05.08.2013
Сообщений: 1,614
|
|
21.02.2014, 23:42 [ТС] | 18 |
я не понимаю в чем мне нужно изменить свой класс,но я однозначно знаю что это нужно сделать.
Подкиньте идейки то?
1
|
Каждому свое
533 / 219 / 81
Регистрация: 05.08.2013
Сообщений: 1,614
|
|
22.02.2014, 00:18 [ТС] | 20 |
еще будут мнения или на этом остановимся?
0
|
22.02.2014, 00:18 | |
22.02.2014, 00:18 | |
Помогаю со студенческими работами здесь
20
Нарисовать мышью прямоугольник в текстовом режиме экрана Как сделать прокрутку (в текстовом режиме) и менюшку в turbo c Работа с экраном в текстовом режиме (вывод всех цветов фона, разделяя цвета паузой) Создание приложения в визуальном режиме Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |