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

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

05.03.2023, 19:56. Показов 17436. Ответов 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
4220 / 2682 / 656
Регистрация: 23.09.2014
Сообщений: 9,236
Записей в блоге: 3
07.03.2023, 20:07
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от SmallEvil Посмотреть сообщение
Тебя никто не просил, ни улучшать код ТС, ни писать ии, ни внедрять иии.
я ставлю смайлы под свой сарказм раз через два.

а сделать простейший ии это полчаса делов.

а если кто-то сделает ещё, то можно бои организовывать: чей ии умнее.
0
 Аватар для lemegeton
4903 / 2696 / 921
Регистрация: 29.11.2010
Сообщений: 5,783
07.03.2023, 20:15
Цитата Сообщение от XLAT Посмотреть сообщение
так это, чо, ии сделать желающих нету что ли, снова я?
Я в "эти ваши" перцептроны не умею.
0
Just Do It!
 Аватар для XLAT
4220 / 2682 / 656
Регистрация: 23.09.2014
Сообщений: 9,236
Записей в блоге: 3
07.03.2023, 20:19
Цитата Сообщение от lemegeton Посмотреть сообщение
Я в "эти ваши" перцептроны не умею.
в традиционном геймдеве ии на алгоритмах,
но щас, я хз, может что-то и поменялось.

ваще, непроигрывающий ни разу ии в геймдеве категорически не нужен!
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
07.03.2023, 20:23
Цитата Сообщение от XLAT Посмотреть сообщение
а если кто-то сделает ещё, то можно бои организовывать: чей ии умнее.
А вот это уже интересно.
Утверждай интерфейс игры.
И можешь меня записывать.
1
Just Do It!
 Аватар для XLAT
4220 / 2682 / 656
Регистрация: 23.09.2014
Сообщений: 9,236
Записей в блоге: 3
07.03.2023, 20:28
Цитата Сообщение от SmallEvil Посмотреть сообщение
Утверждай интерфейс игры.
нее, де-композитор задач это другая должность - должность аш сеньора)

писать контракты(design by contract) это самый пик прогерства!)
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6315 / 3039 / 1055
Регистрация: 01.06.2021
Сообщений: 11,587
07.03.2023, 20:50
XLAT, GNU Go играет очень сильно, а ее код открыт...
Я это к тому, что можно одолжить (украсть) код.
Разработчиков коммерческих шахматных движков Houdini и Komodo не раз ловили на том, как они крали код Stockfish.
Что мешает использовать код GNU Go?
0
Just Do It!
 Аватар для XLAT
4220 / 2682 / 656
Регистрация: 23.09.2014
Сообщений: 9,236
Записей в блоге: 3
07.03.2023, 21:04
Цитата Сообщение от SmallEvil Посмотреть сообщение
Утверждай интерфейс игры.
собсно, шо требуется:
это написать метод Plot step(const Field& field) класса AI
C++
210
211
212
213
214
215
216
217
218
219
220
221
///----------------------------------------------------------------------------|
/// ИИ.
///----------------------------------------------------------------------------:
struct AI
{
    Plot step(const Field& field)
    {
        /// TODO ...
 
        return {size_t(-1), 0};
    }
};
AI::step(...) Возвращает координату поля для хода.

в самом классе Field
добавил метод:
C++
1
2
3
    bool verification(const Plot& p)
    {   return p.x < W && p.y < H && m[p.y][p.x] == EMPTY;
    }
чтобы эта координата удовлетворяла этому(true == verifacation(Plot)) условию.

далее этот класс оформить в виде длл.

все длл(коих может быть много) забрасываются в директорию с арбитром или проигрывателем игры.

арбитр автоматом будет подхватывать эти длл'ки.

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

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

а если прикручивать юнити для красот, то месяц уйдет)))

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

вообщем, ждём от тебя самого крутого игрока в расширенные крестонолики)
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6315 / 3039 / 1055
Регистрация: 01.06.2021
Сообщений: 11,587
07.03.2023, 21:14
XLAT, для этого турнира нет смысла смотреть на GNU Go, т.к. лень копаться в чужом коде, но вот будет интересно смотреть на все ваши коды)
Наверное, вам нужно ещё правила обсудить, а то вдруг кто-то не так сделает.
Арбитр в консоли норм, полагаю.
1
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
07.03.2023, 21:15
Цитата Сообщение от XLAT Посмотреть сообщение
расширенные крестонолики
Им есть красивое название - Рэндзю.
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
07.03.2023, 21:23
Это был обычный такой мистер ляп.
Не надо нам тут вОльги.
А то уроки по вышке начнутся, не-не-не
0
Just Do It!
 Аватар для XLAT
4220 / 2682 / 656
Регистрация: 23.09.2014
Сообщений: 9,236
Записей в блоге: 3
07.03.2023, 21:47
Цитата Сообщение от XLAT Посмотреть сообщение
далее этот класс оформить в виде длл.
типа так:

на экспорт:
C++
1
2
3
4
5
6
7
extern "C"
{
    DLLEXP void         _create(                  ){        ai = new AI()  ; }
    DLLEXP Plot           _step(const Field& field){ return ai->step(field); }
    DLLEXP const wchar_t* _name(                  ){ return name           ; }
    DLLEXP void         _delete(                  ){ delete ai             ; }
}
код целиком:
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
///
/// C++17
/// Исходник(DLL) в UTF-8
///----------------------------------------------------------------------------|
/// AI для игры в крестонолики. (это dll проект.)
///----------------------------------------------------------------------------:
#include <fstream>
#include <vector>
#include <string>
#include <ctime>
#include <cstdlib>
 
#pragma pack(push, 1)
 
///--------------------------------------------------|
/// ...                                              |
///--------------------------------------------------:
const wchar_t* name = L"Автор Randович";
 
///----------|
/// Конфиг.  |
///----------:
namespace  cfg
{
    ///-----------------------------|
    /// Количество фишек для победы.|
    ///-----------------------------:
    const size_t FWIN   =  5;
    const size_t WIDTH  = 10; /// Размер поля по горизонтали.
    const size_t HEIGHT =  5; /// Размер поля по вертикали.
    ///-----------------------------.
 
} // End namespace cfg
 
struct Plot
{   size_t x, y;
};
 
///----------------------------------------------------------------------------|
/// Поле.
///----------------------------------------------------------------------------:
struct  Field
{       Field() : m(nullptr)
        {   create();
        }
 
    const char EMPTY = '.';
 
    size_t W = 0,
           H = 0;
 
    ///---------------------------|
    /// Проверка фишки на выигрыш.|
    ///---------------------------:
    bool is_win(const char FISHKA) const
    {
        std::string fishka(cfg::FWIN, FISHKA);
 
        for(const auto& str : get_all_str())
        {   if(str.find(fishka) != str.npos) return true;
        }
        return false;
    }
 
    ///---------------------------|
    /// Есть ли ходы?             |
    ///---------------------------:
    bool is_step() const
    {   for    (size_t h = 0; h < H; ++h)
        {   for(size_t w = 0; w < W; ++w)
            {   if(m[h][w] == EMPTY) return true;
            }
        }
        return false;
    }
 
    char* operator[](const size_t i)
    {   return  m[i];
    }
 
    void clear()
    {   for    (size_t h = 0; h < H; ++h)
        {   for(size_t w = 0; w < W; ++w)
            {   m[h][w] = EMPTY;
            }
        }
    }
 
    void fill_for_test()
    {   char cnt = 'A';
        for    (size_t h = 0; h < H; ++h)
        {   for(size_t w = 0; w < W; ++w)
            {   m[h][w] = cnt++;
            }
        }
    }
 
    bool verification(const Plot& p) const
    {   return p.x < W && p.y < H && m[p.y][p.x] == EMPTY;
    }
 
private:
    char** m;
 
    void create()
    {   if(nullptr !=  m)  return;
 
        m = new char* [H];
        for (size_t i = 0; i < H; i++)
        {   m[i] = new char[W];
        }
    }
 
    #define TESTMODE false
    ///---------------------------|
    /// Разворачиваем строки!     |
    ///---------------------------:
    std::vector<std::string> get_all_str() const
    {
        std::vector<std::string> r;
 
        for    (size_t h = 0; h < H; ++h)
        {   r.push_back(std::string());
            for(size_t w = 0; w < W;  ++w)
            {   r.back().push_back(m[h][w]);
            }
        }
 
        for    (size_t w = 0; w < W;  ++w)
        {   r.push_back(std::string());
            for(size_t h = 0; h < H; ++h)
            {   r.back().push_back(m[h][w]);
            }
        }
 
        ///---------------------------|
        /// Повернуть на -45 градусов.|
        ///---------------------------:
        for    (size_t h = 0; h < H; ++h)
        {   std::string s;
            for(size_t w = 0, y = h; w < W && y < H; ++w, ++y)
            {   s.push_back(m[y][w]);
            }
            if(s.size() >= cfg::FWIN || TESTMODE)
            {   r.push_back(s);
            }
        }
 
        for    (size_t w = 1; w < W; ++w)
        {   std::string s;
            for(size_t x = w, h = 0; x < W && h < H; ++x, ++h)
            {   s.push_back(m[h][x]);
            }
            if(s.size() >= cfg::FWIN || TESTMODE)
            {   r.push_back(s);
            }
        }
 
        ///---------------------------|
        /// Повернуть на +45 градусов.|
        ///---------------------------:
        for    (size_t h = 0; h < H; ++h)
        {   std::string s;
            for(size_t w = W - 1, y = h; w < W && y < H; --w, ++y)
            {   s.push_back(m[y][w]);
            }
            if(s.size() >= cfg::FWIN || TESTMODE)
            {   r.push_back(s);
            }
        }
 
        for    (size_t w = W - 2; w < W; --w)
        {   std::string s;
            for(size_t x = w, h = 0; x < W && h < H; --x, ++h)
            {   s.push_back(m[h][x]);
            }
            if(s.size() >= cfg::FWIN || TESTMODE)
            {   r.push_back(s);
            }
        }
 
        return r;
    }
    #undef TESTMODE
};
 
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
{
    Plot step(const Field& field)
    {
        /// TODO ...
 
        while(true)
        {
            Plot p;
                 p.x = rrand(0, field.W);
                 p.y = rrand(0, field.H);
 
            if(field.verification(p)) return p;
        }
 
        return {size_t(-1), 0};
    }
};
 
#define DLLEXP __declspec (dllexport)
 
static AI* ai = nullptr;
///--------------------------------------------------|
/// Интерфейс AI.                                    |
///--------------------------------------------------:
extern "C"
{
    DLLEXP void         _create(                  ){        ai = new AI()  ; }
    DLLEXP Plot           _step(const Field& field){ return ai->step(field); }
    DLLEXP const wchar_t* _name(                  ){ return name           ; }
    DLLEXP void         _delete(                  ){ delete ai             ; }
}
 
#undef DLLEXP
это компилится(msys2), но нужно тестить,
а для этого нужно дописать арбитра.

ну есно поправить чуть, например, передачу конфига, конкретно FWIN, шоп рассинхрона не было.
0
Just Do It!
 Аватар для XLAT
4220 / 2682 / 656
Регистрация: 23.09.2014
Сообщений: 9,236
Записей в блоге: 3
07.03.2023, 22:42
на стороне арбитра:
(черновик)
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
/// main.exe
///----------------------------------------------------------------------------|
/// ИИ.
///----------------------------------------------------------------------------:
#include <windows.h>
 
typedef void          (__stdcall * _create_t)(                  );
typedef Plot          (__stdcall * _step_t  )(const Field& field);
typedef const wchar_t*(__stdcall * _name_t  )(                  );
typedef void          (__stdcall * _delete_t)(                  );
 
struct AI
{   Plot step(const Field& field) const
    {   /// TODO ...
 
        return {size_t(-1), 0};
    }
 
    _create_t _create;
    _step_t   _step  ;
    _name_t   _name  ;
    _delete_t _delete;
 
    int load_dll()
    {   HINSTANCE hGetProcIDDLL = LoadLibrary("0.dll");
 
        if (!hGetProcIDDLL)
        {   std::cout << "could not load the dynamic library" << std::endl;
            return EXIT_FAILURE;
        }
 
        _name = (_name_t)GetProcAddress(hGetProcIDDLL, "_name");
        if (!_name)
        {   std::cout << "could not locate the function" << std::endl;
            return EXIT_FAILURE;
        }
 
        std::wcout << L"_name() returned " << _name() << std::endl;
 
        return EXIT_SUCCESS;
    }
 
public:
    static void testclass();
};
/// Тест:
///------------------------------|
/// ...
///------------------------------:
void AI::testclass()
{   std::wcout << L"TEST AI:\n";
 
    AI  ai;
        ai.load_dll();
 
    std::wcout << "TEST FINSHED!\n";
    std::cin.get();
}

красава, русский яз нормально загребла из 0.dll

но как оно протестится с передачей Field даже боюсь начинать тестить)
0
Just Do It!
 Аватар для XLAT
4220 / 2682 / 656
Регистрация: 23.09.2014
Сообщений: 9,236
Записей в блоге: 3
08.03.2023, 00:03
Цитата Сообщение от XLAT Посмотреть сообщение
Field даже боюсь начинать тестить)
да, с длл всё ок:
проверил:
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
///----------------------------------------------------------------------------|
/// ИИ.
///----------------------------------------------------------------------------:
#include <windows.h>
 
typedef const wchar_t*(__stdcall * _name_t  )(                  );
typedef Plot          (__stdcall * _step_t  )(const Field& field);
typedef void          (__stdcall * _create_t)(                  );
typedef void          (__stdcall * _delete_t)(                  );
 
struct  AI
{       AI()
        {   if(EXIT_SUCCESS == load_dll()) std::wcout << L"DLL load GOOD!\n";
        }
 
    Plot step(const Field& field) const
    {   /// TODO ...
 
        return {size_t(-1), 0};
    }
 
    _name_t   _name  ;
    _step_t   _step  ;
    _create_t _create;
    _delete_t _delete;
 
    int load_dll()
    {   HINSTANCE hGetProcIDDLL = LoadLibrary("0.dll");
 
        if (!hGetProcIDDLL)
        {   std::cout << "could not load the dynamic library" << std::endl;
            return EXIT_FAILURE;
        }
 
        _name = (_name_t)GetProcAddress(hGetProcIDDLL, "_name");
        if (!_name)
        {   std::cout << "ERROR: dll load _name" << std::endl;
            return EXIT_FAILURE;
        }
 
        std::wcout << L"_name() returned: " << _name() << std::endl;
 
        _step = (_step_t)GetProcAddress(hGetProcIDDLL, "_step");
        if (!_step)
        {   std::cout << "ERROR: dll load _step" << std::endl;
            return EXIT_FAILURE;
        }
 
        _create = (_create_t)GetProcAddress(hGetProcIDDLL, "_create");
        if (!_create)
        {   std::cout << "ERROR: dll load _create" << std::endl;
            return EXIT_FAILURE;
        }
 
        _create();
 
        _delete = (_delete_t)GetProcAddress(hGetProcIDDLL, "_delete");
        if (!_delete)
        {   std::cout << "ERROR: dll load _delete" << std::endl;
            return EXIT_FAILURE;
        }
 
        return EXIT_SUCCESS;
    }
 
public:
    static void testclass();
};
/// Тест:
///------------------------------|
/// ...
///------------------------------:
void AI::testclass()
{   std::wcout << L"TEST AI:\n";
 
    Field f;
    AI   ai;
 
        std::wcout << ai._step(f) << '\n';
        std::wcout << ai._step(f) << '\n';
        std::wcout << ai._step(f) << '\n';
        std::wcout << ai._step(f) << '\n';
        std::wcout << ai._step(f) << std::endl;
 
    std::wcout << "TEST FINISHED!\n";
    std::cin.get();
}
Название: !forum.jpg
Просмотров: 89

Размер: 19.6 Кб

можно теперь городить менеджер длл'ок игроков.
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
08.03.2023, 00:44
XLAT, Что будешь делать с ботами которые долго думают или вообще "виснут" ?
0
Just Do It!
 Аватар для XLAT
4220 / 2682 / 656
Регистрация: 23.09.2014
Сообщений: 9,236
Записей в блоге: 3
08.03.2023, 01:16
Цитата Сообщение от SmallEvil Посмотреть сообщение
Что будешь делать с ботами которые долго думают или вообще "виснут" ?
эту тему я пытался поднимать в обсуждениях с Доктором тут:
Остановка выполнения программы на C++

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

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

хотя варианты надо посмотреть ещё...
https://www.cyberforum.ru/post14005461.html

но, если проблему рассмотреть шире,
а именно, НЕДОПУЩЕНИЕ диверсии зловредным кодом,
неважно читерство или реально возможная диверсия,

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

да и сервера(реального железного) у нас нет или пока нет.

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

ну, как выход, можно запускать на виртуальной машине.
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
08.03.2023, 01:39
XLAT, я почему поднял этот вопрос.
Что бы установить ограничение по времени на ход.
Ну и однозначно определять бота "тугодума - висяка" и дисквалифицировать его, остальное, я пока даже и не рассматривал, хм

Добавлено через 4 минуты
p.a. У меня такое ощущение что будем "бодаться" двое.
Я отдыхать.
1
Just Do It!
 Аватар для XLAT
4220 / 2682 / 656
Регистрация: 23.09.2014
Сообщений: 9,236
Записей в блоге: 3
08.03.2023, 02:14
Цитата Сообщение от SmallEvil Посмотреть сообщение
p.a. У меня такое ощущение что будем "бодаться" двое
хм, нужно смотреть дальше,
это может сойти, как шаблон для чего угодно такого подобного))
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
08.03.2023, 12:25
Предлагаю новый интерфейс для обмена ходами.
C++
1
Plot step(Plot last_step);
last_step - последних ход. В первый ход фишка уже установлена, она и будет последним ходом для начинающего партию.
Так защитится само поле игры от вмешательства.
Каждый бот будет представлять поле как ему нравится\необходимо.
Потому как каждый раз искать ход противника по всему полю, ну такооооее.

Цитата Сообщение от XLAT Посмотреть сообщение
да и сервера(реального железного) у нас нет или пока нет.
Есть, стоит системник, почти рабочий, с винтом даже (просто лень переставить его в текущий).
Но все никак не дойдут руки к нему.
1
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6315 / 3039 / 1055
Регистрация: 01.06.2021
Сообщений: 11,587
08.03.2023, 12:39
SmallEvil, да, логика в этом есть. Тем не менее, лучше всё-таки каждый раз передавать все ходы, как это реализовано в шахматных движках по протоколу UCI. Так можно передавать все ходы как просто список или в виде FEN. Преимущество в том, что сегодня ты играешь с начальной позиции, а завтра может захочешь анализировать игру на определенной позиции.
1
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
08.03.2023, 12:45
Royal_X, да, и в этом есть смысл.
Но тогда еще и последний ход в придачу.

Добавлено через 37 секунд
Цитата Сообщение от SmallEvil Посмотреть сообщение
Но тогда еще и последний ход в придачу.
Я правда не знаю зачем он мне, но ачень хочотса )

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

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


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Очистка реквизитов и табличных частей документа при копировании
Maks 26.07.2026
Алгоритм из решения ниже разработан на примере нетипового документа "ЗаявкаНаРаботу", разработанного в КА2. Задача: Заменить алгоритм запрета копирования документов для сотрудников с ролью "Стажер",. . .
Доктрина интенционального знания - Доктрина для портала "Срез".
Hrethgir 25.07.2026
Может найдётся кто захочет оценить доктрину. . . Написания правил участия для меня роскошь, требующая лимита времени, поэтому все сообщения не прошедшие модерацию будут видны только участникам портала,. . .
сукцессия 44. Решил подать на припринт в межународные сервисы препринтов. Но нужно одобрение от ученых
anaschu 25.07.2026
Английский вариант. Пока кто то не одобрит мою личность, мне не получиться это опубликовать на препринте. Но заявку на публикацию статьи я сегодня подам.
сукцессия 43. Вторая научная статья за месяц- прайминг и гатгил
anaschu 25.07.2026
две стороны одной монеты
Более приземисто - Эстафету хвоста в .cdl (деревья эстафеты в сад).
Hrethgir 24.07.2026
В будущем, после написания блока инверсии обхода дерева (эстафеты хвоста), я планирую вернуться к нашему прошлому разговору о том, обладают ли знания целеполаганием. Тогда я пришел к выводу, что. . .
Вот представьте что вам дали бессмертие.
kumehtar 24.07.2026
Вот представьте что вам дали бессмертие, ничего более не меняя. Вообще ничего, только бессмертие в нынешнем виде. Рады были бы? Что бы вы тут делали всё это время? Никакой пенсии. Никакого нового. . .
сукцессия 41
anaschu 24.07.2026
Численная верификация бифуркации в агентной модели лесной сукцессии: от одного параметра к ансамблю Автор: пользователь @Shumilov_AS | Раздел: Прикладная математика / Численные методы Кратко. . .
сукцессия 40. Ансамблевая кластерная параметризаци, часть 1.
anaschu 24.07.2026
Пр# Сопровождение научной статьи ИИ-ассистентом: подготовка публикации и калибровка агентно-ориентированной модели сукцессии микоризных систем **Полевые заметки о двухнедельной совместной работе**. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru