Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 5.00/1: Рейтинг темы: голосов - 1, средняя оценка - 5.00
Just Do It!
 Аватар для XLAT
4219 / 2680 / 656
Регистрация: 23.09.2014
Сообщений: 9,235
Записей в блоге: 3

Совместное создание игры

08.01.2025, 12:45. Показов 45249. Ответов 942
Метки нет (Все метки)

 Комментарий администратора 
Обсуждение вынесено из темы Ищу человека для совместного изучения программирования


Цитата Сообщение от Royal_X Посмотреть сообщение
Вот на моем неигровом ноуте последний UE без проблем запускается и не тормозит даже.
ок.
если ТС готов варганить со мной сапера, то я сделаю ещё одну попытку его(пожалуй 4 версию) установить и испытать.

собсно что нужно: формально отображать некие графические модели на экране в нужном его месте нужного масштаба,
для теста сойдут спрайты - а потом можно и анимированные модели голых девочек,
на усмотрение геймдиза))

и больше ничаво.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
08.01.2025, 12:45
Ответы с готовыми решениями:

Для чего создан язык С++?
Для чего создан язык С++????

создан массив
создан массив автовладельцев, для каждого известны Ф.И.О., номер, адрес...,Выяснить есть ли автовладельцы у которых имеются больше 1-ой...

Теория игр, массивы
Есть задание (прикрепил его в виде файла к сообщению). Есть решение для 12-ого варианта на BORLANDC, у меня 2-ой. Я изменил в начале...

942
Just Do It!
 Аватар для XLAT
4219 / 2680 / 656
Регистрация: 23.09.2014
Сообщений: 9,235
Записей в блоге: 3
15.02.2025, 19:59  [ТС]
Цитата Сообщение от XLAT Посмотреть сообщение
пишу сервер
рабочий черновик файла gate.h с целевым классом Gate для сервера готов:
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
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
#ifndef GATE_H
#define GATE_H
///----------------------------------------------------------------------------|
/// "gate.h"
///----------------------------------------------------------------------------:
#include <SFML/Network.hpp>
 
#include <functional>
#include <iostream>
#include <map>
 
#include "model.h"
 
inline std::string cutStr(std::string s)
{   auto p = s.rfind("sources"); return s.substr(p, s.size() - p);
}
 
#define ASSERT(a) if(!(a)) \
{   std::cout << "ASSERT_ERROR: " \
              << "FILE: \"" << cutStr(__FILE__)  << "\", " \
              << "LINE: "   << __LINE__ \
              << "\n"; throw(-1); }
 
inline void showTestResult(const char* test, const bool result)
{   std::cout   << "  " << test << "::test() ---> "
                << (result ? "GOOD!" : "FAIL") << std::endl;
}
 
namespace minesweeper
{
    struct Game;
 
    ///------------------------------------------------------------------------|
    /// Парсер команд с аргументами.
    ///------------------------------------------------------------------------:
    struct  RPCParser
    {       RPCParser()
            {
            }
 
        ///----------------------------|
        /// Приём пакета.              |
        ///----------------------------:
        void operator<<(sf::Packet& p)
        {
            packet = &p;
 
            p >> command;
 
            sf::Uint32 Size; p >> Size;
 
            a.resize(Size);
 
            for(sf::Uint32 i = 0; i < Size; ++i) p >> a[i];
 
            packet->clear();
        }
 
        const Arr1d& getArgs() const { return a; }
 
        ///----------------------------|
        /// - команда.                 |
        /// - аргументы.               |
        /// - пакет входной/выходной.  |
        ///----------------------------:
        std::string             command;
        std::vector<unsigned>         a;
        sf::Packet*     packet{nullptr};
 
        ///----------------------------|
        /// Включить дебаг.            |
        ///----------------------------:
        inline static bool ISDEBUG{true};
 
        ///----------------------------|
        /// Дебаг.                     |
        ///----------------------------:
        std::string debug() const
        {
            if(!ISDEBUG) return "";
 
            std::stringstream   ss;
            {   ss << "command: \"" << command << ' ';
                for(const auto  e : a) ss << e << ' ';
            }
 
            std::string s(ss.str()); s.pop_back(); s += "\"\n";
            return      s;
        }
 
        bool isAnswer() const
        {   return packet != nullptr && 0 != packet->getDataSize();
        }
 
        ///----------------------------|
        /// Тест.                      |
        ///----------------------------:
        static void test()
        {
            bool result{true};
 
            RPCParser rpcParser;
 
            sf::Packet   p; p   << "inputPlot"
                                << sf::Uint32(2)
                                << sf::Uint32(20)
                                << sf::Uint32(25);
            rpcParser << p;
 
            ASSERT(rpcParser.command  == "inputPlot")
            ASSERT(rpcParser.a.size() ==  2)
            ASSERT(rpcParser.a[0]     == 20)
            ASSERT(rpcParser.a[1]     == 25)
 
            l(rpcParser.debug())
 
            showTestResult("RPCParser", result);
        }
    };
 
 
    namespace mns = minesweeper ;
    using  CArr1d = const Arr1d&;
    using  VobFoo = std::map<std::string, std::function<void()>>;
 
    ///------------------------------------------------------------------------|
    /// Все команды Сапёра.
    ///     -   "getVisual"         ответ массив : поле.
    ///     -   "startGame"         ответ "H W"  : Размер поля.
    ///     -   "inputPlot Y X "    ответ "E"    : Собщение(см.в model.h).
    ///     -   "setFlag Y X"       ответа_нет   : .
    ///------------------------------------------------------------------------:
    struct  HolderCommands : private VobFoo
    {       HolderCommands ( RPCParser& rpc);
 
        ///----------------------------|
        /// Вызов командной функции.   |
        ///----------------------------:
        void doCommand()
        {   if(const auto it = find(rpcParser.command); it != end())
            {   it->second();
            }
            else  throw("Command is absent!");
        }
 
        void reCreateGame(const unsigned W, const unsigned H);
 
    private:
        std::unique_ptr<Game> game;
        RPCParser&       rpcParser;
 
        void checkAmountArgs(CArr1d a, unsigned n)
        {   if(a.size() != n) throw("checkAmountArgs failed!");
        }
 
        bool isExistGame() const;
 
    public:
        ///----------------------------|
        /// Тест.                      |
        ///----------------------------:
        static void test();
 
        friend struct  Gate;
    };
 
 
    ///------------------------------------------------------------------------|
    /// Gate.
    ///------------------------------------------------------------------- Gate:
    struct  Gate
    {       Gate();
           ~Gate();
 
        ///----------------------------|
        /// Приём пакета.              |
        /// Ответ в этом же пакете!    |
        ///----------------------------:
        void operator<<(sf::Packet& p)
        {   try
            {   rpcParser << p;
                holderCommands.doCommand();
            }
            catch(const char* error)
            {   std::cout << "ERROR: " << error << std::endl;
                p.clear();
                return;
            }
        }
 
    private:
        RPCParser      rpcParser     ;
        HolderCommands holderCommands;
 
        std::string debugView() const;
 
    public:
        ///----------------------------|
        /// Тест.                      |
        ///----------------------------:
        static void test();
    };
}
 
#endif // header guard
с локальными тестами всё ОК:
1
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6289 / 3013 / 1051
Регистрация: 01.06.2021
Сообщений: 11,323
15.02.2025, 21:09
XLAT, я в посте Совместное создание игры писал, что у моноширинных шрифтов высота почти в два раза больше ширины. Когда нет желания менять scale шрифта консоли, то быстрым решениям является просто добавление пробела после каждого символа для выравнивания по ширине. Поменяй функцию вывода.
1
Just Do It!
 Аватар для XLAT
4219 / 2680 / 656
Регистрация: 23.09.2014
Сообщений: 9,235
Записей в блоге: 3
15.02.2025, 21:52  [ТС]
Цитата Сообщение от Royal_X Посмотреть сообщение
Поменяй функцию вывода.
это же дебаг, зачем так парится...
но, ок, поменяю)
0
Just Do It!
 Аватар для XLAT
4219 / 2680 / 656
Регистрация: 23.09.2014
Сообщений: 9,235
Записей в блоге: 3
15.02.2025, 21:59  [ТС]
Цитата Сообщение от XLAT Посмотреть сообщение
но, ок, поменяю)
2
Just Do It!
 Аватар для XLAT
4219 / 2680 / 656
Регистрация: 23.09.2014
Сообщений: 9,235
Записей в блоге: 3
16.02.2025, 09:47  [ТС]
тут косяк:
Цитата Сообщение от XLAT Посмотреть сообщение
struct  HolderCommands : private VobFoo
так как изначально этот класс не планировался для держания игры,

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

поэтому поправил коллекцию в статическое поле:
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
    struct HolderCommands;
    using  CArr1d  = const Arr1d&;
    using  VobFoos = std::map<std::string, std::function<void(HolderCommands*)>>;
 
    ///------------------------------------------------------------------------|
    /// Все команды Сапёра.
    ///     -   "startGame"         ответ "H W"    : Размер поля.
    ///     -   "getVisual"         ответ "массив" : Поле.
    ///     -   "inputPlot X Y"     ответ "EVENT"  : Собщение(см.в model.h).
    ///     -   "setFlag   X Y"     ответа_нет     : .
    ///------------------------------------------------------------------------:
    struct  HolderCommands
    {       HolderCommands ( RPCParser& rpc);
 
        ///----------------------------|
        /// Вызов командной функции.   |
        ///----------------------------:
        void doCommand()
        {   if(const auto it = foo.find(rpcParser.command); it != foo.end())
            {   it->second(this);
            }
            else  throw("Command is absent!");
        }
 
        void reCreateGame(const unsigned W, const unsigned H);
 
    private:
        std::unique_ptr<Game> game;
        RPCParser&       rpcParser;
 
        ///----------------------------|
        /// Коллекция команд.          |
        ///----------------------------:
        static VobFoos foo;
 
        void checkAmountArgs(CArr1d a, unsigned n)
        {   if(a.size() != n) throw("checkAmountArgs failed!");
        }
 
        bool isExistGame() const;
 
    public:
        ///----------------------------|
        /// Тест.                      |
        ///----------------------------:
        static void  test();
        
        friend struct  Gate;
    };
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6289 / 3013 / 1051
Регистрация: 01.06.2021
Сообщений: 11,323
16.02.2025, 16:44
Цитата Сообщение от XLAT Посмотреть сообщение
а игр, ясень, будет много
консольный Steam

Добавлено через 43 минуты
Цитата Сообщение от XLAT Посмотреть сообщение
тут косяк
Разница между тестирование проекта самим разрабом и тестирование другим человеком
Кликните здесь для просмотра всего текста
1
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
16.02.2025, 17:30
Цитата Сообщение от Royal_X Посмотреть сообщение
консольный Steam
А чо. Очень интересно. Но ничего не понятно =)
А вообще, я похожую базу видел. Правда офлайн.
Там куча старых игр собрали(1000+), на флеше, но настолько нишевые, что я даже ни в одну не поиграл...

Я думал то сапер по технологии клиент-сервер.
Цитата Сообщение от XLAT Посмотреть сообщение
да, я пишу сервер на 100500 клиентов для казино-сапера.
1
 Аватар для CoderHuligan
1753 / 1019 / 257
Регистрация: 30.06.2015
Сообщений: 5,132
Записей в блоге: 56
16.02.2025, 17:33
Цитата Сообщение от SmallEvil Посмотреть сообщение
по технологии клиент-сервер
Сапер - однопользовательская игра. Тут лучше чисто браузерную игру сделать, чем городить колхоз.
1
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6289 / 3013 / 1051
Регистрация: 01.06.2021
Сообщений: 11,323
16.02.2025, 18:10
Цитата Сообщение от CoderHuligan Посмотреть сообщение
Сапер - однопользовательская игра.
А что нельзя придумать что-то новое? Идея XLAT весьма недурна: два юзера одновременно начинают играть сапер на отдельных (игроки не видят поля друг друга), но идентичных, игровых полях. Тот, кто раньше решает, тот выигрывает. Тот, кто попадает на мину, проигрывает досрочно.
1
 Аватар для CoderHuligan
1753 / 1019 / 257
Регистрация: 30.06.2015
Сообщений: 5,132
Записей в блоге: 56
16.02.2025, 18:25
Цитата Сообщение от Royal_X Посмотреть сообщение
Тот, кто раньше решает, тот выигрывает.
Ну, если только так. Но это опять же: надо устанавливать отдельное клиентское приложение. От этого сразу коробит. Вот если прямо через сайт организовать взаимодействие отдельных игроков.. Игроки регистрируются на сайте. Клиент качается в браузер. При этом можно играть не в одну какую-то игру. Сайт может предоставить много игр на любой выбор. А устанавливать клиента ради одной игры: фи..
1
place status here
 Аватар для gunslinger
3192 / 2227 / 640
Регистрация: 20.07.2013
Сообщений: 6,026
16.02.2025, 18:42
Цитата Сообщение от Royal_X Посмотреть сообщение
Разница между тестирование проекта самим разрабом и тестирование другим человеком
или так (со стороны тестера)
1
Just Do It!
 Аватар для XLAT
4219 / 2680 / 656
Регистрация: 23.09.2014
Сообщений: 9,235
Записей в блоге: 3
16.02.2025, 18:54  [ТС]
Цитата Сообщение от Royal_X Посмотреть сообщение
А что нельзя придумать что-то новое?
вот как раз тут ТЗ и нужно.
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6289 / 3013 / 1051
Регистрация: 01.06.2021
Сообщений: 11,323
17.02.2025, 17:10
XLAT, я вот размышляю над решателем сапера.

1-й этап это нахождение ячеек, в которых точно находятся мины.
Если с числом N граничат ровно N ячеек типа "неоткрытая ячейка" или "флаг", то в данных ячейках точно мины.

2-й этап это нахождение ячеек, в которых точно нет мин, на основе имеющихся данных о ячейках, в которых точно мины.
Если рядом с числом N мы точно знаем расположение всех N ячеек с минами, то естественно все остальные ячейки, граничащие с этим числом, безопасны.

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

Как по мне, думать над решателем гораздо интереснее, чем над самим сапером, учитывая, что для реализации вышеприведенного алгоритма нужно придумать что-то умное, дабы получить хорошую временную сложность...
Меня интересует именно нахождение всех безопасных ячеек и ячеек, где точно есть мины, а не одного конкретного безопасного хода.
1
 Аватар для CoderHuligan
1753 / 1019 / 257
Регистрация: 30.06.2015
Сообщений: 5,132
Записей в блоге: 56
17.02.2025, 18:01
Цитата Сообщение от Royal_X Посмотреть сообщение
если текущая позиция позволяет сделать ход, но не найдено ни одной безопасной ячейки, делаем рандомный ход.
А если такой алгоритм: если позиция (среди закрытых ячеек) не позволяет игроку найти правильный ход, и он вынужден делать ход наугад, то генерируем рэндомную позицию среди неоткрытых ячеек, исключая ячейку которую выбрал игрок. В этом случае игра гарантировано имеет выигрышную стратегию, что привлекательнее для игрока. Однако в этом случае нужно иметь игровой ИИ, который будет оценивать текущую позицию с точки зрения выигрышной стратегии.
-----
Я отказался от битового представления состояния ячейки. Состояние ячейки представлено следующим образом. Ячейка состоит из одного беззнакового байта = 8 бит. Десятки представляют из себя номера тайлов. Единицы числа от 1 до 8. Число 9 мину. Число 0 пустую ячейку. Например взять число 109. Цифра 9 значит, что мина установлена. Число 100/10=10 это например флаг. Если число 100, то мины нет и стоит флаг.
1
Just Do It!
 Аватар для XLAT
4219 / 2680 / 656
Регистрация: 23.09.2014
Сообщений: 9,235
Записей в блоге: 3
17.02.2025, 18:23  [ТС]
Цитата Сообщение от Royal_X Посмотреть сообщение
Как по мне, думать над решателем гораздо интереснее
а над ММО сервером ещё интереснее))

у меня щас 100500 вопросов мелких и не мелких до которых пока руки не доходят)
0
place status here
 Аватар для gunslinger
3192 / 2227 / 640
Регистрация: 20.07.2013
Сообщений: 6,026
19.02.2025, 14:57
Royal_X, предлагаю сделать решатель пазла (если есть желание).
Ниже картинка просто "разбивается" на части.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
  const w = 6, h = 4, w_val = ImageSource->Width / w, h_val = ImageSource->Height / h, w_dif = (ImageSandbox->Width - ImageSource->Width) / (w-1), h_dif = (ImageSandbox->Height - ImageSource->Height) / (h-1);
  double w_koef = ImageSource->Picture->Bitmap->Width / ImageSource->Width;
  double h_koef = ImageSource->Picture->Bitmap->Height / ImageSource->Height;
  int i, j;
  for (i = 0; i <= h; i++)
  {
    ImageDest->Canvas->MoveTo(0, ImageDest->Height*i/h-0.1);
    ImageDest->Canvas->LineTo(ImageDest->Width, ImageDest->Height*i/h-0.1);
  }
 
  for (i = 0; i <= w; i++)
  {
    ImageDest->Canvas->MoveTo(ImageDest->Width*i/w-0.1, 0);
    ImageDest->Canvas->LineTo(ImageDest->Width*i/w-0.1, ImageDest->Height);
  }
 
  for (i = 0; i < w; i++)
    for (j = 0; j < h; j++)
    {
      ImageDest->Canvas->TextOutW(ImageDest->Left + i * w_val, ImageDest->Top + j * h_val, j*w+i+1);
      ImageSandbox->Canvas->CopyRect(Rect(i*(w_val+w_dif), j*(h_val+h_dif), i*(w_val+w_dif)+w_val, j*(h_val+h_dif)+h_val), ImageSource->Canvas, Rect(i*w_val*w_koef, j*h_val*h_koef, (i+1)*w_val*w_koef, (j+1)*h_val*h_koef));
//    BitBlt(ImageSandbox->Canvas->Handle, i*(w_val+w_dif), j*(h_val+h_dif), i*(w_val+w_dif)+w_val, j*(h_val+h_dif)+h_val, ImageSource->Canvas->Handle, i*w_val*w_koef, j*h_val*h_koef, SRCCOPY);
    }
1
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
19.02.2025, 15:14
Цитата Сообщение от gunslinger Посмотреть сообщение
предлагаю сделать решатель пазла
В смысле?
Это задача для человека.
Она контекстно-зависима.

Добавлено через 6 минут
А если дать алгоритму готовую картинку, то не вижу смысла.
2
place status here
 Аватар для gunslinger
3192 / 2227 / 640
Регистрация: 20.07.2013
Сообщений: 6,026
19.02.2025, 15:18
Ну алгоритм (как и человек) должен знать, что нужно получить.
Куски пазла теоретически можно вращать и перемешивать, а также делать любой формы (вопрос реализации).
1
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6289 / 3013 / 1051
Регистрация: 01.06.2021
Сообщений: 11,323
19.02.2025, 15:21
SmallEvil, вообще, алгоритму можно и не дать готовую картинку. Типа написать решатель, который оценивает граничные пиксели кусков и самостоятельно склеивает.

Добавлено через 1 минуту
gunslinger, ни человеку, ни компу, не давай готовую картинку, так будет интереснее
2
place status here
 Аватар для gunslinger
3192 / 2227 / 640
Регистрация: 20.07.2013
Сообщений: 6,026
19.02.2025, 15:28
А еще можно куски пазлов терять. Чтобы реализм был.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
19.02.2025, 15:28

Решение матричных игр. Есть у кого такая программа написанная уже...
Требуется программа по решению матричных игр... С выбором размера матрицы и выдачей решения... Может кто смогёт такую сбатцать?

Запуск приложений(старых игр) в оконном режиме
День добрый, подскажите, хотелось бы реализовать свое желание запуска старых игр windo`вых(типа StarCraft) в оконном режиме, с чего начать,...

Алгоритм календаря игр (например в футболе)
необходимо составить календарь футбольных матчей, допустим есть 6 команд char *teams = {&quot;TEAM A&quot;,&quot;TEAM B&quot;,&quot;TEAM...

Движок для игр
Всем привет!!!, хотел узнать возможно ли создать движок на C++ чтобы экспортировать модели из 3ds max а после в самом движке можно было...

Выбор IDE для создания 2D игр
Здравствуйте. Задача сделать пака 2ух – мерные драчки загружая в проект анимацию-как удар(ы) и реакция на удар...(лучше всего секвенцию...


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

Или воспользуйтесь поиском по форуму:
780
Закрытая тема Создать тему
Новые блоги и статьи
Контроль уникальности строк в табличной части документа
Maks 18.06.2026
Алгоритм из решения ниже разработан на примере нетипового документа "ПланированиеСпецтехники" с табличной частью "НаличиеОборудования", разработанного в КА2. Задача: контроль уникальности строк в. . .
Клиент
Uhbif79 18.06.2026
Здесь простой клиент для работы с сервером.
Сервер
Uhbif79 18.06.2026
Выкладываю простейший сервер.
Дефенестрация
kumehtar 18.06.2026
Узнал интересное слово. Дефенестрация. Это когда ты выбрасываешь кого-либо или что-либо из окна. Возьму на вооружение)))
Дихотомия добра и зла
kumehtar 18.06.2026
Как Дзен-буддисты говорят о добре и зле: не нужно воевать против зла, нужно воевать против невежества. Тогда добро станет ествественным, и поэтому вечным. Но дело в том, что невежество всё время. . .
Своя Интернет-Компания
iceja 18.06.2026
Я программист с экономическим образованием, пишу свой проект, это SaaS для бизнесов. Мне нужен co-founder с высшим экономическим образованием, и/ или инвестор. Сейчас проект в интенсивной разработке,. . .
24 Мат модель здравосохранения: функциональные требования к строительству пищеблока
anaschu 18.06.2026
СРесурсами1: финансовый SD-контур, калькулятор функциональных требований пищеблока Сегодня разделили затраты в агенте Экономика по образцу модели НАСОСЫ, добавили расчёт ROI и построили первый. . .
23. что сделано за последнее время.
anaschu 17.06.2026
• Эталон: Клиника НИИ питания РАМН, Москва — централизованный пищеблок, 225 коек, 180 пациентов • Git: репозиторий med2, ветка абсентеизм. Рабочий файл: СРесурсами1_v4. alp • Смежный проект:. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru