Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.65/71: Рейтинг темы: голосов - 71, средняя оценка - 4.65
0 / 0 / 0
Регистрация: 05.03.2023
Сообщений: 1

Оцените и посоветуйте как можно улучшить код Крестики-нолики

05.03.2023, 19:56. Показов 17192. Ответов 284
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Я учусь в 10 классе и для индивидуального проекта мне нужно чтобы вы оценили и как-то посоветовали улучшить код программы крестики нолики на C++. Вот сам код:

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
#include <iostream>
#include <stdio.h>
#include <cstdlib>
#include <windows.h>
using namespace std;
 
void output(char** field) {
    cout << "  1 2 3" << endl;
    for (int i = 0; i < 3; i++) {
        cout << i + 1 << " ";
        for (int j = 0; j < 3; j++) {
            cout << field[i][j] << " ";
        }
        cout << endl;
    }
}
void input(char** field, bool& gamer, string& Name1, string& Name2) {
 
    int answer;
    while (true) {
 
        if (gamer) {
            cout << Name1;
        }
        else {
            cout << Name2;
        }
        cout << ", введите номер строки и столбца: ";
 
 
        cin >> answer;
        if (answer > 10 && answer < 34) {
            int i = answer / 10;
            int j = answer % 10;
 
            if (0 < j && j < 4) {
                if (field[i - 1][j - 1] != 'X' && field[i - 1][j - 1] != 'O') {
                    if (gamer) {
                        field[i - 1][j - 1] = 'X';
                    }
                    else {
                        field[i - 1][j - 1] = 'O';
                    }
                    gamer = !gamer;
                    break;
                }
            }
        }
        cout << "Вы ввели неверную ячейку" << endl;
    }
}
char** fieldCreate(char c = '_') {
    int const n = 3;
    char** field = new char* [n];
    for (int i = 0; i < n; i++) {
        field[i] = new char[n];
        field[i][0] = c;
        field[i][1] = c;
        field[i][2] = c;
    }
    return field;
}
bool chekWin(char** field, string& Name1, string& Name2) {
    bool chekWin = false, gamer = false;
 
    if (field[0][0] == field[1][1] && field[0][0] == field[2][2] && (field[0][0] == 'X' || field[0][0] == 'O') || field[2][0] == field[1][1] && field[2][0] == field[0][2] && (field[2][0] == 'X' || field[2][0] == 'O')) {
        chekWin = true;
        if (field[1][1] == 'X') {
            gamer = true;
        }
    }
    else {
        for (int i = 0; i < 3; i++) {
            if (field[i][0] == field[i][1] && field[i][0] == field[i][2] && (field[i][0] == 'X' || field[i][0] == 'O') || field[0][i] == field[1][i] && field[0][i] == field[2][i] && (field[0][i] == 'X' || field[0][i] == 'O')) {
                chekWin = true;
                if (field[i][i] == 'X') {
                    gamer = true;
                }
                break;
            }
        }
    }
 
    if (chekWin) {
        if (gamer) {
            cout << "победил !" << Name1 << endl;
        }
        else {
            cout << "победил  !" << Name2 << endl;
        }
        return true;
    }
    else {
        bool draw = true;
        for (int i = 0; i < 3; i++) {
            for (int j = 0; j < 3; j++) {
                if (field[i][j] != 'X' && field[i][j] != 'O') {
                    draw = false;
                }
            }
        }
 
        if (draw) {
            cout << "ничья";
            return true;
        }
    }
 
    return false;
}
void defoultMassive(char** field, char c = '_') {
    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 3; j++) {
            field[i][j] = c;
        }
    }
}
bool continueGame() {
    bool flag = true;
    while (true) {
        string answer;
        cout << "Хотите ли вы продолжить игру?(Да/Нет)" << endl << "Введите ответ: "; //<< answer;
        cin >> answer;
        if (answer == "Да") {
            break;
        }
        else if (answer == "Нет") {
            flag = false;
            break;
        }
        else {
            cout << "Такого ответа не существует!";
        }
    }
    return flag;
}
void deleteMassive(char** field) {
    for (int i = 0; i < 3; i++) {
        delete[] field[i];
    }
    delete[] field;
}
void randomPlayer(string& Name1, string& Name2) {
    srand(time(0));
    int num = rand() % 2;
    cout << "Введите имя первого игрока: ";
    cin >> Name1;
    cout << "Введите имя второго игрока: ";
    cin >> Name2;
    if (num) {
        string tmp = Name1;
        Name1 = Name2;
        Name2 = tmp;
    }
    cout << "Первым ходит: " << Name1 << endl;
}
 
int main() {
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    bool gamer = true;
    char** field = fieldCreate();
    string Name1, Name2;
    randomPlayer(Name1, Name2);
    while (true) {
        defoultMassive(field);
        while (true) {
            system("Cls");
            output(field);
            if (chekWin(field, Name1, Name2))
                break;
            input(field, gamer, Name1, Name2);
 
        }
        if (!continueGame())
            break;
    }
    deleteMassive(field);
    return 0;
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
05.03.2023, 19:56
Ответы с готовыми решениями:

Крестики-нолики, улучшить программу
Здравствуйте, нужна помощь в улучшении программы. Игра &quot;крестики-нолики&quot;. Суть заключается в проверке на число от 1 до 9 если введено не от...

Как оптимизировать данный код игры крестики нолики?
Привет всем! Я написал консольную игру &quot;Крестики нолики&quot;. Хочу посоветоваться как можно оптимизировать игру. Вот исходный код: ...

Оцените игру крестики нолики (Player vs Bot easy)
Отцените игру. Уровень : легкий

284
Just Do It!
 Аватар для XLAT
4219 / 2680 / 656
Регистрация: 23.09.2014
Сообщений: 9,235
Записей в блоге: 3
18.03.2023, 21:45
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от zayats80888 Посмотреть сообщение
Ну как тебе сказать. Вот это:
разбить на две команды.
не?
считай это за псевдокод, лаконичный и понятный.

на одну команду в интерфейсе больше или везде где возвращает будет блокировать?

вот бот:
содрал с работающего:
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
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
#include <iostream>
 
const char* INTERFACE_VERSION = "interface_version:xlat";
 
///----------------------------------------------------------------------------|
/// C++17
/// Исходник в UTF-8
///----------------------------------------------------------------------------|
/// AI для игры в крестонолики.
///----------------------------------------------------------------------------:
#include <cstdlib>
#include <vector>
#include <string>
#include <ctime>
 
#include <iostream>
 
///----------|
/// Конфиг.  |
///----------:
struct  Cfg
{
    ///-----------------------------|
    /// Количество фишек для победы.|
    ///-----------------------------:
    size_t FWIN   =   5;
    size_t WIDTH  =  30; /// Размер поля по горизонтали.
    size_t HEIGHT =  20; /// Размер поля по вертикали.
    ///-----------------------------.
 
    char FISHKI[2]{'X', 'O'};
};
 
const char EMPTY = '.';
 
template<typename T>
T& operator<<(T& o, const Cfg& c)
{   o   << L"КОНФИГ ---------------------------:\n"
        << "   FWIN      = " << c.FWIN      << '\n'
        << "   WIDTH     = " << c.WIDTH     << '\n'
        << "   HEIGHT    = " << c.HEIGHT    << '\n'
        << "   FISHKI[0] = " << c.FISHKI[0] << '\n'
        << "   FISHKI[1] = " << c.FISHKI[1] << '\n'
        << std::endl;
    return o;
}
 
///----------|
/// Конфиг.  |
///----------:
Cfg   cfg;
 
struct Plot
{   size_t x, y;
    bool operator==(const Plot& p) const { return x == p.x && y == p.y; }
};
 
 
template<typename T>
T& operator<<(T& o, const Plot& p)
{          o << "{ " << p.x << ", " << p.y << " }";
    return o;
}
 
 
std::ostream& operator<<(std::ostream& o, const std::vector<std::string>& f)
{
    std::string line(f[0].size()+2, '-');
    o << line << '\n';
    for    (size_t h = 0; h < f   .size(); ++h)
    {   o << "|";
        for(size_t w = 0; w < f[0].size(); ++w)
        {   o << f[h][w];
        }   o << "|\n";
    }       o << line << '\n';
    return  o;
}
 
namespace stp
{
    ///-------------------------------------------------|
    /// Когда нужно понять кто первый сделал ход.       |
    ///-------------------------------------------------:
    const Plot START_STEP = {size_t(-111), size_t(-111)};
    const Plot   NOT_INIT = {size_t(-1  ),         0   };
    const Plot BAD_RETURN = {size_t(-112),         0   };
}
 
 
bool TYPE_IS_SERVER_OR_CLIENT = false;
 
 
///----------------------------------------------------------------------------|
/// ИИ.
///     Всё что нужно сделать это ПРИНЯТЬ РЕШЕНИЕ,
///     в какую координату поставить фишку.
///----------------------------------------------------------------------------:
 
const bool DEBUG_DLL_RUNTIME = false;
 
///------------------------------------|
/// ...                                |
///------------------------------------:
const wchar_t* authorname = L"Глупыш";
//const wchar_t* authorname = L"Дебил";
//const wchar_t* authorname = L"АфторРэнд";
 
 
struct Rand
{   Rand(            ){   srand((unsigned)time(0));}
    Rand(unsigned sid){   srand(sid);              }
    int  operator   ()(int range_min, int range_max)   const
    {
        return rand () %  (range_max -    range_min) + range_min;
    }
}rrand;
 
 
struct  AI
{       AI() : field(std::vector(cfg.HEIGHT, std::string(cfg.WIDTH, '.')))
        {
        }
 
    ///---------------------|
    /// Ваша фишка.         |
    ///---------------------:
    char FISHKA       = 0; /// Устанавливается Арбитром
    char FISHKA_ENEMY = 0; /// непосредственно перед матчем.
 
    ///---------------------|
    /// Послединй ход врага.|
    ///---------------------:
    Plot last_step{stp::NOT_INIT};
 
    ///---------------------|
    /// Это ваше поле.      |
    ///---------------------:
    std::vector<std::string> field;
 
    ///-------------------------------|
    /// Это основной метод.           |
    /// его будет дёргать Арбитер,    |
    /// чтоб узнать ваше решение.     |
    ///-------------------------------:
    Plot step(const Plot& enemy_step)
    {
        set_step(enemy_step);
 
        const auto& H = field   .size();
        const auto& W = field[0].size();
 
        Plot p;
 
        /// TODO ...
        ///--------------------...
        /// пример простейшего решения ...
        ///--------------------...
        while(true)
        {
            p.x = rrand(0, W);
            p.y = rrand(0, H);
 
            if( verification_no_info(p))
            {   field[p.y][p.x] = FISHKA;
 
                if(DEBUG_DLL_RUNTIME)
                {   std::wcout << authorname << L" сделал ход: " << p << ":\n";
                    std::cout  << field      << std::endl;
                    std::cin.get();
                }
 
                return p;
            }
        }
 
        return {size_t(-1), 0};
    }
 
 
    void fclear()
    {   field = std::vector(cfg.HEIGHT, std::string(cfg.WIDTH, '.'));
    }
 
private:
    void set_step(const Plot& enemy_step)
    {   last_step = enemy_step;
 
        if (verification_no_info(last_step))
        {   field[last_step.y][last_step.x] = FISHKA_ENEMY;
 
            if(DEBUG_DLL_RUNTIME)
            {   std::wcout << authorname  << L" состояние доски до хода:\n";
                std::cout  << field       << std::endl;
            }
        }
        else
        {
            ///------------------------|
            /// Арбитер прислал НЕ ход.|
            ///------------------------:
            if(last_step == stp::START_STEP)
            {
                if(DEBUG_DLL_RUNTIME)
                {   std::wcout  << authorname  << L" ходит первым.\n";
                    std::wcout  << L"Состояние доски:\n";
                    std::cout  << field      << std::endl;
                }
            }
            else
            {   printf("ERROR in dll ...");
                std::cin.get();
            }
        }
    }
 
    bool verification_no_info(const Plot& p) const
    {   return field[p.y][p.x] != '.';
    }
};
 
 
static AI* ai = nullptr;
///----------------------------------------------------------------------------|
/// Внешний интерфейс AI.
///----------------------------------------------------------------------------:
 
void create_(const Cfg _cfg)
{   cfg = _cfg;
    ai  = new AI();
}
 
Plot step_(const Plot enemy_step)
{   return ai->step(enemy_step);
}
 
const wchar_t* name_(                  )
{   return authorname  ;
}
void         delete_(                  )
{   delete ai          ;
}
void         stfish_(const char FISHKA )
{   ai->FISHKA  = FISHKA;
    if(ai->FISHKA == cfg.FISHKI[0]) ai->FISHKA_ENEMY = cfg.FISHKI[1];
    else                            ai->FISHKA_ENEMY = cfg.FISHKI[0];
    ai->fclear();
}
 
void sendplot_(Plot plot, char color)
{   ai->field[plot.y][plot.x] = color;
 
    if(DEBUG_DLL_RUNTIME)
    {   std::wcout << L"sendplot_:\n";
        /// ...
    }
}
 
const char* get_interface_version()
{   return INTERFACE_VERSION;
}
 
 
 
int main()
{
 
/*
    /// псевдокод:
    while(true)
    {
        CONNECTOR con;
 
        switch(con.command)
        {
            case 1:
                Arg arg = con.arg();
                create_(arg.cfg);
                break;
 
            case 2:
                Arg arg = con.arg();
                std::cout << step_(arg.plot);
                break;
 
            ...
            ...
            ...
        }
    }
*/
}
местами некрасиво() - но работать будет,
если коннектор работающий у него появится.
0
Just Do It!
 Аватар для XLAT
4219 / 2680 / 656
Регистрация: 23.09.2014
Сообщений: 9,235
Записей в блоге: 3
19.03.2023, 12:22
Добавлено через 1 минуту
Цитата Сообщение от XLAT Посмотреть сообщение
на одну команду в интерфейсе больше или везде где возвращает будет блокировать?
нужно организовать транзакцию на стороне коннектора.
арбитра это не касается.
0
Just Do It!
 Аватар для XLAT
4219 / 2680 / 656
Регистрация: 23.09.2014
Сообщений: 9,235
Записей в блоге: 3
19.03.2023, 17:08
Цитата Сообщение от XLAT Посмотреть сообщение
коннектор
zayats80888,
что-то типа такого:

а в сервис Арбитра я его сам встрою.

и в бота тоже.
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
19.03.2023, 18:45
Цитата Сообщение от XLAT Посмотреть сообщение
разбить на две команды.
не?
Я не понимаю на какие и как это поможет. Синхронный и асинхронный код - это два абсолютно разных кода.
Асинхронный вызов, условно, может вернуть только место и время встречи, где забрать посылку, да еще может и опоздать на встречу.
Что твой арбитр будет делать с этой информацией? Его логика на это не завязана.
Цитата Сообщение от XLAT Посмотреть сообщение
вот бот:
содрал с работающего:
И чего мне сним делать, ты же не дал протокол, с которым он должен работать и не сказал должен ли он работать в отдельном процессе. И что за коннектор ему нужен.

Цитата Сообщение от XLAT Посмотреть сообщение
что-то типа такого:
Ну смотри, я дал тебе интерфейс и контракты, чтоб ты помог адаптировать своего арбитра под асинхронный код.
Я так понимаю, ты не хочешь асинхронность. Ок, дело твоё, пусть будет блокирующий, или может ты хочешь организовать асинхронность самостоятельно. В любом случае дай интерфесы и контракты на них, которые мне нужно реализовать. По картинке эти детали не ясны.
0
Just Do It!
 Аватар для XLAT
4219 / 2680 / 656
Регистрация: 23.09.2014
Сообщений: 9,235
Записей в блоге: 3
19.03.2023, 19:46
Цитата Сообщение от zayats80888 Посмотреть сообщение
Я не понимаю на какие и как это поможет.
так.
Цитата Сообщение от zayats80888 Посмотреть сообщение
И чего мне сним делать
вчерашние мои посты устарели и нуждаются в правках.

верно - абсолютно это не на твоей стороне...

Цитата Сообщение от zayats80888 Посмотреть сообщение
Ну смотри, я дал тебе интерфейс и контракты
мне нужно переписать арбитра, разорвав в нем все циклы.
т.е. после каждой команды отдавать тебе управление.
верно?
не проблема.
или это проблема времени.

Цитата Сообщение от zayats80888 Посмотреть сообщение
ты не хочешь асинхронность
я сам пока толком не понимаю, как она будет выглядеть в реальном коде.

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

но асинхронность меня вполне устаивает,
поэтому арбитра буду править.

Цитата Сообщение от zayats80888 Посмотреть сообщение
В любом случае дай интерфесы и контракты на них, которые мне нужно реализоват
не, ну есть же в сетевых технология такое понятие, как транзакция,
она может быть и растянута по времени, но с лимитом этого времени, по истечению которого
ни передача ни приём считаются не состоявшимися.

Сейчас, в точке старта
мой контракт очень и очень простой,
я хочу сделать запрос клиенту,
а затем получить ответ, пустой или непустой(строку), но ответ.

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

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

запрос и ответ это текстовые строки - парсить я их буду сам.

предлагаю щас сосредоточится на этом.
тест организовать как угодно, но демонстрирующий этот простейший контракт.


zayats80888,
не знаю,
возможно, желание запилить сервер в один присест и реализуемо на практике,
но мен хотелось очень и очень простых в простейшей простоте тестов!

короче, мне нужен РАБОТАЮЩИЙ ПРОСТЕЙШИЙ ТЕСТ, КАК ОНО БУДЕТ ВЫГЛЯДЕТЬ В РЕАЛЬНОМ КОДЕ,
КОТОРЫЙ МОЖНО ЗАПУСТИТЬ и увидеть глазами как он работает.

а так типа передали инфу в общий поток, кому передали куда передали зачем передали,
инфа ушла и хсней) я не понимаю.
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
19.03.2023, 19:57
Цитата Сообщение от XLAT Посмотреть сообщение
мне нужно переписать арбитра, разорвав в нем все циклы.
т.е. после каждой команды отдавать тебе управление.
верно?
не проблема.
или это проблема времени.
Верно.
Управление передается планировщику(который не нужно реализовывать, он реализован в бусте).
Пока коду, обслуживаещему конкретного клиента нечего делать, управление передается другому коду, обслуживающему другого клиента, которому есть что делать. Таким образом даже в однопоточной программе реализуется условный "параллелизм" выполнения задач.
Цитата Сообщение от XLAT Посмотреть сообщение
мой контракт очень и очень простой,
я хочу сделать запрос клиенту,
а затем получить ответ, пустой или непустой(строку), но ответ.
Затем - это сразу? А что если нельзя получить сразу?
Вот и дай мне интерфейс клиента (класс с несколькими методами), которые я должен реализовать, прокоментировав каждый метод, что он должен делать и чего не должен делать.
Цитата Сообщение от XLAT Посмотреть сообщение
запрос и ответ это текстовые строки - парсить я их буду сам.
Текстовые строки - понятие неоднозначное.
Это могут быть двоичные данные (заголовок с размером строки и собственно строка).
Или это может быть текстовый протокол, где размер данных не записывается в отдельный заголовок, и его нужно парсить по мере поступления данных (типа http).

Добавлено через 2 минуты
Цитата Сообщение от XLAT Посмотреть сообщение
короче, мне нужен РАБОТАЮЩИЙ ПРОСТЕЙШИЙ ТЕСТ, КАК ОНО БУДЕТ ВЫГЛЯДЕТЬ В РЕАЛЬНОМ КОДЕ,
КОТОРЫЙ МОЖНО ЗАПУСТИТЬ и увидеть глазами как он работает.
Вот для этого теста я и предложил тебе, чтоб ты помог реализовать простенького арбитра для судейства одного матча. В виде машины состояний.
0
Just Do It!
 Аватар для XLAT
4219 / 2680 / 656
Регистрация: 23.09.2014
Сообщений: 9,235
Записей в блоге: 3
19.03.2023, 20:17
Цитата Сообщение от zayats80888 Посмотреть сообщение
Затем - это сразу? А что если нельзя получить сразу?
так,
колбек?
не вопрос.

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

это мне надо осмыслить и привыкнуть.

Цитата Сообщение от zayats80888 Посмотреть сообщение
Это могут быть двоичные данные
ха, никто никогда не знает что может прийти из сети.
может шифрование добавим? ))

Цитата Сообщение от zayats80888 Посмотреть сообщение
Вот для этого теста я и предложил тебе, чтоб ты помог реализовать простенького арбитра для судейства одного матча
вместо арбитра сойдет и просто второй бот - клон первого.
просто посмотреть как они заполняют матрицу, каждый свою.

щас кафу попью и запилю. мош добавить чо?
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
19.03.2023, 20:50
Цитата Сообщение от XLAT Посмотреть сообщение
вместо арбитра сойдет и просто второй бот - клон первого.
просто посмотреть как они заполняют матрицу, каждый свою.
щас кафу попью и запилю. мош добавить чо?
Не представляю, как это выглядит.
В моём понимании "тестовый стенд" выглядит так:
Тестовая программа(эмулирует сервис) принимает команду на запуск ботов(например, имя бинарника, через аргументы командной строки).
Запускает два процесса с пайпами, которые прячутся за абстрактынм каналом передачи данных.
ассоциирует каждый канал с абстрактным парсером, за которым прячется механизм преобразования сообщений(message) в текст, принимаемый ботом, и обратно.
Запускается сессия, которой передаются эти две пары <канал + парсер>.
Сессия создаёт:
1. два объекта типа игрок, который будет обслуживать запросы арбитра через эту пару,
2. объект наблюдатель, реализующий интерфейс listener, точнее сама сессия может его реализовать.
3. объект арбитра, которому передает указатели на игроков и наблюдателя.
И запускает игру, дергая метод start арбитра.
По получении события от арбитра через интерфейс listener о завершении матча сессия (а затем и программа) завершается.
Классы игрок, канал, парсер, сессия, я реализую.
Тебя я просил реализовать логику арбитра и программы-бота, по шаблонам, которые я дал.
Интерфейсы, с которыми придется взаимодействовать арбитру и объект-сообщение, которым он будет обмениваться, я тебе тоже дал (их не нужно реализовывать), но ты можешь подправить их котракты, или добавить методы, если нужно твоему арбитру, я реализую, главное - оставить асинхронный менханизм обмена сообщениями.
0
Just Do It!
 Аватар для XLAT
4219 / 2680 / 656
Регистрация: 23.09.2014
Сообщений: 9,235
Записей в блоге: 3
19.03.2023, 22:10
Цитата Сообщение от zayats80888 Посмотреть сообщение
Не представляю, как это выглядит.
ну так:
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
#include <iostream>
///----------------------------------------------------------------------------|
/// ...
///----------------------------------------------------------------------------:
#include <cstdlib>
#include <vector>
#include <string>
#include <ctime>
 
struct Plot{ size_t x, y; };
 
std::ostream& operator<<(std::ostream& o, std::vector<std::string>& f)
{
    const auto& H = f   .size();
    const auto& W = f[0].size();
 
    std::string line(W+2, '-');
    o << line << '\n';
    for    (size_t h = 0; h < H; ++h)
    {   o << "|";
        for(size_t w = 0; w < W; ++w)
        {   o << f[h][w];
        }   o << "|\n";
    }       o << line << '\n';
    return  o;
}
 
 
struct Rand
{   Rand(            ){   srand((unsigned)time(0));}
    Rand(unsigned sid){   srand(sid);              }
    int  operator   ()(int range_min, int range_max)   const
    {
        return rand () %  (range_max -    range_min) + range_min;
    }
}rrand;
 
 
struct  Bot
{       Bot      (std::string nm) :
            field(std::vector(10, std::string(10, '.'))),
            authorname  (nm),
            MAXSTEP(10 * 10 / 2)
        {
        }
 
    ///---------------------|
    /// Это ваше поле.      |
    ///---------------------:
    std::vector<std::string> field;
    std::string         authorname;
 
    int cnt_steps = 0;
    const int MAXSTEP;
 
    void step(const Plot p, char f)
    {   field[p.y][p.x] = f;
        std::cout  << field      << std::endl;
    }
 
    ///-------------------------------|
    /// Это основной метод.           |
    /// его будет дёргать Арбитер,    |
    /// чтоб узнать ваше решение.     |
    ///-------------------------------:
    Plot step()
    {
        if(MAXSTEP == cnt_steps++) return {0, size_t(-1)};
 
        const auto& H = field   .size();
        const auto& W = field[0].size();
 
        Plot p;
 
        /// TODO ...
        ///--------------------...
        /// пример простейшего решения ...
        ///--------------------...
        while(true)
        {
            p.x = rrand(0, W);
            p.y = rrand(0, H);
 
            if( verification_no_info(p))
            {   field[p.y][p.x] = authorname.back();
 
                std::cout << authorname  << ": "
                          << p.x << ", " << p.y << ":\n";
 
                std::cout  << field      << std::endl;
 
                return p;
            }
        }
 
        return {size_t(-1), 0};
    }
 
    void fclear()
    {   field = std::vector(10, std::string(10, '.'));
    }
 
private:
    bool verification_no_info(const Plot& p) const
    {   return field[p.y][p.x] != '.';
    }
};
 
struct Web
{
    bool is_end(){ return step.y == size_t(-1); }
 
    Plot step{5,5};
}web;
 
struct  Server
{       Server() : bot("Vasia-X") {}
 
    Bot bot;
 
    void go()
    {
        switch(now)
        {
            case 0:            bot.step(web.step, bot.authorname.back()); break;
            case 1: web.step = bot.step(                               ); break;
        }
 
        now = 1 - now;
    }
 
    int now = 0;
};
 
struct  Client
{       Client() : bot("John-O") {}
 
    Bot bot;
 
    void go()
    {
        switch(now)
        {
            case 0: web.step = bot.step(                               ); break;
            case 1:            bot.step(web.step, bot.authorname.back()); break;
        }
 
        now = 1 - now;
    }
 
    int now = 1;
};
 
 
int main()
{
    Server s;
    Client c;
 
    while(!web.is_end())
    {
        s.go();
        s.go();
        c.go();
        c.go();
 
        std::cout << ".... press enter\n";
        std::cin.get(); /// Моделируем магнитные бури ...
    }
}
ну ещё где то её надо подправить ...
0
19.03.2023, 22:10

Не по теме:

Цитата Сообщение от XLAT Посмотреть сообщение
или это проблема времени.
Если это проблема...
Тут никто никого батрачить не заставляет, дедлайнов нет.
Я, например, сам только знакомлюсь с возможностями буста.
Уверен, что ты сделаешь свою часть раньше, у меня только заготовки канала и парсера есть.

0
Just Do It!
 Аватар для XLAT
4219 / 2680 / 656
Регистрация: 23.09.2014
Сообщений: 9,235
Записей в блоге: 3
19.03.2023, 23:08
Цитата Сообщение от XLAT Посмотреть сообщение
ну ещё где то её надо подправить ...
во, заработало))) ёшкин код, такой пук в лужу и то нуно отлаживать)
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
#include <iostream>
///----------------------------------------------------------------------------|
/// ...
///----------------------------------------------------------------------------:
#include <cstdlib>
#include <vector>
#include <string>
#include <ctime>
 
#define  l(v)  std::cout << #v << " = " << v << "\n";
 
struct Plot{ size_t x, y; };
 
template<typename T>
T& operator<<(T& o, const Plot& p)
{          o << "{ " << p.x << ", " << p.y << " }";
    return o;
}
 
std::ostream& operator<<(std::ostream& o, std::vector<std::string>& f)
{
    const auto& H = f   .size();
    const auto& W = f[0].size();
 
    std::string line(W+2, '-');
    o << line << '\n';
    for    (size_t h = 0; h < H; ++h)
    {   o << "|";
        for(size_t w = 0; w < W; ++w)
        {   o << f[h][w];
        }   o << "|\n";
    }       o << line << '\n';
    return  o;
}
 
 
struct Rand
{   Rand(            ){   srand((unsigned)time(0));}
    Rand(unsigned sid){   srand(sid);              }
    int  operator   ()(int range_min, int range_max)   const
    {
        return rand () %  (range_max -    range_min) + range_min;
    }
}rrand;
 
 
struct  Bot
{       Bot      (std::string nm) :
            field(std::vector(10, std::string(10, '.'))),
            authorname  (nm),
            MAXSTEP(10 * 10 / 3)
        {
        }
 
    ///---------------------|
    /// Это ваше поле.      |
    ///---------------------:
    std::vector<std::string> field;
    std::string         authorname;
 
    int cnt_steps = 0;
    const int MAXSTEP;
 
    void step(const Plot p, char f)
    {   field[p.y][p.x] = f == 'X' ? 'O' : 'X';
        std::cout  << field      << std::endl;
    }
 
    ///-------------------------------|
    /// Это основной метод.           |
    /// его будет дёргать Арбитер,    |
    /// чтоб узнать ваше решение.     |
    ///-------------------------------:
    Plot step()
    {
        if(MAXSTEP == cnt_steps++) return {0, size_t(-1)};
 
        const auto& H = field   .size();
        const auto& W = field[0].size();
 
        Plot p;
 
        /// TODO ...
        ///--------------------...
        /// пример простейшего решения ...
        ///--------------------...
        while(true)
        {
            p.x = rrand(0, W);
            p.y = rrand(0, H);
 
            if( verification_no_info(p))
            {   field[p.y][p.x] = authorname.back();
 
                std::cout << authorname  << ": "
                          << p.x << ", " << p.y << ":\n";
 
                std::cout << field      << std::endl;
 
                return p;
            }
        }
 
        return {size_t(-1), 0};
    }
 
    void fclear()
    {   field = std::vector(10, std::string(10, '.'));
    }
 
private:
    bool verification_no_info(const Plot& p) const
    {   return field[p.y][p.x] == '.';
    }
};
 
struct Web
{
    bool is_end(){ return step.y == size_t(-1); }
 
    Plot step{5,5};
}web;
 
struct  Server
{       Server() : bot("Vasia-X") {}
 
    Bot bot;
 
    void go()
    {
        switch(now)
        {
            case 0:            bot.step(web.step, bot.authorname.back()); break;
            case 1: web.step = bot.step(                               ); break;
        }
 
        now = 1 - now;
    }
 
    int now = 1;
};
 
struct  Client
{       Client() : bot("John-O") {}
 
    Bot bot;
 
    void go()
    {
        switch(now)
        {
            case 0: web.step = bot.step(                               ); break;
            case 1:            bot.step(web.step, bot.authorname.back()); break;
        }
 
        now = 1 - now;
    }
 
    int now = 1;
};
 
 
int main()
{
    Server s;
    Client c;
 
    while(!web.is_end())
    {
        s.go();
        c.go();
        c.go();
        s.go();
 
        std::cout << ".... press enter\n";
        std::cin.get(); /// Моделируем магнитные бури ...
    }
}
Цитата Сообщение от zayats80888 Посмотреть сообщение
Сессия создаёт:
ок.
буду вникать с пристрастием ...

дедлайна нет.
но хвастай малюсенькими тестами.

Не по теме:

у мя тут виндовые пайпы именованные,
на базе вот этого https://learn.microsoft.com/ru... sing-pipes
налепил 3 сосны и хрен работают - в смысле заблудился в 3 соснах.



вот есть ещё такой таскборд - шоп задачи вешать:
https://www.cyberforum.ru/post16774690.html
но все боятся туда заходить,
народ нынче пуганный пошёл, любого куста боится))
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
21.03.2023, 21:26
Цитата Сообщение от XLAT Посмотреть сообщение
но хвастай малюсенькими тестами.
Ну раз молчишь, держи наброски. Попробуй собрать и запустить. Арбитр и бот там заглушки, которые просто пинг-понгом сообщений занимаются, их реализация все еще на тебе. При сборке: основной target - test_tictactoe. Если будут проблемы с подтягиванием буста через cmake, покопайся тут.
Вложения
Тип файла: zip server.zip (68.6 Кб, 4 просмотров)
1
Just Do It!
 Аватар для XLAT
4219 / 2680 / 656
Регистрация: 23.09.2014
Сообщений: 9,235
Записей в блоге: 3
21.03.2023, 21:55
Цитата Сообщение от zayats80888 Посмотреть сообщение
Ну раз молчишь
ну,
я тут чуть- чуть покапал гуй,
чуть-чуть пописа пайпы,
полистал азио оффлайн, который 1400 страниц

почитал отдельные страницы:


мимо проходя наткнулся на занятный обзор сериализаторов:
https://mikeloomisgg.github.io... n-library/

типа вот этот из бинарных самый лучший:
https://github.com/msgpack/msg... er/spec.md

...
1
Just Do It!
 Аватар для XLAT
4219 / 2680 / 656
Регистрация: 23.09.2014
Сообщений: 9,235
Записей в блоге: 3
21.03.2023, 22:11
Цитата Сообщение от zayats80888 Посмотреть сообщение
Если будут проблемы с подтягиванием буста
нее.
буст из коробки, хоть на gcc, хоть на clang(msys2 же), хоть на vc++

для vc вот из коробки так:
https://www.cyberforum.ru/post16762827.html
0
Just Do It!
 Аватар для XLAT
4219 / 2680 / 656
Регистрация: 23.09.2014
Сообщений: 9,235
Записей в блоге: 3
21.03.2023, 23:20
zayats80888,
так должно быть?
1
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
21.03.2023, 23:33
Цитата Сообщение от XLAT Посмотреть сообщение
так должно быть?
Блин, забыл, что ты на винде. Короче
1) убедись, что бинарник бота и бинарник теста лежат в одном каталоге или полный путь пропиши, я сейчас это захардходил(вроде, в cmake настроил, должны лежать в подкаталоге bin каталога сборки)
2) в файле src/service/tictactoe/service.cpp в реализации метода service::launch() в команде запуска процесса исправь имя екзешника (расширение exe, наверное, нужно добавить, я давно на винде не работал) :
C++
1
2
3
::io::create_process_channel(m_strand.context(), "echo_cli -t")
//                                                  ^
//                                                 вот это в двух местах
Кстати, а почему у тебя имена бинарников странные такие? Ты не через cmake проект генерировал?
1
Just Do It!
 Аватар для XLAT
4219 / 2680 / 656
Регистрация: 23.09.2014
Сообщений: 9,235
Записей в блоге: 3
22.03.2023, 00:25
Цитата Сообщение от zayats80888 Посмотреть сообщение
расширение exe, наверное, нужно добавить
нее,
бинарник просто переименовать:


Цитата Сообщение от zayats80888 Посмотреть сообщение
Ты не через cmake проект генерировал?
нет.
у меня тут компиляторов сто штук и я в окружение ничего не пишу, шоп не путалось...

а на vc симейк жалуется, буст ему надо показать где лежит...

вообщем с симейком тоже гемор - без симейка быстрее получается)

но ваще надо настроить его конеш.
1
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
22.03.2023, 01:27
Цитата Сообщение от XLAT Посмотреть сообщение
у меня тут компиляторов сто штук и я в окружение ничего не пишу, шоп не путалось...
Если запускать из консоли MSYS, cmake сам из окружения подтянет нужное.
Цитата Сообщение от XLAT Посмотреть сообщение
а на vc симейк жалуется, буст ему надо показать где лежит...
У тебя же буст через nuget установлен? Попробуй запустить cmake из командного промта студии.
Цитата Сообщение от XLAT Посмотреть сообщение
вообщем с симейком тоже гемор - без симейка быстрее получается)
Но тогда совместная разработка становится вообще ужасным гемором, у каждого своя структура проекта будет
1
Just Do It!
 Аватар для XLAT
4219 / 2680 / 656
Регистрация: 23.09.2014
Сообщений: 9,235
Записей в блоге: 3
22.03.2023, 01:48
Цитата Сообщение от zayats80888 Посмотреть сообщение
Но тогда совместная разработка становится вообще ужасным гемором
как с улажу этот вопрос с симейком отпишусь про альтернативы.
0
Just Do It!
 Аватар для XLAT
4219 / 2680 / 656
Регистрация: 23.09.2014
Сообщений: 9,235
Записей в блоге: 3
22.03.2023, 14:55
Цитата Сообщение от XLAT Посмотреть сообщение
как с улажу этот вопрос с симейком

Не по теме:

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

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

(это вместо матов)



запускаю симейк и генерю проект:
Code
1
2
3
4
5
6
7
8
9
10
11
12
The CXX compiler identification is GNU 12.2.0
Detecting CXX compiler ABI info
Detecting CXX compiler ABI info - done
Check for working CXX compiler: C:/MSYS2/msys32/mingw32/bin/c++.exe - skipped
Detecting CXX compile features
Detecting CXX compile features - done
Performing Test CMAKE_HAVE_LIBC_PTHREAD
Performing Test CMAKE_HAVE_LIBC_PTHREAD - Success
Found Threads: TRUE  
Found Boost: C:/MSYS2/msys32/mingw32/include (found suitable version "1.80.0", minimum required is "1.76") found components: thread system chrono atomic 
Configuring done
Generating done
проект генерится в такое чудовище:
(...)
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
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
Структура папок тома 2022-Data
Серийный номер тома: 66EC-DBA2
E:.
|   !tree_dir.bat
|   CMakeCache.txt
|   cmake_install.cmake
|   Makefile
|   server.cbp
|   tree_dir.txt
|   
+---bin
+---CMakeFiles
|   |   cmake.check_cache
|   |   CMakeDirectoryInformation.cmake
|   |   CMakeOutput.log
|   |   Makefile.cmake
|   |   Makefile2
|   |   progress.marks
|   |   TargetDirectories.txt
|   |   
|   +---3.25.1
|   |   |   CMakeCXXCompiler.cmake
|   |   |   CMakeDetermineCompilerABI_CXX.bin
|   |   |   CMakeRCCompiler.cmake
|   |   |   CMakeSystem.cmake
|   |   |   
|   |   \---CompilerIdCXX
|   |       |   a.exe
|   |       |   CMakeCXXCompilerId.cpp
|   |       |   
|   |       \---tmp
|   +---pkgRedirects
|   \---Progress
|           3
|           count.txt
|           
\---src
    |   cmake_install.cmake
    |   Makefile
    |   
    +---ai
    |   |   cmake_install.cmake
    |   |   Makefile
    |   |   
    |   \---CMakeFiles
    |       |   CMakeDirectoryInformation.cmake
    |       |   progress.marks
    |       |   
    |       \---echo_cli.dir
    |               build.make
    |               cmake_clean.cmake
    |               compiler_depend.make
    |               compiler_depend.ts
    |               depend.make
    |               DependInfo.cmake
    |               flags.make
    |               includes_CXX.rsp
    |               link.txt
    |               linkLibs.rsp
    |               objects1
    |               progress.make
    |               
    +---CMakeFiles
    |       CMakeDirectoryInformation.cmake
    |       progress.marks
    |       
    +---io
    |   |   cmake_install.cmake
    |   |   Makefile
    |   |   
    |   \---CMakeFiles
    |       |   CMakeDirectoryInformation.cmake
    |       |   progress.marks
    |       |   
    |       \---server_io.dir
    |               build.make
    |               cmake_clean.cmake
    |               cmake_clean_target.cmake
    |               compiler_depend.internal
    |               compiler_depend.make
    |               compiler_depend.ts
    |               depend.make
    |               DependInfo.cmake
    |               flags.make
    |               includes_CXX.rsp
    |               link.txt
    |               process_channel.cpp.obj.d
    |               progress.make
    |               
    +---service
    |   |   cmake_install.cmake
    |   |   Makefile
    |   |   
    |   +---CMakeFiles
    |   |       CMakeDirectoryInformation.cmake
    |   |       progress.marks
    |   |       
    |   \---tictactoe
    |       |   cmake_install.cmake
    |       |   Makefile
    |       |   
    |       \---CMakeFiles
    |           |   CMakeDirectoryInformation.cmake
    |           |   progress.marks
    |           |   
    |           \---service_tictactoe.dir
    |               |   build.make
    |               |   cmake_clean.cmake
    |               |   cmake_clean_target.cmake
    |               |   compiler_depend.make
    |               |   compiler_depend.ts
    |               |   depend.make
    |               |   DependInfo.cmake
    |               |   flags.make
    |               |   includes_CXX.rsp
    |               |   link.txt
    |               |   progress.make
    |               |   
    |               \---parser
    \---test
        |   cmake_install.cmake
        |   Makefile
        |   
        \---CMakeFiles
            |   CMakeDirectoryInformation.cmake
            |   progress.marks
            |   
            \---test_tictactoe.dir
                    build.make
                    cmake_clean.cmake
                    compiler_depend.make
                    compiler_depend.ts
                    depend.make
                    DependInfo.cmake
                    flags.make
                    includes_CXX.rsp
                    link.txt
                    linkLibs.rsp
                    objects1
                    progress.make
открываю в иде:
компиляция(ребилд):


и тут же такое:




Не по теме:

меня точит вопрос,
почему без симейка я скомпилил проект за 10 минут,

а симейком я уже ***** несколько часов и резултат 0?



туда куда сборщик ссылается на ошибки таких директорий и файлов просто нет.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
22.03.2023, 14:55

Оцените сборку в днс , как можно улучшить ? Бюджет 50 к
Вот http://www.dns-shop.ru/conf/b6dc324d86718ee2/ ссылка на днс , хотел бы узнать как вам моя сборка , делаю это в первый раз Бюджет 55 к

Посоветуйте как улучшить код
@Autowired private ClothFabricRepository clothFabricRepository; @Autowired private CurtainRepository curtainRepository; ...

Посоветуйте, как улучшить код?
Здравствуйте! Вот такую форму написал. Посоветуйте как улучшить код? &lt;html&gt; &lt;head&gt; &lt;title&gt;&lt;/title&gt; ...

Крестики-нолики: как написать код для того, чтобы программа могла объявить победителя?
И да, поле 5 на 5. Сам код: #include &lt;iostream&gt; #include &lt;locale.h&gt; #include &lt;Windows.h&gt; using namespace std; void...

Подскажите какую игру можно написать в Делфи, не сильно сложную, не такую, как змейка, крестики-нолики, пинг-понг и т.д?
Мне нужно написать какую-нибудь программу в делфи, но как говорит мой препод &quot;не такую, что можно написать за 5 минут&quot;, но мне...


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

Или воспользуйтесь поиском по форуму:
220
Ответ Создать тему
Новые блоги и статьи
сукцессия 30. Фосфорный и азотный замки по "честному" закону лимитирования Либиха
anaschu 16.07.2026
Основные достижения за последние дни 1. Механизм отложенного высвобождения фосфора Добавлен специальный пул для медленного разложения меланизированных гиф ЕСМ Реализована разная скорость. . .
Запрет пометки на удаление и отмены проведения
Maks 16.07.2026
Алгоритм из решения ниже реализован на нетиповом документе "ПутевойЛист" разработанного в КА2. Задача: запретить помечать на удаление и отменять проведения путевого листа при условии, если он сдан. . .
Как надо было делать правильно - вообще не слушать ИИ, его дело - текст.
Hrethgir 15.07.2026
А вообще надо было делать не так, чтобы не исправлять ошибку https:/ / www. cyberforum. ru/ blogs/ 223907/ 10996. html , правильно было : удалил кнопку, а потом добавил её. Всё это стресс конечно. Почему?. . .
Знаете, от чего появляется стресс?
kumehtar 15.07.2026
Стресс появляется оттого, что вы, зная как поступить правильно, делаете наоборот. Ларри Уингет
Нас бьют, а мы крепчаем? Какая чушь!
kumehtar 15.07.2026
Вот это вот бытующее мнение, что человек меняется только под действием проблем, всегда считал вредоносным. Поверь, от проблем у людей появляются не изменения, а нервное расстройство и ПТСР. А. . .
сукцессия 29. Переход от одних деревьев на другие делать более или менее вероятностным?
anaschu 12.07.2026
Насколько смена типов микоризы — исключительное событие в двухвековой сукцессии? Оценка вероятности в пространстве параметров В текущей версии модели успешно реализован ключевой механизм. . .
сукцессия 27. Думаю, как переделывать уже написанную статью с планами на сукцессию.
anaschu 12.07.2026
Анализ соответствия модели требованиям Реализованные компоненты: Механизм закисления почвы через протонную помпу Конкуренция между типами микориз pH как триггер сукцессии C/ P соотношение. . .
Сукцессия 26. Мат модель создана.
anaschu 12.07.2026
Модель смены растительных сукцессий посредством управления грибами работает внутри небольшой ячейки почвы, восстанавливающейся после пожара, где ненадолго бывшее царство хвойных снова захватили. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru