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

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

08.01.2025, 12:45. Показов 45870. Ответов 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
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6296 / 3018 / 1053
Регистрация: 01.06.2021
Сообщений: 11,453
01.02.2025, 17:26
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Royal_X Посмотреть сообщение
я опубликовал свою bigint библиотеку
если увижу спрос на эту библиотеку, кроме как базы для развития Github Copilot, то в будущем опубликую остальные мои проекты.
Под спросом подразумеваю звезды на гитхабе.

XLAT, не знаешь, как популяризовать мою библу? Может быть, поставить в качестве подписи на киберфоруме ссылку на либу?
0
Just Do It!
 Аватар для XLAT
4219 / 2680 / 656
Регистрация: 23.09.2014
Сообщений: 9,235
Записей в блоге: 3
01.02.2025, 17:27  [ТС]
Цитата Сообщение от Royal_X Посмотреть сообщение
я опубликовал свою bigint библиотеку
там в описании есть упоминание того, что твоя била убица всех остальных бигинтов?
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6296 / 3018 / 1053
Регистрация: 01.06.2021
Сообщений: 11,453
01.02.2025, 17:30
XLAT, проблема в том, что другие помоечные библиотеки (не все, но многие хуже моей) имеют звезды, поэтому поиск на гитхабе выдает их, а не мою.
0
Just Do It!
 Аватар для XLAT
4219 / 2680 / 656
Регистрация: 23.09.2014
Сообщений: 9,235
Записей в блоге: 3
01.02.2025, 17:31  [ТС]
вот смотри
https://github.com/BDOTimer/Satana
у мя GMP сдохла посреди конкурса,
пришлось на MPIR перелезть.

интересно твоя бигинт число PI до хк знака досчитает за какое время?
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6296 / 3018 / 1053
Регистрация: 01.06.2021
Сообщений: 11,453
01.02.2025, 17:38
Цитата Сообщение от XLAT Посмотреть сообщение
там в описании
вот описание https://github.com/RoyalXXX/bigint

Добавлено через 55 секунд
Цитата Сообщение от XLAT Посмотреть сообщение
число PI
а при чем здесь не целое число? у меня же bigint

Добавлено через 1 минуту
XLAT, я думал реализовать BigDouble, но чёт времени нет...

Добавлено через 3 минуты
Цитата Сообщение от XLAT Посмотреть сообщение
у мя GMP сдохла посреди конкурса,
пришлось на MPIR перелезть.
слушай, я не соревнуюсь с топовыми библиотеками. Разумеется, мой код проиграет. Есть куча крутых bigint библиотек промышленного уровня и куча мат. пакетов.
Моя библиотека должна занимать свою нишу на рынке. А именно в отличие от других библиотек, она отличается простотой. Удобная штука для простых вычислений.
0
Just Do It!
 Аватар для XLAT
4219 / 2680 / 656
Регистрация: 23.09.2014
Сообщений: 9,235
Записей в блоге: 3
01.02.2025, 17:38  [ТС]
Цитата Сообщение от Royal_X Посмотреть сообщение
а при чем здесь не целое число? у меня же bigint
читай матчасть
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6296 / 3018 / 1053
Регистрация: 01.06.2021
Сообщений: 11,453
01.02.2025, 19:12
Цитата Сообщение от XLAT Посмотреть сообщение
читай матчасть
не знаю, что там, но наверное ты имеешь в виду разложение какое-то на ряд? Ну это кому надо, тот пусть и пишет себе pi. Будет странно, если я добавлю PI в мою библиотеку. Арифметические операции, факториал я реализовал, также я реализовал дроби - этого достаточно, чтобы вычислять Pi.

Цитата Сообщение от XLAT Посмотреть сообщение
MSweeper-sfml-2.6.2[CB.project+exe.win64+sources][черновик].rar
прикольно, мне понравилось.
0
Just Do It!
 Аватар для XLAT
4219 / 2680 / 656
Регистрация: 23.09.2014
Сообщений: 9,235
Записей в блоге: 3
02.02.2025, 13:11  [ТС]
Цитата Сообщение от Royal_X Посмотреть сообщение
давай что-нибудь вместе напишем. Какие у тебя есть идеи? Напиши в теме сапера.
ты мя в врасплох застал - такое предложение не вяжется с твоим психопортретом))

не ради критики - ради истины:
C++
1
std::string value = a.get_value(); // value = "42"
семантика - говоришь?
C++
1
std::string value = a.str(); // value = "42"
а на самом деле шо?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
#include <string>
 
struct BigInt : std::string
{
 
    ///----------------------------|
    /// Тут перегруженные методы...|
    ///----------------------------:
    /// ...
};
 
 
int main()
{
    BigInt b("42");
    std::string s = b;
 
    std::cout << s << std::endl;
}
...

вар, без реверса:
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
#include <iostream>
#include <string>
 
#define l(v)  std::cout << #v << " = " << (v) << "\n";
 
struct BigInt : std::string
{
 
    ///----------------------------|
    /// Тут перегруженные методы...|
    ///----------------------------:
    /// ...
 
    BigInt operator+(const BigInt& n)
    {
        const BigInt* a =   &n;
        const BigInt* b = this;
 
        if(size() > n.size())
        {   std::swap(a, b);
        }
 
        BigInt r(std::string(a->size() + 1, '0'));
 
        size_t i = a->size() - 1;
        size_t j = b->size() - 1;
        size_t k = r .size() - 1;
 
        char   e = 0;
 
        for(; j != std::string::npos; --j, --i, --k)
        {
            r[k] = (*a)[i] + (*b)[j] - '0' + e;
 
            if( r[k]  > '9')
            {   e     = 1 ;
                r[k] -= 10;
            }
            else e =  0;
        }
 
        if(i == std::string::npos)
        {   r[k] += e;
            return r;
        }
 
        for(; i != std::string::npos; --i, --k)
        {
            r[k] = (*a)[i] + e;
 
            if( r[k]  > '9')
            {   e     = 1 ;
                r[k] -= 10;
            }
            else e =  0;
        }
 
        r[k] += e;
 
        return r;
    }
};
 
 
int main()
{
    {
        BigInt a("42");
        BigInt b("82");
        std::string  s = (a + b);
        std::cout << s << std::endl;
    }
 
    {
        BigInt a("9942");
        BigInt b(  "82");
        std::string  s = (a + b);
        std::cout << s << std::endl;
    }
 
    {
        BigInt a("9942");
        BigInt b(  "82");
        std::string  s = (b + a);
        std::cout << s << std::endl;
    }
 
    {
        BigInt a("9999");
        BigInt b(   "1");
        std::string  s = (b + a);
        std::cout << s << std::endl;
    }
 
    {
        BigInt a(   "0");
        BigInt b(   "0");
        std::string  s = (b + a);
        std::cout << s << std::endl;
    }
 
    return 0;
}
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6296 / 3018 / 1053
Регистрация: 01.06.2021
Сообщений: 11,453
02.02.2025, 14:38
XLAT, короче, вот, что я подумал касательно всех этих саперов и прочих игр. Нужно чтобы все вычисления происходили в одном процессе, независимо от самой игры. Любимый аргумент школоты, почему они создают игры на UE и потом получают мин. игру в 500 МБ в том, что UE использует С++, а эти мамкины хацкеры думают, что раз С++ быстрый, то значит их говно-игра будет выдавать 1000 fps. Конечно, это все неверно.

Я вот подумал, а что если создать движок - консольную программу на С++, которая будет работать фоново. Тогда сама игра может быть на абсолютно любом движке, и не важно, какой язык использует игровой движок. В таком случае, сам движок будет очень быстрым, а игра будет красивой.

Для эксперимента я создал:
1. Консольную программу на С++ (файл engine.exe, который в архиве engine.7z), которая принимает от юзера две команды: rand и quit. При получений первой команды прога выдает рандомное число от 0 до 99 включительно. А при получении команды quit прога завершает работу.
Прогу можно запустить отдельно и посмотреть как она работает.

2. Я создал игру на Unity (в архиве UnityGame.7z), состоящую из кнопки и текстового поля для вывода. Цель игры в том, чтобы при нажатии на кнопку выводилось рандомное число. В самом C# коде нет никаких генераций случайных чисел. Напротив, игра работает так: если в папке игры лежит файл engine.exe игра создает новый фоновый процесс и запускает движок. При нажатии на кнопку, игра посылает по трубе команды и получает ответ от движка, который выводит.

Такой подход используется шахматными оболочками, которые работают с UCI движками.

Каковы преимущества:
1. Скорость выполнения. Игра может быть хоть на Godot, но вот сами вычисления будут происходить на движке, написанном на С++.
2. Создание отдельного процесса позволит в случае краша или глюка движка, без проблем продолжить выполнение игры. Например, игра может вывести "Ваш движок заглючил или движок не отвечает" и т.д.
3. К игре можно подключать разные движки.

Чтобы тестировать, нужно закинуть engine.exe в папку с игрой. Также можно создать свою консольную программу с именем engine.exe и реализовать rand и quit.

Создатель игры и создатель движка сперва придумывают протокол движка - описание команд.
Далее, каждый занимается своей работой.
Вложения
Тип файла: 7z engine.7z (252.9 Кб, 9 просмотров)
2
Just Do It!
 Аватар для XLAT
4219 / 2680 / 656
Регистрация: 23.09.2014
Сообщений: 9,235
Записей в блоге: 3
02.02.2025, 15:28  [ТС]
Цитата Сообщение от Royal_X Посмотреть сообщение
короче, вот, что я подумал касательно
ну, вот - одобряю.

наконец то Royal_X начинает полегонько-потихонько приобщаться к простой и древней концепции:

1. есть бэкенд.
2. есть франтед.

или(тоже самое) MVC:

1. есть визуализатор.
2. есть модель, которую дергает контроллер(не обязательно юзер, чаще это делают "виртуальные боты")

отличия внутри них только в специализации решаемых задач.

осталось только КодерХулигана наставить на путь истинный)

Добавлено через 9 минут
Цитата Сообщение от Royal_X Посмотреть сообщение
Для эксперимента я создал:
и то енджин
и другое тоже енджин.
(это негодно)

понятно только где юнька - по иконке.

поэтому есть у нас:
1. юнька
2. консолька

с рандомом в демке ясно,
а вот куда quit то вводить?
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6296 / 3018 / 1053
Регистрация: 01.06.2021
Сообщений: 11,453
02.02.2025, 15:36
Цитата Сообщение от XLAT Посмотреть сообщение
а вот куда quit то вводить?
если ввести quit, то консольная программа - движок завершается
Эта команда посылается на прощание юнькой при закрытии игры, чтобы фоновый движок тоже вырубился
Можно, конечно, процесс вырубать жестко юнькой, но так как-то по-доброму, вроде.

Добавлено через 3 минуты
XLAT, вот код движка

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
#include <random>
#include <string>
 
int main() 
{
    std::mt19937 gen(std::random_device{}());
    std::uniform_int_distribution<> dist(0, 99);
    std::string s;
    while (true)
    {
        std::cin >> s;
        if (s == "quit")
            break;
        if (s == "rand")
            std::cout << dist(gen) << std::endl;
    }
}
Я ничего сложного не писал, чисто для теста. Можешь написать свой движок и реализовать те же команды.
1
Just Do It!
 Аватар для XLAT
4219 / 2680 / 656
Регистрация: 23.09.2014
Сообщений: 9,235
Записей в блоге: 3
02.02.2025, 15:55  [ТС]
Цитата Сообщение от Royal_X Посмотреть сообщение
Игра может быть хоть на Godot,
Code
1
2
3
- Кто самый важный человек у нас в команде?
- Это Машка, которая варит нам всем кофе.
- Точно!
Игра это весч интегральная,
нельзя говорить что цвет картинки это игра, а вычисление точки на карте это не игра...

так юнити визуализирует данные(пофик какие), будем называть не движок, а
- визуализатор
- фронтед
- клиент
- юнька

а то что на консоле, варианты:
- модель
- бэкенд
- сервер
- консолька

а эти два модуля в одной куче и есть игра.
нее - игра это процесс или сеанс или ...

Добавлено через 3 минуты
Цитата Сообщение от Royal_X Посмотреть сообщение
если ввести quit, то консольная программа - движок завершается
ввёл quit консоль схлопнулась, юнька продолжает висеть.

нашёл консольку в диспетчере... ну там и убил,

юнька не завершается.

Добавлено через 9 минут
Цитата Сообщение от Royal_X Посмотреть сообщение
Я ничего сложного не писал, чисто для теста. Можешь написать свой движок и реализовать те же команды.
обычно или чаще клиент посылает команды на сервер.
почему? потому что сервер всегда готов, а клиент то в сортир то за пивом ...
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6296 / 3018 / 1053
Регистрация: 01.06.2021
Сообщений: 11,453
02.02.2025, 15:55
Цитата Сообщение от XLAT Посмотреть сообщение
ввёл quit консоль схлопнулась, юнька продолжает висеть.
нашёл консольку в диспетчере... ну там и убил,
юнька не завершается.
Юнька и не должна завершатся. В этом и был смысл, чтобы при глюках и краше движка игра не ломалась.
Но вот ты прав, что нужно было это учесть, типа что юзер может вырубить движок.
Вот новая юнька. Попробуй. Удали старую и закинь движок в папку с новой юнькой.
Вложения
Тип файла: 7z UnityGame.7z (23.38 Мб, 7 просмотров)
0
Just Do It!
 Аватар для XLAT
4219 / 2680 / 656
Регистрация: 23.09.2014
Сообщений: 9,235
Записей в блоге: 3
02.02.2025, 15:58  [ТС]
Цитата Сообщение от Royal_X Посмотреть сообщение
Но вот ты прав, что нужно было это учесть, типа что юзер может вырубить движок.
Вот новая юнька. Попробуй. Удали старую и закинь движок в новую папку с новой юнькой.
слушай, ты вывернул всё наизнанку)))

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

т.е. визулизатор графона у тя сервер?

не, ну, можно и не по колее тоже пойти...
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6296 / 3018 / 1053
Регистрация: 01.06.2021
Сообщений: 11,453
02.02.2025, 16:03
XLAT, я просто так понимаю процесс.
Есть игра на юньке или на каком-то другом движке. Игра только для красивой визуализации. Никаких игровых логических вычислений она не делает.
Она запускает движок (консольная прога на С++), с которым потом общается.
Если движок был вырублен пользователем или если он сломался в процессе - то игра об этом цивилизованно предупреждает, но сама продолжает работать. Можно добавить, например, возможность повторных попыток запуска движка.
Также можно добавить, например, проверку на корректность полученных от движка данных.
0
Just Do It!
 Аватар для XLAT
4219 / 2680 / 656
Регистрация: 23.09.2014
Сообщений: 9,235
Записей в блоге: 3
02.02.2025, 16:28  [ТС]
Цитата Сообщение от Royal_X Посмотреть сообщение
Попробуй. Удали старую и закинь движок в новую папку с новой юнькой.
давай пока концептуально,
а когда я попрошу, то дашь демо.

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

а как именно оно должно работать я тя напишу)

Цитата Сообщение от Royal_X Посмотреть сообщение
запуска движка.
ты меня не слышишь? - не употребляй больше слово "движок".
потому что у тебя во всех случаях "движок"

при этом жмакать надо в юньки, а игра в косоле.
слово "игра" тоже не употребляй:

потому что если я жмакаю в юньке, то относительно меня "игра" находится в юньке.

"вся сложность находится в голове, ибо там обитает бардак, который эту сложность испражняет"
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6296 / 3018 / 1053
Регистрация: 01.06.2021
Сообщений: 11,453
02.02.2025, 16:44
XLAT, я понимаю, что Unity это игровой движок и это запутывает, когда консольную прогу называю движком. Это у меня такое закрепилось со времен, когда я с шахматными движками баловался. Там консольная программа, ищущая ходы, называется шахматным движком - chess engine (например, Stockfish). А вот сама шахматная оболочка - прога с доской - называется гуем GUI.
Моя консольная прога очень похожа на шахматный "движок", который тоже принимает и выводит текст.
Разница только в том, что шахматные движки и гуи соблюдают единый протокол UCI.
0
Just Do It!
 Аватар для XLAT
4219 / 2680 / 656
Регистрация: 23.09.2014
Сообщений: 9,235
Записей в блоге: 3
02.02.2025, 16:51  [ТС]
Royal_X,
а теперь, прошу внимание!

чтобы довести до приемлемого демо того что ты предложил
нужно сделать следущее:

КОНСОЛЬ ДОЛЖНА НАУЧИТЬСЯ ПРИНИМАТЬ КОМАНДЫ ОТ ЮНЬКИ

сорри за капс, ибо я знаю, что ты не читатель)

т.е. делай дуплекс.

Добавлено через 1 минуту
Цитата Сообщение от Royal_X Посмотреть сообщение
Там консольная программа, ищущая ходы, называется шахматным движком
да не вопрос, пусть всё будет движком,
но я хочу тебя понимать, поэтому нужно чуть предметнее ...
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6296 / 3018 / 1053
Регистрация: 01.06.2021
Сообщений: 11,453
02.02.2025, 16:53
Цитата Сообщение от XLAT Посмотреть сообщение
КОНСОЛЬ ДОЛЖНА НАУЧИТЬСЯ ПРИНИМАТЬ КОМАНДЫ ОТ ЮНЬКИ
так она и принимает у меня

Юнька отправляет rand и quit, а консоль принимает и обрабатывает эти команды
1
Just Do It!
 Аватар для XLAT
4219 / 2680 / 656
Регистрация: 23.09.2014
Сообщений: 9,235
Записей в блоге: 3
02.02.2025, 16:54  [ТС]
Royal_X,
ещё меня мучает такой вопрос,
ты сможешь разрулить,
если будет запущенно несколько консолей(моделей или разных игр)
?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
02.02.2025, 16:54

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
600
Закрытая тема Создать тему
Новые блоги и статьи
интеграция AnyLogic с самописным REST API и переход на Odoo
anaschu 03.07.2026
Успешная интеграция AnyLogic с самописным REST API и переход на промышленную Odoo WMS Сегодня проделал огромный путь от простой симуляции физических процессов до построения полноценной. . .
Поиск всех путей на ориентированном графе. Linux
dcc0 02.07.2026
Переработка старого кода из моей статьи. Через несколько переработок от PHP кода к C89 (надеюсь, 89). Но довольно запутанно получилось. Код для Linux. Но если убрать time и то, что с ним. . .
Сам себя обучал rest api
anaschu 02.07.2026
Педагогический лайфхак: Почему чистый REST API для ученика намного круче, чем готовые библиотеки Когда мы отказались от капризного JAR-файла AnyLogic и переписали код на стандартный HttpClient,. . .
rest api anylogic - выполнение модели на своём русском сайте
anaschu 02.07.2026
Как подружиться с AnyLogic Cloud API, победить провайдеров и развернуться Java-бэкенд в Docker на бесплатном хостинге: Двухдневный лог борьбы Всем привет! Хочу поделиться свежим (и довольно. . .
Где деньги лежат
kumehtar 02.07.2026
Это - японская подводная лодка I-52 (тип C2, кодовое имя Momi) вышла из Японии в марте 1944 года с миссией в оккупированную немцами Францию (Лорьян). Это была одна из «Янаги»-миссий по обмену. . .
Krabik для WoW 3.3.5a, многоязычный
AmbA 02.07.2026
Допилил бота, думаю что окончательно. Изменения: - добавлена многоязычность - добавлено снятие скриншотов - добавлено поддержание бафов хождения по воде (для жреца, дк и шамана) - и так, по. . .
Алиса нашла кучу ошибок компиляции и запуска в проекте, который без проблем компилировался и запускался)))
anaschu 30.06.2026
Я пока посмеюся, но завтра проверю. А вообще интерсно. Дал алисе файл, в котором точно нет ошибок компиляции и запуска, и попросил их найти. Нашла кучу))) Критические ошибки, мешающие компиляции и. . .
сукцессия 16. Общий обзор, в основном что бы другие ии поняли
anaschu 29.06.2026
# Передаточный документ: модель микоризной сукцессии (для нового чата) Этот документ предназначен для того, чтобы новый чат Claude мог продолжить работу без необходимости заново разбираться в. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru