Форум программистов, компьютерный форум, киберфорум
Программирование игр
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.81/37: Рейтинг темы: голосов - 37, средняя оценка - 4.81
Труд вопреки насмешкам
 Аватар для Etyuhibosecyu
363 / 181 / 41
Регистрация: 13.07.2017
Сообщений: 4,845
Записей в блоге: 14

Что нужно, чтобы разрабатывать игру быстрее?

11.05.2022, 15:49. Показов 9034. Ответов 88
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
У меня есть проект по созданию игры. Сначала я разрабатывал ее быстро - по версии каждый месяц. Но потом разработка резко замедлилась, несмотря на то, что количество контента на процент разработки было пересчитано не в большую, а наоборот, в меньшую сторону (ну, так бывает, изначальный расчет показался неверным, о верности текущего судить не берусь). Что я делаю для ускорения разработки:
1. Отказался от моделирования в пользу доступных в Интернете моделей и пакетов Free for the Month.
2. Регулярно произвожу разнообразные технические улучшения, позволяющие не выполнять одну и ту же работу множество раз.
3. Создал таблицу, в которую записываю все изменения, кроме исправления багов, и подсчитываю очки за них, зависящие от сложности и значимости.
4. Просматриваю старые темы по поводу каких-либо ошибок, вместо того, чтобы каждый раз создавать новую.
5. И многое другое, всего сходу и не вспомнить...
Но несмотря на это, за полтора года игра разработана всего на 9%. Если это соотношение экстраполировать, получится, что на разработку всей игры уйдет не меньше 18 лет. Не хотелось бы положить всю взрослую жизнь на одну игру, не так ли? В слогане одной из компаний по разработке игр написано "новая игра каждый день". И это была не корпорация в стиле Ubisoft, а сравнительно небольшая и ничем не выдающаяся "фирмочка". Даже если предположить, что рекламный слоган в буквальном смысле "утрирует", каждой игрой занимается 20 работников (учитывая размер компании, больше вряд ли), MMORPG в 10 раз сложнее какого-нибудь шутера или квеста, а половина моего рабочего времени уходит на посторонние проекты, так и не достигающие реализации, получится, что я могу выпускать новую игру каждые 3 * 20 * 10 / 50% = 1200 дней, или чуть больше трех лет и трех месяцев, но никак не 18 лет. И это при предельных расчетах! Взяв более "реальные" числа - например, слоган преувеличивает в 2 раза, над профессиональной игрой работает 12-15 человек, разница в сложности в 5 раз и 40% времени, уходящего впустую - мы получим новый релиз каждые 8 месяцев. Или, может быть, с возрастанием количества "механизмов" для создания контента разработка будет идти все быстрее и быстрее? Ну так и количество врагов или предметов коррелирует с интегрированным показателем прогресса далеко не линейно - для сравнения, в момент 4% прогресса торговец продавал 3 предмета, в момент 8% - 13, а всего планируется несколько десятков или сотен торговцев с суммарным количеством предметов в десятки тысяч (вы угадали, многие будут повторяться). В любом случае, мне кажется, разработка моей игры замедлилась слишком сильно. И это при том, что я взял самый мощный из игровых движков - Unreal Engine. В чем причина? Может быть, у профессионалов есть какие-то особые программы, или какие-то расширения к движкам, которые не доступны публично, и которые ускоряют разработку? Ну я же не думаю, что профессионалы все поголовно намного быстрее двигают руками? Разумеется, такие есть, но вряд ли они задержатся на рабочем месте надолго, так как люди, у которых все "горит", очень неаккуратны и вспыльчивы. Может кто-то объяснить мне, что такое есть у профессионалов, что позволяет редко какой их игре быть в разработке больше года, и не позволяет мне разработать свою хотя бы за пять лет?
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
11.05.2022, 15:49
Ответы с готовыми решениями:

Что нужно знать, чтобы написать сетевую игру
Покурил немного эту тему. Насколько понял, "на сокетах никто уже вчистую не программирует, ибо есть ведь WCF" (c) Это правильно? ...

Какое ПО нужно, чтобы разрабатывать WPF-приложения?
Здравствуйте. Вопрос такой: какое ПО нужно, чтобы разрабатывать WPF-приложения. Я сижу (не бейте сильно) на MS VS 2005. Слышал, что MS VS...

С чего нужно начинать, чтобы полноценно научиться разрабатывать программы и игры
Уважаемые форумчане помогите обычному парню освоить С#. Посоветуйте с чего нужно начинать, чтобы полноценно научиться разрабатывать...

88
Just Do It!
 Аватар для XLAT
4220 / 2684 / 656
Регистрация: 23.09.2014
Сообщений: 9,241
Записей в блоге: 3
13.05.2022, 13:12
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Etyuhibosecyu Посмотреть сообщение
Не знаю, хватит ли меня еще на пару глав, или лучше бросить сразу...
вы же понимаете, что тогда вы обречены на 18 лет и не факт что уложитесь?
0
Труд вопреки насмешкам
 Аватар для Etyuhibosecyu
363 / 181 / 41
Регистрация: 13.07.2017
Сообщений: 4,845
Записей в блоге: 14
13.05.2022, 13:31  [ТС]
Цитата Сообщение от XLAT Посмотреть сообщение
ок,
спрошу вас прямо:
какие паттерны проектирования вы используете?
Ну, если говорить про Шарп...
1. Отказ перебирать коллекцию в цикле в пользу LINQ, который считаю киллер-фичей Шарпа.
2. Отказ создавать на каждый чих по классу в пользу out и кортежей.
3. Отказ от массивов в пользу списков.
4. Использую большие статические классы в качестве списков функций.
5. Активно использую pattern matching (оператор is), прежде всего для проверки типов, явное приведение стараюсь для определения подкласса не использовать, только в числах и char.
Продолжать?

Добавлено через 4 минуты

Не по теме:

Да, там эти главы короткие. Прочитал еще две. Какой-то поток сознания, а не книга...

1
Just Do It!
 Аватар для XLAT
4220 / 2684 / 656
Регистрация: 23.09.2014
Сообщений: 9,241
Записей в блоге: 3
13.05.2022, 13:37
Цитата Сообщение от Etyuhibosecyu Посмотреть сообщение
Ну, если говорить
хм, даже стесняюсь лол поставить, ммм, как у вас тут всё запущено...

Цитата Сообщение от Etyuhibosecyu Посмотреть сообщение
Ну, если говорить
это скорее языковые идиомы, а не паттерны проектирования ...

Цитата Сообщение от Etyuhibosecyu Посмотреть сообщение
про Шарп...
паттерны проектирования не привязаны ни к какому яп'у.
0
Труд вопреки насмешкам
 Аватар для Etyuhibosecyu
363 / 181 / 41
Регистрация: 13.07.2017
Сообщений: 4,845
Записей в блоге: 14
13.05.2022, 13:40  [ТС]
Цитата Сообщение от XLAT Посмотреть сообщение
паттерны проектирования не привязана ни к какому яп'у.
Ну, в таком случае у меня не паттерново-ориентированное мышление.
0
Just Do It!
 Аватар для XLAT
4220 / 2684 / 656
Регистрация: 23.09.2014
Сообщений: 9,241
Записей в блоге: 3
13.05.2022, 13:43
у Мартина & К. есть ещё и такая книжка:
Мартин Роберт К., Ньюкирк Джеймс В., Косс Роберт С. Быстрая разработка программ: принципы, примеры, практика.

прямо так и называется, как по вашему сабжу:
Быстрая разработка программ

но эту я не читал и не знаю, что там и будет ли лично для меня сильно полезная,
но в любом случае полезная будет)
0
Труд вопреки насмешкам
 Аватар для Etyuhibosecyu
363 / 181 / 41
Регистрация: 13.07.2017
Сообщений: 4,845
Записей в блоге: 14
13.05.2022, 13:46  [ТС]
Цитата Сообщение от XLAT Посмотреть сообщение
есть ещё и такая книжка:
Мне бы хоть с этой справиться...
0
Just Do It!
 Аватар для XLAT
4220 / 2684 / 656
Регистрация: 23.09.2014
Сообщений: 9,241
Записей в блоге: 3
13.05.2022, 13:47
Цитата Сообщение от Etyuhibosecyu Посмотреть сообщение
Ну, в таком случае у меня не паттерново-ориентированное мышление.
это легко проверить:
есть ли у вас в коде интерфейсы?
ну или применительно к терминологии C++: есть ли у вас в коде абстрактные классы ради полиморфизма?

суть большинства наиболее полезных паттернов как правило всегда реализована на полиморфной фиче.
0
Труд вопреки насмешкам
 Аватар для Etyuhibosecyu
363 / 181 / 41
Регистрация: 13.07.2017
Сообщений: 4,845
Записей в блоге: 14
13.05.2022, 14:41  [ТС]
XLAT, получается, что эти крестики-нолики я написал быстро, а чтобы ими воспользоваться, потребовалось длительное время, правильно я понял? Ну, это из-за обстоятельств, что не обновил среду, а потом все сразу навалилось. Если брать диапазон 1-5, то я хоть на тройку тяну? Вы же спросили, за сколько я смогу написать, а не сделать готовым к массовому пользованию...
Цитата Сообщение от XLAT Посмотреть сообщение
есть ли у вас в коде интерфейсы?
В одном из проектов есть реализация интерфейсов классом BitList и несколькими еще не завершенными. Планирую сделать свой аналог IList, только с индексом типа mpz_t, и реализовать его в своих классах, но не знаю, скоро ли это будет.

Добавлено через 26 минут
XLAT, а вам, как я понял, нравятся Плюсы? А если не секрет, за что? Есть какая-то киллер-фича или просто потому, что привыкли?
0
Just Do It!
 Аватар для XLAT
4220 / 2684 / 656
Регистрация: 23.09.2014
Сообщений: 9,241
Записей в блоге: 3
13.05.2022, 14:51
Цитата Сообщение от Etyuhibosecyu Посмотреть сообщение
а чтобы ими воспользоваться, потребовалось длительное время, правильно я понял?
ну, тут мы вышли за рамки программирования,
и просто проблема чисто философская,
можно ли считать ОТКРЫТИЕ совершённым игру законченной,
если о нём вообще никто не знает релиза так и не было?

сама по себе игра это не только программирование и дизайн уровней,
возможно, процент законченности игры должен измеряться в количестве проданных копий,
но это неточно.

Цитата Сообщение от Etyuhibosecyu Посмотреть сообщение
аналог IList
хм, преждевременная оптимизация детектид.
у вас же есть движок, зачем это низкоуровневое кодирование?

вы должны быть в курсе, что "преждевременная оптимизация" часто убивает проект.

---

вот ещё важная цитата от Макконнелла.

там есть очень важный момент, касаемо к проблеме низкой скорости разработки.

Не по теме:

Цитата Сообщение от Etyuhibosecyu Посмотреть сообщение
а вам, как я понял, нравятся Плюсы?
я могу на них писать, как на бейсике или как на питоне (имея некий слой абстракции),
но, например, в питоне есть то, чего нет на С++ и это не языковые конструкции,
а это уже куча готовых к использованию предметных библиотек, которые легко можно подключить.

Цитата Сообщение от Etyuhibosecyu Посмотреть сообщение
Есть какая-то киллер-фича или просто потому, что привыкли?
киллер-фича плюсов это ВСЕДОЗВОЛЕННАЯ СВОБОДА,
поэтому чтобы хорошо себя на них чувствовать,
нужна уже иметь в голове порядок и самодисциплину)

0
Труд вопреки насмешкам
 Аватар для Etyuhibosecyu
363 / 181 / 41
Регистрация: 13.07.2017
Сообщений: 4,845
Записей в блоге: 14
13.05.2022, 14:56  [ТС]
Цитата Сообщение от XLAT Посмотреть сообщение
у вас же есть движок, зачем это низкоуровневое кодирование?
У меня только "линейка" на движке, а все остальное на Шарпе.
0
Just Do It!
 Аватар для XLAT
4220 / 2684 / 656
Регистрация: 23.09.2014
Сообщений: 9,241
Записей в блоге: 3
13.05.2022, 14:58
Цитата Сообщение от Etyuhibosecyu Посмотреть сообщение
Сначала я разрабатывал ее быстро - по версии каждый месяц
а, интересно, играбельное демо есть?
0
Труд вопреки насмешкам
 Аватар для Etyuhibosecyu
363 / 181 / 41
Регистрация: 13.07.2017
Сообщений: 4,845
Записей в блоге: 14
13.05.2022, 15:01  [ТС]
Цитата Сообщение от XLAT Посмотреть сообщение
там есть очень важный момент, касаемо к проблеме низкой скорости разработки.
Там нет признаков, позволяющих понять, что какое-либо действие является одним из этих:
▷ сложное решение простой проблемы;
▷ простое, но неверное решение сложной проблемы;
▷ неадекватное сложное решение сложной проблемы.
Добавлено через 1 минуту
Цитата Сообщение от XLAT Посмотреть сообщение
а, интересно, играбельное демо есть?
Можете покопаться в дебрях соответствующего раздела...
0
Just Do It!
 Аватар для XLAT
4220 / 2684 / 656
Регистрация: 23.09.2014
Сообщений: 9,241
Записей в блоге: 3
13.05.2022, 15:19
Цитата Сообщение от Etyuhibosecyu Посмотреть сообщение
Там нет признаков, позволяющих понять
там что нужно понять:
что в любом проекте можно выделить существенные свойства и не существенные.

на не существенные можно забить.

реализовывать только существенные.
0
Труд вопреки насмешкам
 Аватар для Etyuhibosecyu
363 / 181 / 41
Регистрация: 13.07.2017
Сообщений: 4,845
Записей в блоге: 14
13.05.2022, 15:48  [ТС]
XLAT, а является ли нормальной такая особенность, встречающаяся в моих программах: мне постоянно приходится повторять однотипные действия вместо разработки новых фич: например, в линейке - расставлять индексы врагам и списки координат их возрождения после смерти - выбираются случайные координаты из этого списка, но только в пределах принадлежащим этому типу врагов, поэтому при добавлении новых типов врагов приходилось добавлять списки координат; или в языке программирования - однотипные алгоритмы создания, получения, установки и удаления переменной или свойства при добавлении нового типа; так вот, эти действия добавляют в мою работу страдания, и когда это уже становится невыносимым - например, количество однотипных действий переваливает за сотню - я нахожу способ их автоматизировать (как минимум частично). Программирование такое и есть, или можно пойти по менее мучительному пути?
0
Just Do It!
 Аватар для XLAT
4220 / 2684 / 656
Регистрация: 23.09.2014
Сообщений: 9,241
Записей в блоге: 3
13.05.2022, 17:25
Цитата Сообщение от Etyuhibosecyu Посмотреть сообщение
в линейке - расставлять индексы врагам и списки координат их возрождения после смерти - выбираются случайные координаты из этого списка, но только в пределах принадлежащим этому типу врагов, поэтому при добавлении новых типов врагов приходилось добавлять списки координат; или в языке программирования - однотипные алгоритмы создания, получения, установки и удаления переменной или свойства при добавлении нового типа; так вот, эти действия добавляют в мою работу страдания, и когда это уже становится невыносимым - например, количество однотипных действий переваливает за сотню
это не нормально.
всё программирование это про автоматизацию однотипных действий.

Цитата Сообщение от Etyuhibosecyu Посмотреть сообщение
или можно пойти по менее мучительному пути?
например,
пишите шаблоны.

здесь что-то намутил как макет скелета консольной RTS:
Кликните здесь для просмотра всего текста

тут легко добавить демона, тут все демоны в составе каждый в своей армии ...
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
130
131
132
133
134
135
136
137
138
139
140
141
142
#include <iostream>
#include <cmath>
#include <cstdlib>
#include <string>
#include <vector>
#include <algorithm>
#include <chrono>
#include <thread>
 
#define  l(v)    std::cout << #v << " = " << (v) << "\n";
#define  DRAW(v) std::cout << v;
 
#include <ctime>
#include <cstdlib>
struct Rand
{   Rand(            ){   srand((unsigned)time(0));}
    Rand(unsigned sid){   srand(sid);              }
    int operator()(int range_max) const
    {   return rand() % (range_max);
    }
}rrand;
 
struct Vector2{ size_t x, y; };
 
///-------------------------|
/// Клетка ландшафта.       |
///-------------------------:
struct ICell
{   Vector2        position;
    virtual void draw() = 0;
};
 
///-------------------------|
/// Земля.                  |
///-------------------------:
struct Cell_Ground : public ICell
{   void draw(){DRAW('.')}; /// <<<--- Тут всё очень специфически!
};
 
///-------------------------|
/// Демон A.                |
///-------------------------:
struct Demon_A : public ICell
{   void draw(){DRAW('A')}; /// <<<--- Тут всё очень специфически!
};
 
///-------------------------|
/// Демон B.                |
///-------------------------:
struct Demon_B : public ICell
{   void draw(){DRAW('B')}; /// <<<--- Тут всё очень специфически!
};
 
///-------------------------|
/// Фабрика демонов.        |
///-------------------------:
struct Fabric
{   template<typename T>
    T* get(){ return new T; }
};
 
///-------------------------|
/// Мир.                    |
///-------------------------:
struct  World
{       World(size_t x, size_t y)
            : m(y, std::vector<ICell*>(x, new Cell_Ground))
        {
        }
    std::vector<std::vector<ICell*>> m;
};
 
///-------------------------|
/// Армия.                  |
///-------------------------:
template<typename T>
struct  Army
{       Army(World& w, int amount) : world(w)
        {
            while(amount--)
            {   T* u = fab.get<T>();
                u->position.x = (size_t)rrand(world.m[0].size());
                u->position.y = (size_t)rrand(world.m   .size());
                m.push_back(u);
            }
 
            for(auto& e : m) world.m[e->position.y][e->position.x] = e;
        }
 
    World&      world;
    Fabric        fab;
    std::vector<T*> m;
};
 
///-------------------------|
/// Особый демон - игрок.   |
///-------------------------:
struct  Player : public ICell
{   void draw(){DRAW('I')};
 
private:
};
 
///-------------------------|
/// Рендер мира.            |
///-------------------------:
std::ostream& operator<<(std::ostream& o, World& w)
{   for    (const auto& r : w.m)
    {   for(const auto& e : r  )
        {   e->draw();
        }   DRAW('\n')
    }       DRAW('\n')
    return o;
}
 
///-------------------------|
/// Игра.                   |
///-------------------------:
struct  Game
{       Game() :    world(15, 6),
                    A (world, 5),
                    B (world, 3)
        {   world.m[0][0] = new Player;
            loop();
        }
 
    World          world;
    Army<Demon_A>      A;
    Army<Demon_B>      B;
 
private:
    void loop()
    {   DRAW (world);
    }
};
 
///----------------------------------------------------------------------------|
/// main.
///----------------------------------------------------------------------------:
int main()
{   Game game; std::cin.get();
}


Цитата Сообщение от Etyuhibosecyu Посмотреть сообщение
расставлять индексы врагам и списки координат ...
вы можете написать прототип этого вашего процесса в простом примере,
примерно, как я сделал выше?
0
Труд вопреки насмешкам
 Аватар для Etyuhibosecyu
363 / 181 / 41
Регистрация: 13.07.2017
Сообщений: 4,845
Записей в блоге: 14
13.05.2022, 18:38  [ТС]
Цитата Сообщение от XLAT Посмотреть сообщение
вы можете написать прототип этого вашего процесса в простом примере,
примерно, как я сделал выше?
Попробую. Но это только набросок, так как сейчас у меня нет Visual Studio, и пытаться качать ее сейчас - неблагодарное дело, оставлю на следующую ночь, и готова будет не раньше завтрашнего утра... Так что могут быть синтаксические ошибки, прошу уже вам самим как-нибудь их исправить, а указать на существенные ошибки.
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
//Объявления - где-то в статическом классе...
public static readonly List<Enemy> enemies = new() { new Cube(), new Cube(), new Tetrahedron(), new Tetrahedron(), new Sphere(), new Sphere(), ... }; //Enemy - абстрактный класс, а дальше конкретные
public static readonly Dictionary<Type, List<int>> enemySpawnTransforms = new();
public static readonly List<Type> enemyTypes = new();
public static readonly List<int> enemyTypeIndexes = new();
public static readonly List<Vector> enemyLocations = new();
public static readonly List<float> enemyYaws = new();
public static readonly List<Effects> enemyEffects = new();
//Можно и дальше добавлять свойства врагам
//Сохранение
public static void Save()
{
    Dictionary<Type, int> dic = new();
    foreach (var enemy in enemies)
    {
        if (dic.TryGetValue(typeof(enemy), out int value))
        {
            enemyTypeIndexes.Add(value);
        }
        else
        {
            enemyTypes.Add(typeof(enemy));
            enemyTypeIndexes.Add(dic.Count);
            dic.Add(typeof(enemy), dic.Count);
        }
        enemyLocations.Add(enemy.Transform.Location);
        enemyYaws.Add(enemy.Transform.Rotation.Z);
        enemyEffects.Add(enemy.Effects);
    }
    SerializeToFile(new object[] { enemyTypes, enemyTypeIndexes, enemyLocations, enemyYaws });
}
//Загрузка
public static void Load()
{
    DeserializeFromFile(new object[] { enemyTypes, enemyTypeIndexes, enemyLocations, enemyYaws });
    Dictionary<Type, int> dic = new();
    for (int i = 0; i < enemyTypeIndexes.Count; i++)
    {
        if (!dic.TryGetValue(typeof(enemyTypes[enemyTypeIndexes[i]]), out int value))
        {
            value = 0;
        }
        try
        {
            var enemy = enemies.Where(x => typeof(x).Equals(enemyTypes[enemyTypeIndexes[i]])).ElementAt(value); //Пока врагов не много тысяч, это работает, потом подумаю, как улучшить. Если это вылетает, пропускаем эту итерацию
            enemy.Transform.Location = enemyLocations[i];
            enemy.Transform.Rotation.Z = enemyYaws[i];
            enemy.Effects = enemyEffects[i];
            enemySpawnTransforms[enemyTypes[enemyTypeIndexes[i]]].Add(value);
            dic[enemyTypes[enemyTypeIndexes[i]]] = value + 1;
        }
        catch
        {
        }
    }
}
0
Just Do It!
 Аватар для XLAT
4220 / 2684 / 656
Регистрация: 23.09.2014
Сообщений: 9,241
Записей в блоге: 3
13.05.2022, 19:17
Цитата Сообщение от Etyuhibosecyu Посмотреть сообщение
набросок
Code
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
/// Псевдокод...
 
interface IEnemy
{
    public void Save();
    public void load();
}
 
public class Cube : IEnemy
{
    public void Save(){ /* ...*/ }
    public void load(){ /* ...*/ }
 
    /// тут жутко специфические свойства ...
 
    /// ... добавили свойство сюда - сразу прописали в Save и load
    /// всё.
}
 
public class Tetrahedron : IEnemy
{
    public void Save(){ /* ...*/ }
    public void load(){ /* ...*/ }
    
    /// тут жутко специфические свойства ...
 
    /// ... добавили свойство сюда - сразу прописали в Save и load
    /// всё.
}
 
class Tetrahedron : public IEnemy
{
    public void Save(){ /* ...*/ }
    public void load(){ /* ...*/ }
    
    /// тут жутко специфические свойства
 
    /// ... добавили свойство сюда - сразу прописали в Save и load
    /// всё.
}
 
public static readonly List<IEnemy> enemies = new()
{   new Cube(),
    new Tetrahedron(),
    ...
}; 
 
//Сохранение
public static void Save()
{   foreach (var enemy in enemies)
    {   enemy.save();
    }
}
//Загрузка
public static void Load()
{   foreach (var enemy in enemies)
    {   enemy.load();
    }
}
0
Труд вопреки насмешкам
 Аватар для Etyuhibosecyu
363 / 181 / 41
Регистрация: 13.07.2017
Сообщений: 4,845
Записей в блоге: 14
13.05.2022, 19:25  [ТС]
XLAT, а я не согласен. Ваш код устойчив только к добавлению врага, а новое свойство придется прописывать у всех врагов. А у меня добавление врагов обрабатывается автоматом, а новое свойство придется прописать всего три раза - в объявлениях, в Save и в Load. Это же лучше, чем неопределенно большое число раз, или неправда?
0
Just Do It!
 Аватар для XLAT
4220 / 2684 / 656
Регистрация: 23.09.2014
Сообщений: 9,241
Записей в блоге: 3
13.05.2022, 19:46
Цитата Сообщение от Etyuhibosecyu Посмотреть сообщение
а новое свойство придется прописывать у всех врагов
нет, не придётся:

Code
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
/// Псевдокод...
 
interface IEnemy
{
    public void Save();
    public void load();
    
}
 
public class SL : IEnemy
{
    public void Save(){ /* ...*/ }
    public void load(){ /* ...*/ }
 
    /// Тут общие свойства для всех врагов.
}
 
public class Cube : SL
{
    public void Save(){ SL::Save(); /* ...*/ }
    public void load(){ SL::load(); /* ...*/ }
 
    /// тут жутко специфические свойства ...
 
    /// ... добавили свойство сюда - сразу прописали в Save и load
    /// всё.
}
 
public class Tetrahedron : SL
{
    public void Save(){ /* ...*/ }
    public void load(){ /* ...*/ }
    
    /// тут жутко специфические свойства ...
 
    /// ... добавили свойство сюда - сразу прописали в Save и load
    /// всё.
}
 
public static readonly List<IEnemy> enemies = new()
{   new Cube(),
    new Tetrahedron(),
    ...
}; 
 
//Сохранение
public static void Save()
{   foreach (var enemy in enemies)
    {   enemy.save();
    }
}
//Загрузка
public static void Load()
{   foreach (var enemy in enemies)
    {   enemy.load();
    }
}
Цитата Сообщение от Etyuhibosecyu Посмотреть сообщение
добавлению врага
речь идёт о типе нового врага!
класс этого врага нужно написать целиком!
0
Труд вопреки насмешкам
 Аватар для Etyuhibosecyu
363 / 181 / 41
Регистрация: 13.07.2017
Сообщений: 4,845
Записей в блоге: 14
13.05.2022, 20:06  [ТС]
XLAT, а что возразите против саботажа в виде new SL()? Лучше выкинуть интерфейс и сделать абстрактный класс Enemy с методами Load() и Save() (общие свойства) и абстрактными методами LoadSpecific() и SaveSpecific() (специфические свойства). Абстрактный класс хорош тем, что может содержать как абстрактные методы ("чистые виртуальные функции" в терминологии C++), так и конкретные.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
13.05.2022, 20:06

Что нужно знать, чтобы написать игру "Змейка"
Подскажите пожалуйста,хочу написать игру &quot;змейка&quot; кое-какие наработки уже есть,но пока весьма скудные. Что-нибудь можно почитать конкретно...

На чем разрабатывать игру монополия?
Я пробую себя в новых направлениях. Делаю курсовую. Хочу сделать монополию на с#. Подскажите на какой программе лучше, это сделать? где...

Что нужно сделать, что бы ноутбук стал быстрее работать?
Все привет! Просьба уточнить как сделать так что бы ноут стал быстрее работать?

Вероятно ошибки. Что надо сделать, чтобы программа быстрее дала результат
Здравствуйте, коллеги! Помогите, пожалуйста! Подскажите, что надо сделать , что программа быстро дает результат. Спасибо! С...

Определите, в какой точке нужно пересечь границу леса и поля, чтобы как можно быстрее добраться из точки А в точку Б
осталась еще одна программа для зачета, никак не могу разобраться Рассмотрим карту, левый нижний угол которой имеет координаты (0; 0), а...


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

Или воспользуйтесь поиском по форуму:
60
Ответ Создать тему
Новые блоги и статьи
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
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. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru