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

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

05.03.2023, 19:56. Показов 17433. Ответов 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
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
12.03.2023, 22:39
Студворк — интернет-сервис помощи студентам
XLAT, спасибо, посмотрим, когда будет готов мой первый "инвалид", отпишусь.
Не обещаю, но сегодня поставил цель - написать такого HellCat_v10
1
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
13.03.2023, 16:03
Пришел твой судный день XLAT.
Реализовывал своего простого бота.
Написание заняло немного времени, больше отладка - которая в итоге ни к чему не привела.
Как его в таком виде дебажить - тоже вопрос.
Все должно работать, но ведет себя как шизофреник.

В этом всем есть очень серьезные проблемы, попробую описать :

0 ВАЖНО. Вся измерения и начало отсчета должно быть в единой метрике.
- Что это за x,y для точки ?
- Доступ к элементам поля, тот же вопрос.
Это создает серьезную путаницу. Я почти уверен что ты сам там из-за этого нормально напутал.

Предложение : вывести все в x(горизонталь), y(вертикаль)
Доступ к элементу поля также operator()(int x, int y)

Точка нуждается в, как минимум, толковом конструкторе.

1. Зачем выбраны без знаковые типы (size_t) для многих переменных ?
Что бы сделать жизнь веселее ?

Предложение : если нет четкой аргументации для без знаковых типов.
Использовать знаковые типы.

2. Почему AI имеет открытые поля, фишки, которые устанавливает непонятно кто и где ?
Предложение : в классе AI все инкапсулировать.
Для установки чего то - испльзовать соответсвующие средства интерфейса (его методы).
Которого(интерфейса) пока нет.

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

Вообщем, сплошное разочарование.
Я понимаю, что ты делаешь все это один. Но придется исправлять. )

Нужно вытаскивать своего бота из этой системы/DLL и тестировать в отдельной среде.
Чем я и займусь, наверное.

Добавлено через 18 минут
Мне кажется, что ненужно было ничего делать на стороне ИИ вообще.
Кроме списка експортируемых функций взаимодействия. И описания за что они отвечают.
Хотел как лучше, ага ?
1
Just Do It!
 Аватар для XLAT
4220 / 2682 / 656
Регистрация: 23.09.2014
Сообщений: 9,236
Записей в блоге: 3
13.03.2023, 17:51
Цитата Сообщение от SmallEvil Посмотреть сообщение
0 ВАЖНО
перезалил гит - выловил очень страшную ошипку(страшная тем что плохо вылавилась и крашила игру)
https://github.com/BDOTimer/cf... /tree/main

+1
1. устранен досадный баг: вызов clear() вместо fclear() крашил игру.
2. упорядочена структура двух проектов (теперь они оба зависят от общей директории common)


Цитата Сообщение от SmallEvil Посмотреть сообщение
1. Зачем выбраны без знаковые типы (size_t) для многих переменных ?
Что бы сделать жизнь веселее ?
1. все индексы БЕЗНАКОВЫЕ - потому что так захотел я хз бог, тьюринг, гейтс или джобс или толстяки из комитета с++...
2. всё действие разворачивается в системе координат ИСКЛЮЧИТЕЛЬНО в первом КВАДРАНТЕ. 2,3,4 это фейл.
3. фейл отлавливать в 2 раза проеще фейл > n вместо фейл >= n && фейл < 0
4. пока я ещё не встретил в этой игре где бы мне понадобились инты.
5. да я слышал в школе - "Дети если не знаете что брать, то всегда берите инты ..."
6. сделайте все ваши расчеты в чем угодно, а результат - 2 числа отошлите в безнаковом виде:
C++
1
2
3
4
int res = ...
...
 
return size_t(res);
7. ваще не занимаюсь привидением типов при этом компилятор не задалбливает меня WARNINGами

Цитата Сообщение от SmallEvil Посмотреть сообщение
Почему AI имеет открытые поля, фишки, которые устанавливает непонятно кто и где ?
на своей стороне все данные устанавливаются под контролем ИСКЛЮЧИТЕЛЬНО AI
он может там ходить хоть на голове(дык проблема ОБЩЕЙ БЕЗОПАСНОСТИ!)
Арбитеру важно что полученная точка прошла ЕГО ВАЛИДАЦИЮ, если не прошла, то дисквалификация игрока или на доработку - устранение именно багов.

Цитата Сообщение от SmallEvil Посмотреть сообщение
арбитр просто крешится
возможно этот краш был который я исправил только что?

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

Цитата Сообщение от SmallEvil Посмотреть сообщение
Мне кажется, что ненужно было ничего делать на стороне ИИ вообще.
игроку всего лишь надо решить куда поставить фишку.

1. для этого у него есть поле
2. он может получать фишки от соперника.
3. он может узнать кто ходил первый

всё.

Цитата Сообщение от SmallEvil Посмотреть сообщение
Предложение : вывести все в x(горизонталь), y(вертикаль)
Доступ к элементу поля также operator()(int x, int y)
вот:
C++
1
2
3
4
5
std::string to_arr1(const Field& f)
{   std::string s;
    for(const auto& e : f) s += e;
    return s;
}
фишка и пустая клетка у нас char.

оптимизации можно потом да и правильно, что потом.

Добавлено через 4 минуты
Цитата Сообщение от SmallEvil Посмотреть сообщение
Доступ к элементу поля
доступ стандартный:
field[2][5] = 'X';

там же целый пример реализованным игроком - который вполне без фейлов играет.
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
13.03.2023, 17:55
Не нужно было ничего делать на стороне ИИ.
НИЧЕГО.
С этим невозможно работать.
0
Just Do It!
 Аватар для XLAT
4220 / 2682 / 656
Регистрация: 23.09.2014
Сообщений: 9,236
Записей в блоге: 3
13.03.2023, 18:10
Цитата Сообщение от SmallEvil Посмотреть сообщение
С этим невозможно работать.
напиши по пунктам, что ты бы хотел увидеть.
остальное можно ЛЕГКО убрать с глаз игроков.


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

а игроку оставить ТОЛЬКО ТО ЧТО ЕМУ НУЖНО ЗНАТЬ.

не делать, а именно знать.

делать - пусть сам делает.

это будет файлик, как в начале или даже чище.

Добавлено через 6 минут
вот такой файлик:
C++
1
2
3
4
5
6
7
8
9
10
11
12
///----------------------------------------------------------------------------|
/// ИИ.
///----------------------------------------------------------------------------:
struct AI
{
    Plot step(const Field& field)
    {
        /// TODO ...
 
        return {size_t(-1), 0};
    }
};
изначально да - так было правильно.

только не надо глядеть куда этот файлик втыкается!!!
)))
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
13.03.2023, 18:34
Цитата Сообщение от XLAT Посмотреть сообщение
напиши, что ты хотел увидеть.
Я хотел лишь увидеть необходимый интерфейс.
Им выступают функции dll, к которым должны быть описаны требования.
Все остальное, то в каком виде оно есть, мне не нужно.

Хотелось бы увидеть :
- функцию инициализации/завершения dll
- функцию установки фишки на поле.
- функцию запроса хода от ИИ

Никто ни чего не должен делать ни с полем ни тем более с ИИ.
НИКТО!

А получается что я вот захочу все написать сам (что гарантированно и будет, уже есть).
И что делать ?
Что за странные взаимоотношения у клинтской dll с арбитром ?
Кто вообще устанавливает размер поля и фишки игроков ?
Почему арбитр общается с конфигом про который я ничего не знаю и с полем, а не с моим ИИ ?

Добавлено через 1 минуту
Цитата Сообщение от XLAT Посмотреть сообщение
изначально да - так было правильно.
Нет конечно же.

Добавлено через 2 минуты
Не знаю будет ли лучше после твоих правок.
Проверю, на явно на некоторое время все это отложу.

Добавлено через 8 минут
Цитата Сообщение от SmallEvil Посмотреть сообщение
изначально да - так было правильно.
Нет конечно же.
Вот примерно как предлагал zayats80888.
Правильно если бы арбитр и клиент общались простым понятным протоколом.

- Инициализация Клиента Арбитром (далее К и А). Создание хотя бы того же AI. Я об этом не думал, что нужно инициализировать первым при загрузке dll.
- Установка режима игры. Поле. Фишки на поле.
- Обмен ходами. Информирование о ходе противника. Запрос хода ИИ.
Все.

Добавлено через 1 минуту
Цитата Сообщение от XLAT Посмотреть сообщение
2. всё действие разворачивается в системе координат ИСКЛЮЧИТЕЛЬНО в первом КВАДРАНТЕ. 2,3,4 это фейл.
3. фейл отлавливать в 2 раза проеще фейл > n вместо фейл >= n && фейл < 0
Где это было оговорено ?
Почему 1-я четверть ? Это (0, 0) снизу слева ?
1
Just Do It!
 Аватар для XLAT
4220 / 2682 / 656
Регистрация: 23.09.2014
Сообщений: 9,236
Записей в блоге: 3
13.03.2023, 19:09
Цитата Сообщение от SmallEvil Посмотреть сообщение
Хотелось бы увидеть :
- функцию инициализации/завершения dll
- функцию установки фишки на поле.
- функцию запроса хода от ИИ
ок.

Цитата Сообщение от SmallEvil Посмотреть сообщение
Никто ни чего не должен делать ни с полем ни тем более с ИИ.
НИКТО!
ок
Цитата Сообщение от SmallEvil Посмотреть сообщение
Не знаю будет ли лучше после твоих правок.
Проверю, на явно на некоторое время все это отложу.
всё будет по контракту из первой цитаты.

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

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

Цитата Сообщение от SmallEvil Посмотреть сообщение
нужно инициализировать первым при загрузке dll.
вроде уяснили - загрузка из конфига.
но если конфига нет - то работает дефолт - щас это работает, но можно удалить.
Цитата Сообщение от SmallEvil Посмотреть сообщение
Установка режима игры. Поле. Фишки на поле.
всё та же загрузка из конфига.

Цитата Сообщение от SmallEvil Посмотреть сообщение
Обмен ходами. Информирование о ходе противника. Запрос хода ИИ.
Все.
без этого ваще никак)

Цитата Сообщение от SmallEvil Посмотреть сообщение
Где это было оговорено ?
Почему 1-я четверть ? Это (0, 0) снизу слева ?
возможно будут игроки которые не захотят декартовую систему координат с началом в 0,
а будут требовать полярные координаты или цилиндрические на сфере или цилиндре.
ну тогда на флоатах можно сделать.
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
13.03.2023, 19:18
Цитата Сообщение от SmallEvil Посмотреть сообщение
Почему 1-я четверть ? Это (0, 0) снизу слева ?
По сути это не важно.
Отсчет идет и он понятен.

Порядок важен для тестирования и восприятия человеком.
Если у нас О(0, 0) первой четверти, то почему выводится поле совсем по другому ???
Code
1
2
3
4
5
0 1 2 3 4 
1
2
3
4
Вообщем, жду чистого и независимого dll интерфейса и общением с арбитром.
До этого буду писать ничем не связанный ИИ и тестировать отдельно.
Потом прикручу в dll.

Добавлено через 5 минут
Цитата Сообщение от XLAT Посмотреть сообщение
всё та же загрузка из конфига.
Арбитр должен держать этот Конфиг и КонфигЛоадер.
Это должен зполнять поле через интерфейс (експортируемые функции).
ИИ не умеет читать , он только крестики ставит
1
Just Do It!
 Аватар для XLAT
4220 / 2682 / 656
Регистрация: 23.09.2014
Сообщений: 9,236
Записей в блоге: 3
13.03.2023, 20:17
Цитата Сообщение от SmallEvil Посмотреть сообщение
Арбитр должен держать этот Конфиг и КонфигЛоадер.
Это должен зполнять поле через интерфейс (експортируемые функции).
ИИ не умеет читать , он только крестики ставит
смотри:

ПРАВИЛО №1
Code
1
ИГРОК НЕ ДОЛЖЕН БРАТЬ НА СЕБЯ ОБЯЗАННОСТИ АРБИТРА.
потому что в крестонулячее MMO будет 20 игроков, и зачем каждому писать загрузку конфига и остальную лабуду?

согласен?

что из этого следует.

В обязанности арбитра же входит:
1. Предоставить игроку поле.
2. Сообщить игроку ход соперника.
3. Забрать у игрока ответ.

зачем игроку куда то писать?
Когда игроку приходит сообщение c инфой о ходе соперника,
то Арбитр ГАРАНТИРУЕТ, ЧТО ЭТО ИНФА УЖЕ ДОБАВЛЕНА НА ПОЛЕ.

ИТОГО
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
///----------------------------------------------------------------------------|
/// ИИ.
/// ТУТ ПОЛНЫЙ ИНТЕРФЕЙС ИГРОКА !!!
///----------------------------------------------------------------------------:
struct AI
{
    Field field; ///<--- АКТУАЛЬНАЯ ИНФА ТУТ ГАРАНТИРУЕТСЯ !!!
 
    Plot step(const Plot step_enemy)
    {
        Plot MYSTEP{NOT_INIT};
    
        /// TODO ... тут игрок пишет свой ИИ.
 
        return MYSTEP;
    }
};
Добавлено через 9 минут
можно добавить инфу о начальном ходе.
но ты можешь и самостоятельно проверить step_enemy на START_STEP


START_STEP это константа говорящая что этот шаг никто не делал.

ну, можно название для этой константы придумать по лучше шоп доходчивее было, и не захламлять комментами...
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
13.03.2023, 20:45
Цитата Сообщение от XLAT Посмотреть сообщение
ПРАВИЛО №1
КодВыделить код
ИГРОК НЕ ДОЛЖЕН БРАТЬ НА СЕБЯ ОБЯЗАННОСТИ АРБИТРА.
Да.

Цитата Сообщение от XLAT Посмотреть сообщение
зачем каждому писать загрузку конфига и остальную лабуду?
Зачем, я спрашиваю ?

Цитата Сообщение от XLAT Посмотреть сообщение
В обязанности арбитра же входит:
1. Предоставить игроку поле.
Не нужно ему это.

Цитата Сообщение от XLAT Посмотреть сообщение
то Арбитр ГАРАНТИРУЕТ, ЧТО ЭТО ИНФА УЖЕ ДОБАВЛЕНА НА ПОЛЕ.
Пусть гарантирует что этот ход корректен.
Все. Не нужно ему ничего никуда добавлять. ИИ сам добавит туда куда ему нужно.
Или не добавит. Это его дело.

Цитата Сообщение от XLAT Посмотреть сообщение
ТУТ ПОЛНЫЙ ИНТЕРФЕЙС ИГРОКА !!!
Моя не понимать.
Интерфейс в данном случае, это не AI.
То что ты хочешь навязать, никому не нужно.
Функции dll - вот интерфейс.
Но сами функции так же пишет создатель ИИ.
Нужно только описать к ним требования.

Добавлено через 7 минут
XLAT, если ты будешь идти по этому пути, пытаться создать некий сахарный интерфейс для AI, это будет провал.
Никто не захочет в этом разбираться.
К тому же когда будет Это стабильное окружение тоже большой вопрос.
Все что там написано для Field, у меня абсолютно не используется, кроме доступа к конкретной клетке поля.
0
Just Do It!
 Аватар для XLAT
4220 / 2682 / 656
Регистрация: 23.09.2014
Сообщений: 9,236
Записей в блоге: 3
13.03.2023, 20:50
Цитата Сообщение от SmallEvil Посмотреть сообщение
Не нужно ему это.
да не вопрос.
желающие могут САМИ прочитать конфиг
НА СВОЕ ПОЛЕ.

ПРОСТО НЕ ИСПОЛЬЗУЙ ШТАТНЫЕ КЛАССЫ!!!

в правилах есть только одно: чтобы ответ проходил валидацию.

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

то есть игрок хочет грузить всё что захочет, и это странно)))
очень и очень странно.

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

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

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

хотя, прикладные тоже интересны...
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
13.03.2023, 20:56
Цитата Сообщение от XLAT Посмотреть сообщение
желающие могут САМИ прочитать конфиг
Еще раз, зачем он ?
Кому он нужен и какие функции выполняет ?

Добавлено через 2 минуты
Цитата Сообщение от XLAT Посмотреть сообщение
но речь про то чтобы игрок сосредоточился на самой игре, а не на прикладных задачах.
Представление поля, фишек и их анализ - это и есть сама игра.
Там кот наплакал тех прикладных задача. Зато будут каждому понятны и эффективны, так как свои.
0
Just Do It!
 Аватар для XLAT
4220 / 2682 / 656
Регистрация: 23.09.2014
Сообщений: 9,236
Записей в блоге: 3
13.03.2023, 21:02
Цитата Сообщение от SmallEvil Посмотреть сообщение
Кому он нужен и какие функции выполняет ?
откуда ты знаешь размер поля и длину цепочки???

прибить её гвоздями, как в шахматах?
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
13.03.2023, 21:08
Цитата Сообщение от XLAT Посмотреть сообщение
откуда ты знаешь размер поля и длину цепочки???
Ну вот, мы и подошли к этому.
Что вместо какого то левого Конфига - обычная интерфейсная функция, информирующая об игре.
Поле и цвет фишек игрока.
Потом арбитр может произвольно заполнить поле фишками.
И попросить сделать ход, передав ход противника, если он доступен.
Дальнейшая попытка информирования о поле и/или добавление фишек будут приводить к полному сбросу AI своих состояний и инициализации новых.

В любом случае, я не хочу зависеть ни от типа поля ни от типа фишки ни тем более от каких то конфигов.
Не знаю, может многого хочу.
0
Just Do It!
 Аватар для XLAT
4220 / 2682 / 656
Регистрация: 23.09.2014
Сообщений: 9,236
Записей в блоге: 3
13.03.2023, 21:09
SmallEvil,
послушай там вызываемые извне длл-команды видны невооруженным глазом.
просто сам напиши их реализацию.
делов то.
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
13.03.2023, 21:09
Цитата Сообщение от SmallEvil Посмотреть сообщение
Потом арбитр может произвольно заполнить поле фишками.
Средствами интерфейса (функции DLL) через AI.
0
Just Do It!
 Аватар для XLAT
4220 / 2682 / 656
Регистрация: 23.09.2014
Сообщений: 9,236
Записей в блоге: 3
13.03.2023, 21:10
Цитата Сообщение от SmallEvil Посмотреть сообщение
Что вместо какого то левого Конфига
ты вчера сам захотел иметь поле с начальными ручными установками.
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
13.03.2023, 21:14
Цитата Сообщение от XLAT Посмотреть сообщение
просто сам напиши их реализацию.
Просто низя, там твои конфиги и прочие бандерлоги.

Добавлено через 1 минуту
Цитата Сообщение от XLAT Посмотреть сообщение
ты вчера сам захотел иметь поле с начальными ручными установками.
Да, и это есть хорошо.
Но кто ж думал что это будет так.
Я хотел котенка, маленького такого, пушистого котенка

Добавлено через 43 секунды
Ладно, хватит трепа.
Попробую описать кодом то, о чем говорю.
0
Just Do It!
 Аватар для XLAT
4220 / 2682 / 656
Регистрация: 23.09.2014
Сообщений: 9,236
Записей в блоге: 3
13.03.2023, 21:27
Цитата Сообщение от SmallEvil Посмотреть сообщение
Потом арбитр может произвольно заполнить поле фишками.
у арбитра нет доступа к полю игрока.

можно заполнить, но раздадутся вопли - тут ничаво не понятно - мы сами заполним)))

Добавлено через 12 минут
SmallEvil,
если короче:

мне нужно от тя длл'ошный интерфейс.

а я на него настрою арбитра.

но сначала посмотрю шоп всего там хватало))

да и с точкой входа надо поглядеть ...

на LLVM шоп работало.
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
13.03.2023, 21:35
Пока набросал, но не спеши фарш крутить.
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
#include "ai.dll.h"
 
#define DLLEXP __declspec (dllexport)
 
static AI* ai = nullptr;
///--------------------------------------------------|
/// Внешний интерфейс AI.                            |
///--------------------------------------------------:
extern "C"
{
    DLLEXP void init(){
       ai   = new AI();
    }
    DLLEXP void release(){
        delete ai;
    }
    DLLEXP void new_game(int width, int height, int chain, bool color){
        
    }
    DLLEXP void set_point(int x, int y, bool color){
        
    }
    // op_x, op_y - ход оппонента если он есть (доступен)
    // в теории можно выбросить, но наверное лучше пока оставить
    // {-1,-1} в случае отсутствия
    DLLEXP void step(int* x, int* y, int op_x, int op_y){
        // что в функции уже никого не касается,
        // кроме как создателя DLL
        
        // проверки не нужны мы безоговорочно верим Арбитру XD
        // но никто не запрещает их сделать
        auto p = ai->step({op_x, op_y});
        *x = p.x;
        *y = p.y;
    }
 
    DLLEXP const wchar_t* _name(){
        return ai->name();
    }
}
Добавлено через 2 минуты
Цитата Сообщение от XLAT Посмотреть сообщение
да и с точкой входа надо поглядеть ...
Наверное нужно. И там же будет создаваться AI и уничтожаться.
И отпадет надобность в init и release.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
13.03.2023, 21:35

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


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

Или воспользуйтесь поиском по форуму:
140
Ответ Создать тему
Новые блоги и статьи
Доктрина интенционального знания - Доктрина для портала "Срез".
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
Пр# Сопровождение научной статьи ИИ-ассистентом: подготовка публикации и калибровка агентно-ориентированной модели сукцессии микоризных систем **Полевые заметки о двухнедельной совместной работе**. . .
Теория всего 12. ВГК на планете в стратегической игре "терра"
anaschu 21.07.2026
### Главные семантические изменения и дешифровка новой физики 1. **`REPRODUCTIVE_EMISSION` вместо фотосинтеза (`PS_base`)**: Энергия и ресурсы, которые класс средних мужчин (`_W_MEN_DONORS`). . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru