Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 24, средняя оценка - 4.71
Bretbas
Каждому свое
344 / 114 / 31
Регистрация: 05.08.2013
Сообщений: 1,220
Завершенные тесты: 1
#1

Создание игр в текстовом режиме - C++

17.02.2014, 00:43. Просмотров 3305. Ответов 67
Метки нет (Все метки)

Привет всем! Тут занялся написанием игрушек в текстовом режиме, типа змейки, тетриса и т.п. Суть в том, что я хочу как можно более правильно написать код, со стороны рефакторинга, со стороны выделения и освобождения памяти, и многих других аспектов. Думаю эта тема поможет многим новичкам, в написание чего-либо подобного, поэтому буду потихоньку выкладывать свои исходники и ждать ваших комментариев.Долго думал куда все-таки отнести эту тему, но решил остановиться здесь.
Итак, сейчас я хочу выложить класс интерфейса(менюшка), и данный класс будет использоваться в любой мной написанной игре.

Файл _interface.h

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#pragma once
#include <iostream>
#include <vector>
#include <string>
#include "msoftcon.h"
using namespace std;
 
 
/* ## Cтруктура списка интерфейса ## */
struct ListMenu 
{
    vector<wstring> item;
};
 
 
/* ## Абстрактный класс интерфейса ## */
class _interface
{
protected:
    int CurrentMenu();                              // Получение текущего списка меню
    int CurrentCursor();                            // Получение каретки текущего пункта меню
    static void NextMenu();                         // Следующий список меню
    static void BackMenu();                         // Предыдущий список меню
    void AddListMenu(wstring);                      // Добавить пункт в список меню
    void ClearListMenu();                           // Очистить список меню
    int SizeListMenu();                             // Размер списка меню
    void DrawMenu();                                // Прорисовка списка меню
 
private:
    static int current_menu;                        // Текущий список меню
    int current_cursor;                             // Каретка текущего пункта меню
    int x,y;                                        // Координаты прорисовки списка на экране
    ListMenu *menu;                                 // Структура списка меню
 
public:
    _interface(int,int);                            // Конструктор
    ~_interface();                                  // Деструктор
 
    virtual void Run() = 0;                         // Запуск статической системы меню
    virtual void Run(ListMenu*) = 0;                // Запуск динамической системы меню
};
Ну что могу сказать по поводу этого класса. Ну первое, это абстрактный класс, то есть создание экземпляров от этого класса будет невозможно.

У меня есть 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

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
#include "_interface.h"
 
 
int _interface :: current_menu = 0;
 
 
/* ## Конструктор ## */
_interface :: _interface(int x1,int y1) : x(x1),y(y1)
{ 
    init_graphics();
    menu = new ListMenu;
}
 
 
/* ## Деструктор ## */
_interface :: ~_interface()
{ }
 
 
/* ## Следующий список меню ## */
void _interface :: NextMenu()
{
    current_menu++;
}
 
 
/* ## Предыдущий список меню ## */
void _interface :: BackMenu()
{
    current_menu--;
}
 
 
/* ## Получение текущего списка меню ## */
int _interface :: CurrentMenu()
{
    return current_menu;
}
 
 
/* ## Получение каретки текущего пункта меню ## */
int _interface :: CurrentCursor()
{
    return current_cursor;
}
 
 
/* ## Добавить пункт в список меню ## */
void _interface :: AddListMenu(wstring item)
{
    menu -> item.push_back(item);
}
 
 
/* ## Очистить список меню ## */
void _interface :: ClearListMenu()
{
    menu -> item.clear();
}
 
 
/* ## Размер списка меню ## */
int _interface :: SizeListMenu()
{
    return menu -> item.size();
}
 
 
/* ## Прорисовка списка меню ## */
void _interface :: DrawMenu()
{
    set_color(cWHITE,cBLACK);
    clear_screen();
 
    for(int i = 0; i < menu -> item.size(); i++)
    {
        set_cursor_pos(x + 4,y + i);
        wcout << menu -> item[i] << endl;
    }
 
    set_cursor_pos(x,y);
    current_cursor = 1;
    char c;
 
    do
    {
        for(int i = 0; i < SizeListMenu(); i++)
        {
            if(i == current_cursor - 1)
            { set_color(cBLACK,cYELLOW); }
            else
            { set_color(cBLACK,cBLUE); }
 
            set_cursor_pos(x,y + i);
            cout << "->";
        }
 
        c = _getch();
 
        switch(c)
        {
        case 72: if(current_cursor != 1) { current_cursor = current_cursor - 1; } break;
        case 80: if(current_cursor != SizeListMenu()) { current_cursor = current_cursor + 1; } break;
        }
    }
    while(c != 13);
}
Ну если все понятно, можно теперь создать собственно меню.) Создаем вначале класс - потомок. Файл ___interface.h

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#pragma once
#include "_interface.h"
using namespace std;
 
 
/* ## Производный класс от класса интерфейса ## */
class ___interface : public _interface
{
public:
    ___interface(int,int);      // Конструктор
    ~___interface();            // Деструктор
 
    void Run();                 // Запуск статической системы меню
    void Run(ListMenu*);        // Запуск динамической системы меню
};
Здесь вроде все понятно, теперь соответственно определяем функции Run() и Run(ListMenu*). Но прежде чем их определить, нужно придумать меню).
Давайте создадим меню из списка: 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

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
#include "___interface.h"
 
 
/* ## Конструктор ## */
___interface :: ___interface(int x,int y) : _interface(x,y)
{ }
 
 
/* ## Деструктор ## */
___interface :: ~___interface()
{ }
 
 
/* ## Запуск системы ## */
void ___interface :: Run()
{
    set_color(cWHITE,cBLACK);
 
    ClearListMenu();
 
    switch(CurrentMenu())
    {
    case 0: // Первое меню - START  OPTION  EXIT
        {
            AddListMenu(L"START");
            AddListMenu(L"OPTION");
            AddListMenu(L"EXIT");
 
            DrawMenu();
 
            switch(CurrentCursor())
            {
            case 1:
                {
                    clear_screen();
                    cout << "hello world";
                    getch();
                }
            break;
 
            case 2:
                {
                    NextMenu();
                }
            break;
 
            case 3:
                {
                    exit(0);
                }
            break;
            }
        }
    break;
 
    case 1: // Второе меню - DINAMIC CREATE MENU   MESSAGE   BACK
        {
            AddListMenu(L"DINAMIC CREATE MENU");
            AddListMenu(L"MESSAGE");
            AddListMenu(L"BACK");
 
            DrawMenu();
 
            switch(CurrentCursor())
            {
            case 1:
                {
                    clear_screen();
                    ListMenu* DinamicMenu = new ListMenu;
                    wstring item;
 
                    for(int i = 0; i < 6; i++)
                    {
                        cout << "Input item of menu";
                        wcin >> item;
                        DinamicMenu -> item.push_back(item);
                    }
 
                    Run(DinamicMenu); // Создаем новое меню динамически
                }
            break;
 
            case 2:
                {
                    clear_screen();
                    cout << "I Love CyberForum";
                    getch();
                    BackMenu();
                }
            break;
 
            case 3:
                {
                    BackMenu();
                }
            break;
            }
        }
    break;
 
    }
 
    Run(); // Рекурсивно вызываем эту же функцию
}
 
 
void ___interface::Run(ListMenu *list)
{
    set_color(cWHITE,cBLACK);
    NextMenu();
    ClearListMenu();                                // Очищаем список
 
    for(int i = 0; i < list -> item.size(); i++)
    {
        AddListMenu(list -> item[i]);               // Инициализируем список с формальным параметром
    }
 
    DrawMenu();                                     // Прорисовка списка меню
 
    switch(CurrentCursor())
    {
    case 1: BackMenu(); break;
    case 2: BackMenu(); break;
    case 3: BackMenu(); break;
    case 4: { BackMenu(); BackMenu(); } break;
    case 5: { BackMenu(); BackMenu(); } break;
    case 6: { BackMenu(); BackMenu(); } break;
    }
}
В main.cpp можно вызвать меню таким способом:

C++
1
2
3
4
5
6
7
8
9
#include "___interface.h"
 
 
void main()
{
    ___interface *inter = new ___interface(38,10);
 
    inter -> Run();
}
Постепенно я буду выкладывать и остальные части игр, и буду слушать ваше мнение по написанному. Почему я начал с меню? Потому что это главный класс, который заводит всю игру, и его нужно написать на сколько можно правильно. Поэтому жду ваших комментариев,критик по поводу написанного, может что то нужно изменить, добавить, убрать. Я прислушаюсь к любому мнению)
1
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.02.2014, 00:43
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Создание игр в текстовом режиме (C++):

Создание интерфейса пользователя в текстовом режиме - C++
Создание интерфейса пользователя в текстовом режиме. Библиотека PDCurses. (С++) Задание: В текстовом режиме экрана реализуйте...

Работа с экраном в текстовом режиме - C++
Ниже дана программа которая до нажатия Esc повторяет действия: случайным образом выбирает размеры (соотношение 25х80) и положение окна ...

Работа с экраном в текстовом режиме - C++
В меню с выбором пунктов Функциональными Клавишами по программе с клавиатуры в 1-е окно вводится текст с цифрами. Во 2-м окне...

Нарисовать мышью прямоугольник в текстовом режиме экрана - C++
Помогите разобраться.. Нужно нарисовать прямоугольник (любыми символами) в текстовом режиме экрана с помощью мышки. Ну я пытался...

ООП иерархия классов с выводом в текстовом режиме - C++
Помогите с решением &quot;Дана иерархия классов числа-числа кратные 5-числа кратные 25. Написать программу с выводом объектов указанных классов...

Как сделать прокрутку (в текстовом режиме) и менюшку в turbo c - C++
(Turbo c)Если прогамма выводит на экран большое кол-во информации, то некоторая её часть становится недоступной, как же сделать прокрутку...

67
Jupiter
Каратель
Эксперт С++
6559 / 3980 / 227
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
17.02.2014, 01:15 #2
сколько текста, а элементарных вещей нет:
Цитата Сообщение от Bretbas Посмотреть сообщение
C++
1
2
int CurrentMenu(); // Получение текущего списка меню
* * int CurrentCursor(); // Получение каретки текущего пункта меню
геттеры делаем константными методами

Цитата Сообщение от Bretbas Посмотреть сообщение
C++
1
~_interface();
деструктор базового класса должен быть виртуальным

Цитата Сообщение от Bretbas Посмотреть сообщение
C++
1
2
/* ## Абстрактный класс интерфейса ## */
class _interface
что правда абстрактный? а по названию не скажешь...ещё эти вырвиглазные подчеркивания...погуглите c++ code style guide

Цитата Сообщение от Bretbas Посмотреть сообщение
C++
1
using namespace std;
в хедерах не пишут (Создать базовый класс Car (машина), характеризуемый торговой маркой (строка), числом цылиндров, мощностью)

Цитата Сообщение от Bretbas Посмотреть сообщение
C++
1
for(int i = 0; i < menu -> item.size(); i++)
почитайте в документации что возвращает size, если ваш код компилируется без предупреждений значит вы явно компилируете не с теми опциями и следует усилить уровень предупреждений

Добавлено через 2 минуты
Цитата Сообщение от Bretbas Посмотреть сообщение
void ___interface::Run(ListMenu *list)
нету проверки на nullptr

Добавлено через 28 секунд
Цитата Сообщение от Bretbas Посмотреть сообщение
void main()
main должна возвращать значение

Добавлено через 27 секунд
Цитата Сообщение от Bretbas Посмотреть сообщение
C++
1
___interface *inter = new ___interface(38,10);
зачем это размещать в хипе?
1
programina
1914 / 599 / 37
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
17.02.2014, 01:23 #3
Соглашусь на счет подчеркиваний с Jupiter, смотрится не очень. Их лучше использовать для обозначения аргументов в функциях (методах), чтобы отличать от внешних переменных.
0
XRuZzz
Антикодер
681 / 583 / 29
Регистрация: 15.09.2012
Сообщений: 2,531
17.02.2014, 02:37 #4
Давайте откроем самое начало книги Страуструпа "Язык программирования C++"[4 издание]
почитаем его предложения для программистов C++[1.3.2]:
...
[3] Avoid ‘‘naked’’ new and delete (§3.2.1.2, §11.2.1).
...
некоторые советы, которые мне нравятся[1.5]
[3] Don’t overabstract; §1.2.
...
[7] C++ is not just object-oriented; §1.2.1.
[8] C++ is not just for generic programming; §1.2.1.
насчёт подчеркиваний Страуструп тоже говорил... [6.3.3]
Nonlocal names starting with an underscore are reserved for special facilities in the implementation
and the run-time environment, so such names should not be used in application programs. Similarly,
names starting with a double underscore (__) or an underscore followed by an uppercase letter
(e.g., _Foo) are reserved (§iso.17.6.4.3).
и т д по книге
самое время небольшой рекламы:
Изучение Stroustrup "The C++ Programming Language" (4th Edition)

По поводу рефакторинга ещё хотел заметить, что Фаулер в своей книге "Рефакторинг" говорит примерно следующее, что если вы нашли ошибку в коде, то это повод задуматься не только о том почему вы её допустили, но и о рефакторинге - чтоб не допустить такой ошибки в будущем.
Как бы глобальный рефакторинг не всегда оправдан, поэтому Фаулер советует заниматься им по чуть чуть, когда это необходимо.
0
Bretbas
Каждому свое
344 / 114 / 31
Регистрация: 05.08.2013
Сообщений: 1,220
Завершенные тесты: 1
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.а что не так с
C++
1
___interface *inter = new ___interface(38,10);
и что такое хип не понял я)))

6.И что в плане рефакторинга,что скажете по моим классам?
0
programina
1914 / 599 / 37
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
17.02.2014, 22:55 #6
Цитата Сообщение от Bretbas Посмотреть сообщение
обязательно чтобы main() возвращала значение?
Обязательно!

Добавлено через 1 минуту
Цитата Сообщение от Bretbas Посмотреть сообщение
а что не так с ___interface
Вам уже писали, что подчеркивание используется для зарезервированных слов.
1
mustimur
268 / 222 / 57
Регистрация: 22.11.2013
Сообщений: 832
Записей в блоге: 1
17.02.2014, 23:21 #7
Цитата Сообщение от Bretbas Посмотреть сообщение
такое хип не понял я)))
"Куча" -heap, стек/куча место хранятся данные (память), куча для динамического выделения памяти, стек -для статического..

Добавлено через 16 минут
Цитата Сообщение от Bretbas Посмотреть сообщение
Почему объявление пространств имен не пишут в заголовочных файлах -using namespace std
Посмотрите здесь, забавная штука может получится нечаянно: В чем ошибка? посты 12-17
2
Jupiter
Каратель
Эксперт С++
6559 / 3980 / 227
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
18.02.2014, 00:57 #8
Цитата Сообщение от Bretbas Посмотреть сообщение
2.а что не так с методом вектора size()?
несовпадение типов, у тебя переменная цикла имеет тип int, size() же возвращает
an unsigned integral type.
Добавлено через 1 минуту
Цитата Сообщение от Bretbas Посмотреть сообщение
3.как сделать проверку на nullptr в данном методе void ___interface::Run(ListMenu *list)?Просто никогда не работал с nullptr...на вашем примере думаю пойму))
да и с указателями видно тоже не работал
C++
1
if (list != 0)
в с++11 можно так
C++
1
if (list != nullptr)
Цитата Сообщение от Bretbas Посмотреть сообщение
6.И что в плане рефакторинга,что скажете по моим классам?
на данный момент все намешано в кучу - один класс делает все - задает пункты меню, выводит на консоль, следит вообще за всеми менюшками...абстрагируйся!
1
programina
1914 / 599 / 37
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
18.02.2014, 00:58 #9
Jupiter, а то, что *.size() возвращает значение безнакового типа действительно стоит того, чтобы упоминать об этом?
C++
for(int i = 0; i < list->item.size(); i++)
{
    AddListMenu(list -> item[i]);
}
1
Jupiter
Каратель
Эксперт С++
6559 / 3980 / 227
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
18.02.2014, 01:12 #10
Цитата Сообщение от programina Посмотреть сообщение
а то, что *.size() возвращает значение безнакового типа действительно стоит того, чтобы упоминать об этом?
да действительно стоит того, не нужно давать повод компиляторам/анализаторам кода/etc на варнинги/ошибки и прочее - это раз. оставив его знаковым при сравнении компилятор будет его неявно кастовать в беззнаковый, зачем этот лишний каст? - это два. некомпетентный виновник найдется всегда, дай только повод - это три.
2
programina
1914 / 599 / 37
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
18.02.2014, 01:20 #11
Jupiter, да наверно вы правы, напрасные времязатраты на одно единственное преобразование из int в unsigned int не нужны
0
XRuZzz
Антикодер
681 / 583 / 29
Регистрация: 15.09.2012
Сообщений: 2,531
18.02.2014, 10:12 #12
Может повторюсь, но Страуструп говорит о том, что нужно улучшать технику программирования. А рефакторинг это улучшение уже существующего кода. Почитать про паттерны (MVC например) помоему было бы полезнее. А изучить какое-нить новое мат. понятие и применить знания программе самое полезное занятие. Поэтому книга Кнута так популярна. Программы можно и нужно оставлять недоделанными если это мешает приобретению новых навыков.
0
mustimur
268 / 222 / 57
Регистрация: 22.11.2013
Сообщений: 832
Записей в блоге: 1
18.02.2014, 10:27 #13
Цитата Сообщение от XRuZzz Посмотреть сообщение
Программы можно и нужно оставлять недоделанными
Боюсь что не соглашусь с Вами: умение достичь поставленной цели, тоже дорого стоит. Набив шишки на лбу по корявому коду в следующий раз будешь понимать причину их и обходить. Поэтому я не понимаю Ваше высказывание:
Цитата Сообщение от XRuZzz Посмотреть сообщение
мешает приобретению новых навыков.
В любом случае ты приобретаешь новые навыки. Если ты конечно не занят решением типовых задач конечно, но если это даже так то вряд ли ты их решаешь в этом случае по своей воли (для удовольствия своего), азначит ты их все равно должен решить....
0
XRuZzz
Антикодер
681 / 583 / 29
Регистрация: 15.09.2012
Сообщений: 2,531
18.02.2014, 10:37 #14
Эта мысль более точно выражена в книге Дейтела, который говорил, что вы делаете только некоторое приближение к идеальной реализации.

Просто хотелось бы предостеречь от ситуации, когда долго что-то пишете бесконечно приближаясь к идеалу, а потом оказывается, что это уже давно реализовано лучшим образом в какой нибудь библиотеке, например в бусте. Впрочем я и сам этим страдаю.
0
mustimur
268 / 222 / 57
Регистрация: 22.11.2013
Сообщений: 832
Записей в блоге: 1
18.02.2014, 10:49 #15
Цитата Сообщение от XRuZzz Посмотреть сообщение
делаете только некоторое приближение к идеальной реализации
А вот с этим, согласен. Постоянно совершенствовать не всегда целесообразно, иногда имеет смысл начать с начала и идти по новому пути. Но глагол "совершенствовать" применим к рабочему (законченному) проекту, а не к половинному (вот его бросать не рекомендую).
Цитата Сообщение от XRuZzz Посмотреть сообщение
Впрочем я и сам этим страдаю.
Все мы этим страдаем
0
18.02.2014, 10:49
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.02.2014, 10:49
Привет! Вот еще темы с ответами:

Работа с экраном в текстовом режиме (вывод всех цветов фона, разделяя цвета паузой) - C++
Пожалуйста подскажите, как сделать вывод всех цветов фона, разделяя цвета паузой. Задание: Дополнить меню функциональной клавишей F6:...

Создание 2D игр. Начало - C++
Уважаемые форумчане! Помогите: покидайте ссылок на ресурсы, связанные с разработкой 2D игр - платформеров(самых примитивных) на С++ на...

Создание конструкторов игр - C++
Вопрос этот поднимал в теме про xna, но понял что ответа на него там не получу. Всем привет! Решил задать вопрос, как работает 2d игровой...

Создание 2д игр под android на C++ - C++
Доброго времени суток. Очень часто задаюсь мыслью что делаю что либо зря.. и вот такая мысля меня посетила снова, и я решился спросить у...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru