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

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

05.03.2023, 19:56. Показов 17199. Ответов 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
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,038
Записей в блоге: 1
18.03.2023, 12:24
Студворк — интернет-сервис помощи студентам
XLAT, мне вечером, бывает, нефиг делать. Можно глянуть будет?
0
Just Do It!
 Аватар для XLAT
4219 / 2680 / 656
Регистрация: 23.09.2014
Сообщений: 9,235
Записей в блоге: 3
18.03.2023, 14:10
zayats80888,
ок, отлично.

да, так оно должно выглядеть: c верху вниз, охватывая сразу всё.

я не знаю к чему тут(#180) можно придраться.

на этом слое всё нативно ясно.

но могу высказать ~пару пожеланий:
1. ВСЕ СТЫКИ МЕЖДУ МОДУЛЯМИ ТОКА ЧЕРЕЗ АБСТРАКЦИИ.
2. Очень желательно под эти абстракции набор требований, которые могут быть выражены через ассерты.
3. памяти бессметного Макконнелла - ТОЛЬКО СУЩЕСТВЕННЫЕ СВОЙСТВА, т.е. не распыляться на хотелки.
4. механизм для добавление хотелок - это отдельный механизм - как он будет выглядеть я хз.
5. хотелось бы так, чтобы один модуль можно было легко заменить другим модулем, отличающимся содержанием.

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

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

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

Цитата Сообщение от zayats80888 Посмотреть сообщение
то подумай, внеси правки
вот такое замечание:
Наши задачи продолжают быть слишком большими - нужен ДЕКОМПОЗИТОР,
ну, ни как чел, а как инструмент технологии.

Добавлено через 1 минуту
Цитата Сообщение от Croessmah Посмотреть сообщение
мне вечером, бывает, нефиг делать. Можно глянуть будет?
медаль "ПРИКОЛИСТ" на какой стороне костюма носишь?

глядеть моно - говорить тока с позволения..
1
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,038
Записей в блоге: 1
18.03.2023, 14:25
XLAT, ну, нет так нет.
0
Just Do It!
 Аватар для XLAT
4219 / 2680 / 656
Регистрация: 23.09.2014
Сообщений: 9,235
Записей в блоге: 3
18.03.2023, 14:35
Croessmah,
ввиду тебя, в кратце, в суть:

у тя 2041 действенных ответов,
все ответы решали какие то частные случаи для задач, в которые авторы редко когда посвящают.
(...)
теперь представь, что эти 2041 ответа ты бы дал в рамках ОДНОГО проекта.

согласись со мной, что такой проект уже бы, наверняка, РАБОТАЛ.

за 11 лет, я уверен, что ты бы сам - лично написал бы тут на форуме свою ОС.

согласен?

Добавлено через 3 минуты
Цитата Сообщение от Croessmah Посмотреть сообщение
ну, нет так нет
тогда вот вот эту тему мне расшевели, пжлста:
Делаем(!) С++ сервак для Морского Боя и Морской Бой тоже

моно не щас - моно через месяц.
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,038
Записей в блоге: 1
18.03.2023, 14:38
согласен?
Неа. Люди вон целой корпорацией не могут ОС написать. Что не делают, постоянно Windows получается.
0
Just Do It!
 Аватар для XLAT
4219 / 2680 / 656
Регистрация: 23.09.2014
Сообщений: 9,235
Записей в блоге: 3
18.03.2023, 14:59
Цитата Сообщение от Croessmah Посмотреть сообщение
Люди вон целой корпорацией не могут ОС написать
обрати ещё раз внимание на важный нюанс:
ты бы не просто написал ОС, а написал бы ОС прямо тут на форуме.

почему это не случилось?

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

пока это фатальная проблема:
- поставить хост-задачу
- разбить её на подзадачи,
- далее рекурсией до неразбиваемости.

люди могут приходить - могут уходить - а субзадачи всё время остаются:
решенные, частично решенные, по разному решенные или нерешенные.
1
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
18.03.2023, 15:42
Цитата Сообщение от XLAT Посмотреть сообщение
но могу высказать ~пару пожеланий:
1. ВСЕ СТЫКИ МЕЖДУ МОДУЛЯМИ ТОКА ЧЕРЕЗ АБСТРАКЦИИ.
2. Очень желательно под эти абстракции набор требований, которые могут быть выражены через ассерты.
3. памяти бессметного Макконнелла - ТОЛЬКО СУЩЕСТВЕННЫЕ СВОЙСТВА, т.е. не распыляться на хотелки.
4. механизм для добавление хотелок - это отдельный механизм - как он будет выглядеть я хз.
5. хотелось бы так, чтобы один модуль можно было легко заменить другим модулем, отличающимся содержанием.
Да я не против, только не понял, что такое "модуль".
Цитата Сообщение от XLAT Посмотреть сообщение
кстати, у мя было много раздумок, по поводу можно ли заставить синхронное соединение работать для внешнего наблюдателя, как если это работало асинхронное.
если один поток слушает синхронно порт- получает соединение отдает его другому потоку и снова слушает.
то это синхронка или асинхронка? тут тонкость относительно той или иной части используемого инструментария.
"Асинхронка", только реализована на уровне процесса. Асинхронное, не значит многопоточное. ОС предоставляет возможность слушать множество портов единовременно. Но я предлагаю не опускаться на такой низкий уровень, это платформозависимо и громоздко, тем более, что обертки давно написаны (тот же :SocketSelector в sfml). Я потому и предлагаю взять готовое.
Цитата Сообщение от XLAT Посмотреть сообщение
готовые пакеты есть даже в SFML...
ваще граф парсера может получиться достаточно сложный - сюда тоже желательно стырить какую-нить базовую теорию.
Что за пакеты? По поводу SFML, можно было бы и с ним работать, но изначально задача стояла устроить соревнование для ИИ, которое будут писать сторонние люди. Тебе нужно было запускать (возможно, предварительно скомпилировав прям на сервере) чужой код в отдельном процессе. Т.е. нужна либа для работы с процессами. Я потому и предлагаю взять boost, там это все есть, тем более я видел, что ты уже её пытался подтянуть.
Цитата Сообщение от XLAT Посмотреть сообщение
конкретно, для того чтобы любая(логического жанра) игра удовлетворяющая этому интерфейсу легко цеплялась на гуй.
Ну а ГУЙ на сервере вообще не нужен. Клиентов же можно на чем угодно писать, кому как удобнее.
Цитата Сообщение от XLAT Посмотреть сообщение
вот такое замечание:
Наши задачи продолжают быть слишком большими - нужен ДЕКОМПОЗИТОР,
ну, ни как чел, а как инструмент технологии.
Валяй, только я в своём сообщении уже вроде поставил задачку минимум (прям меньше некуда).
Сначала составим какркас проекта на основе этой задачи, чтоб работало. Я тебе его скину, ты его покрутишь и выложешь на гитхаб.
Дальше там будешь ставить и распределять задачи, я форкну заведу ветку, сделаю и запушу реквест. Ты отревьюишь, отклонишь для доработки или примешь. И так далее.

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

Что я прошу сделать тебя:
1) Бота:
Кликните здесь для просмотра всего текста
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
Текстовый протокол для бота (ASCII):
1.  каждое сообщение завершается символом переводом строки '\n'
2.  первое сообщение каждому содержит через один пробел
    - ширину игрового поля (целое число),
    - высоту игрового поля (целое число),
    - цвет фишки (символ 'O' или 'Х')
3.  каждое последующее сообщение содержит два целых числа
    - ход противника (от сервера)
    - твой ход (от игрока)
4. ???
 
Псевдокод для бота:
 
#include <iostream>
int main()
{
    unsigned short x, y;
    char c;
    // считываем первое сообщение
    if (!(std::cin >> x >> y >> c))
        return -1;
    // инициализация состояния игры
    initialize_state(x, y, c);
 
    for (;;)
    {
        switch (c)
        {
            case 'O': // первый ход за протвником
                c = 'X';
                // считываем ход противника
                if (!(std::cin >> x >> y))
                    return -1;
                    
                break;
            default:
                // отправляем наш ход
                std::cout << x << ' ' << y << '\n';
                // считываем ход противника
                if (!(std::cin >> x >> y))
                    return -1;
        }
        if (do_step(&x, &y) == false)
          break; // если проиграли
    }
    return 0;
}

2) Арбитра, с минимальной логикой для поддержки работы такого примитивного протокола:
Кликните здесь для просмотра всего текста
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
/* arbiter.hpp */
#include <message.hpp>
 
namespace service::tic_tac_toe
{
  class player;
  class listener;
 
  class arbiter
  {
  public:
    // инициализация - две ссылки на игроков и, возможно,
    // одного слушателя игры
    arbiter(player *first, player *second, listener *subscriber);
 
    // начало игры:
    // утановка таймаутов игрокам (player::set_timeout),
    // установка ссылки на себя для обратной связи (player::set_arbiter)
    // отправка первых сообщений игрокам (тому, что ходит первым, reply == true)
    void start();
 
    // этот метод будет дергать игрок, доставляя сообщение от игрока
    // нужен ли дополнительный аргумент - указатель на игрока?
    // я думаю нет, игра пошаговая, но если нужно для твоей логики, добавь
    void on_player_step(message const &msg);
      
    // ...
  };
} // namespace service::tic_tac_toe

3) Наблюдателя, по желанию:
Кликните здесь для просмотра всего текста
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
/* listener.hpp */
#include <message.hpp>
 
// ОПЦИОНАЛЬНО!!!
// интерфейс слушателя, это второстепенно пока,
// позже понадобится,
// но можешь реализовать простенкого слушателя,
// который будет печатать ход игры в консоль, например
// (реализация на твое усмотрение, только не завязывайся на winapi)
 
namespace service::tic_tac_toe
{
  class player;
 
  // сообщение от игрока арбитру
  struct player_reply
  {
    message msg;
    player *sender;
  };
 
  // соообщение от арбитра игроку
  struct arbiter_request
  {
    message msg;
    player *receiver;
  };
 
  // добавь что-то еще
 
  using event = ::std::variant<player_reply, arbiter_request>;
 
  class listener
  {
  public:
    virtual void notify(event const &e) = 0;
  };
 
} // namespace service::tic_tac_toe


Теперь, что тебе понадобится для этого с моей стороны(это я сделаю):
Кликните здесь для просмотра всего текста
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
/* message.hpp */
#include <variant>
 
namespace service::tic_tac_toe
{
  using ushort_t = unsigned short;
 
  enum class color_t : ushort_t
  {
    zero,
    cross,
  };
 
  // начальное сообщение игроку
  struct start_t
  {
    ushort_t field_width;
    ushort_t field_height;
    color_t color;
  };
 
  // ход
  struct step_t
  {
    ushort_t x;
    ushort_t y;
  };
 
  // причина завершения игры
  enum class finish_reason_t : ushort_t
  {
    // вышло время ожидания
    timed_out, 
 
    // ошибка ввода вывода,
    // пока посылается только от игрока арбитру
    // в случае системного сбоя или ошибки парсера,
    // но можно и игроку отправлять, если он не так пошел
    // (боту это не нужно, его мы убиваем в этом случае)
    io_error,
 
    // это тоже опционально, как сообщения игроку,
    // бот обойдется, можешь забить
    winner,
    looser,
    draw,
  };
 
  using message = ::std::variant<start_t, step_t, finish_reason_t>;
 
} // namespace service::tic_tac_toe
 
 
 
/* player.hpp */
#include <message.hpp>
#include <chrono>
 
namespace service::tic_tac_toe
{
  class arbiter;
 
  // минимальный интерфейс, с которым должен взаимодействовать твой арбитр
  class player
  {
  public:
    using timeout_type = ::std::chrono::milliseconds;
 
    // управление таймаутом для обмена сообщением
    // по истечении которого, если игрок не отвечает,
    // арбитру приходит сообщение finish_reason_t::timed_out
    void set_timeout(timeout_type timeout) noexcept;
    timeout_type get_timeout() const noexcept;
 
    // для обратной связи
    void set_arbiter(arbiter *owner) noexcept;
    arbiter *get_arbiter() const noexcept;
 
    // отправка сообщения игроку,
    // если reply == true, то на сообщение требуется ответ
    // (я не хочу завязывать анализ сообщения в логику транспорта,пусть будет флаг)
    void send_message(message const &msg, bool reply);
 
    //...
  };
 
} // namespace service::tic_tac_toe
 
 
/* utility.hpp */
 
#include <message.hpp>
#include <iostream>
 
// возможно тебе пригодится для реализации слушателя(печати лога в консоль)
namespace service::tic_tac_toe
{
  inline char to_char(color_t color) noexcept
  {
    return "OX"[static_cast<ushort_t>(color)];
  }
 
  inline char to_char(finish_reason_t reason) noexcept
  {
    return "TEWLD"[static_cast<ushort_t>(reason)];
  }
 
  inline ::std::ostream &operator<<(::std::ostream &out, start_t const &msg)
  {
    return out << msg.field_width << ' '
               << msg.field_height << ' '
               << to_char(msg.color);
  }
 
  inline ::std::ostream &operator<<(::std::ostream &out, step_t const &msg)
  {
    return out << msg.x << ' ' << msg.y;
  }
 
  inline ::std::ostream &operator<<(::std::ostream &out, finish_reason_t msg)
  {
    return out << to_char(msg);
  }
 
  inline ::std::istream &operator>>(::std::istream &in, step_t &msg)
  {
    return in >> msg.x >> msg.y;
  }
 
  inline ::std::ostream &operator<<(::std::ostream &out, message const &msg)
  {
    return ::std::visit(
        [&out](auto const &value) -> decltype(auto)
        { return out << value; },
        msg);
  }
} // namespace service::tic_tac_toe


Если согласен, то я пойду кодить.
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
18.03.2023, 15:48
Чой- то тут происходит ?
XLAT, могу взять на себя CMake. Долго откладывал его освоение.
Только ты, как ведущий девелопер поставь мне задачу.
А то я могу и пол года нюансы Cmak-a ковырять в носу.
0
Just Do It!
 Аватар для XLAT
4219 / 2680 / 656
Регистрация: 23.09.2014
Сообщений: 9,235
Записей в блоге: 3
18.03.2023, 16:33
Цитата Сообщение от zayats80888 Посмотреть сообщение
что такое "модуль".
набор классов предметно связанных между собой, но для юзера на эти связи фиолетово.
но есть торчащее апи для взаимодействия с миром.

ну, или просто модуль это кубик на схеме)

Цитата Сообщение от zayats80888 Посмотреть сообщение
Я потому и предлагаю взять готовое.
ок.
да. я не программист - я интегратор!

Цитата Сообщение от zayats80888 Посмотреть сообщение
Что за пакеты?
не верю, шо ты спросил - ты же Асс в sfml)
https://www.sfml-dev.org/docum... Packet.php

да щас дело не в пакетах, можно и свой парсер, но "яжеинтегратор"

Цитата Сообщение от zayats80888 Посмотреть сообщение
Ну а ГУЙ на сервере вообще не нужен.
ну, я бы хотел, привлечь больше студентов, а студентам нужно шоп блестело.
да и тестить где-то всё равно надо.
ни и гуй это не так уж и сложно делать, потому что его видно сразу)

Цитата Сообщение от zayats80888 Посмотреть сообщение
Что я прошу сделать тебя:
1) Бота:
уже готов?

Цитата Сообщение от zayats80888 Посмотреть сообщение
Арбитра,
арбитру нужны будут игроки(боты), можно 100, но минимум 1(+1 его клон).
арбитр управляет сначала игроками, потом уже отдельной игрой,
и сколько игр и в каком графике их проводить.

т.е. вопрос:
Какой объект предоставит Арбитру этих игроков?
понятно, что сервер это тоже объект, но конкретнее?

в текущем состоянии игроков собирает в директории ответственный за это DDLmaneger.

Цитата Сообщение от zayats80888 Посмотреть сообщение
Наблюдателя, по желанию:
да будет обязательно, но позже)

Цитата Сообщение от SmallEvil Посмотреть сообщение
могу взять на себя CMake
я симейком только чужие проекты собираю.

как то раз заглянул в код симейка нашего любимого сфмл:
https://github.com/SFML/SFML/b... eLists.txt

и писать симейк скрипт у мя отпало))

Цитата Сообщение от zayats80888 Посмотреть сообщение
Я потому и предлагаю взять boost
я не против.

Добавлено через 9 минут
Цитата Сообщение от zayats80888 Посмотреть сообщение
std::cout << x << ' ' << y << '\n';
с потоками что мне неясно:
в поток мы кладем все подряд - в ОДНУ КУЧУ,
а на принимающей стороне как это будет разбираться?
для общего случая.
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
18.03.2023, 16:48
Цитата Сообщение от XLAT Посмотреть сообщение
не верю, шо ты спросил
А, ты про этот пакет. Я думал ты про какие-то пакеты для разработки парсеров (построение графов, про которое ты говорил).

Цитата Сообщение от XLAT Посмотреть сообщение
уже готов?
Это вопрос?
Цитата Сообщение от XLAT Посмотреть сообщение
арбитру нужны будут игроки(боты), можно 100, но минимум 1(+1 его клон).
арбитр управляет сначала игроками, потом уже отдельной игрой,
и сколько игр и в каком графике их проводить.
т.е. вопрос:
Какой объект предоставит Арбитру этих игроков?
понятно, что сервер это тоже объект, но конкретнее?
Т.е. у тебя арбитр управляет несколькими играми...
Не, я прошу локального арбитра для одного сеанса.
Управление сеансами (построением, турнирных сеток там, распределением и пр.) занимается служба(из той структуры, которую я тебе рисовал).
Вот она и предоставляет арбитру иигроков, а откуда она их получает на данном этапе не важно (сервер перенаправляет в эту службу).
Цитата Сообщение от XLAT Посмотреть сообщение
я не против.
Ок, тогда я делаю.
Цитата Сообщение от XLAT Посмотреть сообщение
с потоками что мне неясно:
в поток мы кладем все подряд - в ОДНУ КУЧУ,
а на принимающей стороне как это будет разбираться?
Парсером (да и какая разница, арбитр получит объект message).
Это пока моя проблема.
0
Just Do It!
 Аватар для XLAT
4219 / 2680 / 656
Регистрация: 23.09.2014
Сообщений: 9,235
Записей в блоге: 3
18.03.2023, 17:37
Цитата Сообщение от XLAT Посмотреть сообщение
уже готов?
нужен рабочий стенд чтобы привести(дописать код) бота в "боевую" готовность.

Цитата Сообщение от zayats80888 Посмотреть сообщение
unsigned short x, y;
предлагаю больше самодокументирования.

x, y это могут быть и размеры поля
x, y это мугут быть и координаты точки.

т.е. объединять мелкие сущности в родственные структуры.

Цитата Сообщение от zayats80888 Посмотреть сообщение
Управление сеансами (построением, турнирных сеток там, распределением и пр.) занимается служба(из той структуры, которую я тебе рисовал).
ок, турниры пока в сторону.

короче, шоп по пустякам не флудить, сделаю рипит:
Цитата Сообщение от XLAT Посмотреть сообщение
нужен рабочий стенд
поэтому пока будем считать что бот готов.
как стенд появится, так и бот уже точно будет готов)


рабочий стенд:
1. Сервер (на нём сидит Арбитр)
2. Клиенты(на одном клиенте сидит ОДИН бот(или кожаный чел))
3. запуск локально.
4. Сервер может адресоваться к конкретному клиенту, посылать его и принимать его, на как ответ на его(сервера) запрос.

замечание,
у мя в текущей игре - клиенты полностью пассивны, сами ничего не запрашивают.
поэтому запросы от клиентов должны быть НЕ в компетенции Арбитра.

этим должен заниматься на сервере кто-то другой - Регистратор Сервера(Управляющий аккаунтами)
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
18.03.2023, 17:46
Цитата Сообщение от XLAT Посмотреть сообщение
предлагаю больше самодокументирование.
x, y это могут быть и размеры поля
x, y это мугут быть и координаты точки.
т.е. объединять мелкие сущности в родственные структуры.
Это ж псевдокод. Я для тебе наглядности. "Олимпиадники" и не такое напишут.
Цитата Сообщение от XLAT Посмотреть сообщение
нужен рабочий стенд
Мне тоже. Но тебе это проще, у тебя там уже логика арбитра написана, вроде.
Ты же её на чем-то тестировал?
Да и бот тоже, он тут не нужен шибко умный, пусть даже намеренно рандомно тупит, лучше будет.
Просто перенеси часть логики своего Арбитра, отвечающую за судейство одного матча, в класс arbiter. Он судит двух игроков.
А в конце игры, пусть отправляет слушателю(listener) событие с сообщением о причине завершения игры,
можешь не уведомлять его о промежуточных событиях даже, это всё потом.
Просто мне работы меньше будет. Я у себя и проверю. Будут баги, попробую сам разобраться, не страшно.
Просто мне твою часть проще будет тестить, чем тебе мою. Если что не понятно по моим предложениям, то спрашивай, уточняй.
Или если хочешь радикально изменить, то пока еще не поздно.
Жду твою отмашку(не код, а добро на работу, параллельно будем) и приступаю к реализации.
1
Just Do It!
 Аватар для XLAT
4219 / 2680 / 656
Регистрация: 23.09.2014
Сообщений: 9,235
Записей в блоге: 3
18.03.2023, 17:58
Цитата Сообщение от zayats80888 Посмотреть сообщение
Ты же её на чем-то тестировал?
на счет буста или не буста,
(кстати sfml в убунте ваще без проблем - на раз и два - без три)

у мя есть желание заменить длл пайпами.
1. Кросс
2. потому что стандартно.

желание не сейчас возникло.

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

думаю вполне годные коннекты должны получиться для локального тестирования логики ботов, арбитров и тп..
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
18.03.2023, 18:11
Цитата Сообщение от XLAT Посмотреть сообщение
короче, я пойду гуглить пайпы, но а ты давай на бусте)
Слушай, я же написал, что задачу по реализации конкретного канала передачи данных я возьму на себя.
В бусте есть процессы и пайпы. Конкретно канал для общения с дочерним процессом бота я беру на себя.
Абстрактный йнтерфейс канала (пайпы не пайпы) я уже обдумал.
0
Just Do It!
 Аватар для XLAT
4219 / 2680 / 656
Регистрация: 23.09.2014
Сообщений: 9,235
Записей в блоге: 3
18.03.2023, 18:28
Цитата Сообщение от zayats80888 Посмотреть сообщение
Слушай, я же написал, что задачу по реализации конкретного канала передачи данных я возьму на себя.
тут всё в порядке - пайпы не решают главную задачу - написание НАСТОЯЩЕГО сервера.

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

и я надеюсь, что инструмент этот простой,
пока я их ещё не оформил.

кстати и качество архитектуры заодно легко будет проверить)

а пока коннекторов(сокетов) нет и поэтому и стенда нет.
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
18.03.2023, 18:39
Цитата Сообщение от XLAT Посмотреть сообщение
тут всё в порядке - пайпы не решают главную задачу
Я поэтому с них и начну. Но задачу они решают существенную - нет необходимости писать полноценного клиента для бота.

Кстати, если есть недопонимание, как написать асинхронного арбитра, то вот дополнил тот шаблон класса арбитра условным псевдокодом (короче, через state machine):
Кликните здесь для просмотра всего текста
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
/* arbiter.hpp */
#include <message.hpp>
 
namespace service::tic_tac_toe
{
  class player;
  class listener;
 
  class arbiter
  {
  public:
    // инициализация - две ссылки на игроков и, возможно,
    // одного слушателя игры
    arbiter(player *first, player *second, listener *subscriber);
 
    // начало игры:
    // утановка таймаутов игрокам (player::set_timeout),
    // установка ссылки на себя для обратной связи (player::set_arbiter)
    // отправка первых сообщений игрокам (тому, что ходит первым, reply == true)
    void start()
    {
      players[0]->set_timeout(...);
      players[0]->set_arbiter(this);
      players[0]->send_message(start_t{3, 3, cross}, true); // current
 
      players[1]->set_timeout(...);
      players[1]->set_arbiter(this);
      players[1]->send_message(start_t{3, 3, zero}, false);
    }
 
    // этот метод будет дергать игрок, доставляя сообщение от игрока
    // нужен ли дополнительный аргумент - указатель на игрока?
    // я думаю нет, игра пошаговая, но если нужно для твоей логики, добавь
    void on_player_step(message const &msg)
    {
      message next = update_state(msg)
      if (not_finish(next)) // если продолжаем
      {
        current ^= 1; // переключаем игрока
        players[current]->send_message(next, true);
        return;
      }
      subscriber->notify(next); // уведомляем о завершении игры
    }
 
 
    listener *subscriber;
    player *players[2];
    int current; // = 0 текуший игрок
    game_state state; // состояние
  };
} // namespace service::tic_tac_toe
1
Just Do It!
 Аватар для XLAT
4219 / 2680 / 656
Регистрация: 23.09.2014
Сообщений: 9,235
Записей в блоге: 3
18.03.2023, 19:16
Цитата Сообщение от zayats80888 Посмотреть сообщение
нет необходимости писать полноценного клиента для бота.
сразу нужно уточнить полноценность клиента в контексте конкретного турнира этого треда:
клиент это отдельная консольная программа с тем или иным межпрограммным интерфейсом.

или что?
всё свалить в одну программу?

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

Цитата Сообщение от zayats80888 Посмотреть сообщение
нет необходимости писать полноценного клиента для бота.
это экран кода. или пол экрана если без комментов + хедер сокета.

для бота Рандомыч это несколько строчек кода.

поэтому говорить что тестового бота нужно писать это неправильно говорить)
нужно написать коннекторы, опять же - тестовые,
для локалки,
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
18.03.2023, 19:29
Цитата Сообщение от XLAT Посмотреть сообщение
т .е. там выше нужно было добавить:
стенд это минимум три одновременно запущенных консольных приложения.
Да. Бот - это отдельный (локальный, дочерний для сервера) процесс, который думает, что пишет/читает в консоль, а на самом деле с нашим сервером общается.
Цитата Сообщение от XLAT Посмотреть сообщение
это экран кода. или пол экрана если без комментов + хедер сокета.
для бота Рандомыч это несколько строчек кода.
Ок, будет много времени времени, можешь даже на sfml клиента написать, с гуи.
Но сначала нужен тот, что будет судить его игру.
0
Just Do It!
 Аватар для XLAT
4219 / 2680 / 656
Регистрация: 23.09.2014
Сообщений: 9,235
Записей в блоге: 3
18.03.2023, 20:07
zayats80888,
ок.

смотри:
тут уже готовый арбитр:
https://github.com/BDOTimer/cf... /arbiter.h
всех игроков для него собрал класс DLL_manager в объекте DLL_man

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

через абстрактный класс:
https://github.com/BDOTimer/cf... /ai_wrap.h

его можно легко преобразовать в интерфейс, т.е. убрать от туда всё лишнее(длл инфу).

что нужно сделать тя на бусте - реализовать этот интерфейс сокеты или пайпы - арбитру на это пофик.

вот и начальный стенд уже готов.

потом уже арбитра засунем в сервис с уже готовым реализованным и протестченым классом интерфейса - подумаешь ещё один класс.

т.е. есть щас две задачи на стенд:
1. собрать(сделать класс DLL_manager абстрактным) игроков из большого мира(это локально запущенные консольки)
2. и реализовать коннекторы в предложенный(см выше) интерфейс.


пока можно топорно, скелета для архитектуры коннектора вроде пока никто ещё не нарисовал.

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

ага, тут задачка 1 собрать игроков)

Добавлено через 2 минуты
виндос хедер можно задефайнить
он только для работы с длл

Добавлено через 3 минуты
чистый интерфейс без лишнего:
вот эта часть:
C++
1
2
3
4
5
6
7
    virtual const wchar_t* _name                 (                      ) const= 0;
    virtual Plot           _step                 (const Plot&           ) = 0;
    virtual void           _create               (const Cfg&            ) const= 0;
    virtual void           _delete               (                      ) const= 0;
    virtual void           _stfish               (const char FISHKA     )      = 0;
    virtual void           _sendplot             (Plot  plot, char color) const= 0;
    virtual const char*    _get_interface_version(                      ) const= 0;
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
18.03.2023, 20:44
Цитата Сообщение от XLAT Посмотреть сообщение
что нужно сделать тя на бусте - реализовать этот интерфейс сокеты или пайпы - арбитру на это пофик.
Ну как тебе сказать. Вот это:
Цитата Сообщение от XLAT Посмотреть сообщение
virtual Plot           _step                 (const Plot&           ) = 0;
блокирующий вызов. В то время, как асинхронный вызов возвращается сразу (до того, как сообщение будет доставлено и тем более получен ответ).
Такой подход (блокирующий) можно освободить корутинами (просто добавив yield). Я в них не силён(хотя asio их поддерживает).
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
18.03.2023, 20:44

Оцените сборку в днс , как можно улучшить ? Бюджет 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;, но мне...


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

Или воспользуйтесь поиском по форуму:
200
Ответ Создать тему
Новые блоги и статьи
сукцессия 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