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

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

05.03.2023, 19:56. Показов 17254. Ответов 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
 Аватар для Kuzia domovenok
4268 / 3327 / 926
Регистрация: 25.03.2012
Сообщений: 12,542
Записей в блоге: 1
15.03.2023, 14:24
Студворк — интернет-сервис помощи студентам
alexu_007, а почему название "виджет"? Что, qt использовал или какой-то ещё фреймворк с виджетами?
0
737 / 704 / 110
Регистрация: 29.05.2015
Сообщений: 4,316
15.03.2023, 16:52
Qt. Widget - это имя класса формы, которое фреймворк даёт по умолчанию. При создании нового проекта его можно переименовать. А вот этот заголовок вверху (windowTitle) можно просто поменять, не трогая никаких классов.

Добавлено через 18 минут
Цитата Сообщение от Royal_X Посмотреть сообщение
о полноценном и приятном на глаз гуе с кучей настроек, с возможностью подключать и отключать движки, проводить турнир движков и т.д.
Я уже писал, все данные программы - это массив NxN. Пжалста, можете подключать любые движки и проводить любые турниры. Движки по своему алгоритму запишут очередную циферку в массив, хоть через файл. А GUI в соответствии с массивом перерисует картинку. Какие тут нужны настройки?
0
Just Do It!
 Аватар для XLAT
4219 / 2680 / 656
Регистрация: 23.09.2014
Сообщений: 9,235
Записей в блоге: 3
15.03.2023, 20:54
Цитата Сообщение от SmallEvil Посмотреть сообщение
и кстати, наследоваться от std::vector , это тоже бог велел ?
если бы проблема была в этом то я бы уже закончил эту прогу.

отлаживаю тут под студию - много чудес разных,
типа таких:
C++
1
2
3
4
5
6
7
8
static AI* ai = nullptr;
 
extern "C"
{
    DLLEXP void init(){
       ai   = new AI(); //<--- ТАК НЕ РАБОТАЕТ!
    }
...
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6315 / 3037 / 1054
Регистрация: 01.06.2021
Сообщений: 11,569
15.03.2023, 21:57
XLAT, так а что не получается? Не получается написать движок или арбитр, или что-то другое?
0
Just Do It!
 Аватар для XLAT
4219 / 2680 / 656
Регистрация: 23.09.2014
Сообщений: 9,235
Записей в блоге: 3
16.03.2023, 11:04
Цитата Сообщение от Royal_X Посмотреть сообщение
так а что не получается?
всё получается.
всё будет хорошо.

Не по теме:

мы все умрём, но не сразу...



Royal_X,
это тема шикарная, тут есть для меня и пайпы и сокеты,
в целом - "распределенная обработка данных".

что касается самого гуя то я тоже хвастанусь:
https://www.cyberforum.ru/post16449797.html



Добавлено через 5 минут
Цитата Сообщение от Royal_X Посмотреть сообщение
так а что не получается?
Цитата Сообщение от XLAT Посмотреть сообщение
всё получается.
вот в студии тест игрока нормально:
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
TEST Player:
 
Найдены DLL: 2
  0.dll
  1.dll
 
Грузим новый ИИ...
DLL: Конструктор AI ...
field.H = 5
field.W = 10
DDL PLAYERяяя: ooo-АфторРэнд-zzz
 
aibots.size() = 1
Грузим новый ИИ...
DLL: Конструктор AI ...
field.H = 5
field.W = 10
DDL PLAYERяяя: ooo-АфторРэнд-zzz
 
aibots.size() = 2
УЧАСТНИКИ ЗАБЕГА:
    1.  ooo-АфторРэнд-zzz [        0.dll ]
    2.  ooo-АфторРэнд-zzz [        1.dll ]
 
Ожидается всего спарингов: 2
AI принял step: { 1, 2 }
AI посылает step: { 9, 4 }
respond = { 9, 4 }
AI принял step: { 1, 2 }
AI посылает step: { 3, 4 }
respond = { 3, 4 }
 
TEST FINISHED!
я думаю что причина проблем в этом:
Цитата Сообщение от Royal_X Посмотреть сообщение
за очень короткое время.
не надо спешить.

гит я не обновляю, потому что щас провожу тесты и они про самый первый коммит.
я хочу чтобы прога работала под любым C++17 компилятором и в любой ИДЕ.
0
Модератор
Эксперт CЭксперт С++
 Аватар для sourcerer
5288 / 2376 / 342
Регистрация: 20.02.2013
Сообщений: 5,773
Записей в блоге: 20
16.03.2023, 11:43
Цитата Сообщение от XLAT Посмотреть сообщение
я хочу чтобы прога работала под любым C++17 компилятором и в любой ИДЕ
Conan + CMake, не? Вроде та самая связка, которая может обеспечить кучу разных комбинаций компиляторов, IDE, целевых платформ и т.п.
0
Just Do It!
 Аватар для XLAT
4219 / 2680 / 656
Регистрация: 23.09.2014
Сообщений: 9,235
Записей в блоге: 3
16.03.2023, 12:08
Цитата Сообщение от sourcerer Посмотреть сообщение
Conan + CMake, не?
речь я чуть про другое:
саму логику игры(её низкоуровневую часть) LLVM и VC++ фейлят.

Не по теме:

Цитата Сообщение от sourcerer Посмотреть сообщение
Conan + CMake, не?
на этот этапе все исходники это ОДИН cpp + хедеры и только СТАНДАРТНАЯ библиотека.

sourcerer, ну, я не спец по кроссплатформенной разработке, поэтому это на потом.
и щас включать в проект разные симейки без конкретного тестирования не вижу профита,
ибо скорее всего без должного тестирования они работать просто по дефолту ВЕЗДЕ не будут.
для каждого случая там нужна будет своя ветка.

0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6315 / 3037 / 1054
Регистрация: 01.06.2021
Сообщений: 11,569
16.03.2023, 20:31
Вот новая версия моей проги. Усовершенствовал немного интерфейс, гуй теперь не зависает во время работы движка.
Пока движок в разработке и играет не очень глубоко на больших досках.
Движку поставил ограничения на глубину:
Для 3х3 стоит ограничение 9 полуходов (по сути, это полная глубина для такого размера доски, т.е. больше и не надо)
4х4 - 10 полуходов
5х5 - 8 полуходов
6х6, 7х7 и 8х8 - 6 полуходов
9х9 и 10х10 - 5 полуходов
Для остальных размеров - 4 полухода.
Если получится оптимизировать лучше, то увеличу глубину. Ещё в планах научить движок играть на время с итеративным увеличением глубины.
Вложения
Тип файла: zip game.zip (107.3 Кб, 14 просмотров)
2
16.03.2023, 21:44

Не по теме:

Цитата Сообщение от XLAT Посмотреть сообщение
ну, я не спец по кроссплатформенной разработке, поэтому это на потом.
и щас включать в проект разные симейки без конкретного тестирования не вижу профита,
ибо скорее всего без должного тестирования они работать просто по дефолту ВЕЗДЕ не будут.
для каждого случая там нужна будет своя ветка.
Количество веток можно свести к минимуму, если использовать кроссплатформенные библиотеки.
Кроссплатформенные система сборки и система контроля версий повышает шанс привлечь людей к разработке.
Я, например, мог бы помочь с бэкэндом(серверной частью), но мне неохота ставить винду(я на линуксе) и
кодблокс(ненравица он мне).

1
Just Do It!
 Аватар для XLAT
4219 / 2680 / 656
Регистрация: 23.09.2014
Сообщений: 9,235
Записей в блоге: 3
16.03.2023, 21:46
Цитата Сообщение от Royal_X Посмотреть сообщение
Вот новая версия моей проги.
а я поборол вот эту гидру:

противоядие лежало здесь:
/Gd, /Gr, /Gv, /Gz (соглашение о вызовах)
0
Just Do It!
 Аватар для XLAT
4219 / 2680 / 656
Регистрация: 23.09.2014
Сообщений: 9,235
Записей в блоге: 3
16.03.2023, 21:52
Цитата Сообщение от zayats80888 Посмотреть сообщение
Я, например, мог бы помочь с бэкэндом(серверной частью)
я тя поймал на слове.

я щас сам подбираю себе образ святой по размеру(способностей и потребностей):
отсюда:
https://www.osboxes.org/virtualbox-images/
и отсюда:
https://www.linuxvmimages.com/
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
16.03.2023, 21:56
Цитата Сообщение от XLAT Посмотреть сообщение
противоядие лежало здесь:
/Gd, /Gr, /Gv, /Gz (соглашение о вызовах)

У меня запустилось.

Royal_X, а чего он так долго думает ?

Добавлено через 2 минуты
XLAT, зачем такой запал ?
Я не вижу какой - то перспективы в этом проекте.
И сам не прикасался после удачной разработки своего каркаса.
0
16.03.2023, 22:10

Не по теме:

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

0
Just Do It!
 Аватар для XLAT
4219 / 2680 / 656
Регистрация: 23.09.2014
Сообщений: 9,235
Записей в блоге: 3
16.03.2023, 22:36
Цитата Сообщение от SmallEvil Посмотреть сообщение
Я не вижу какой - то перспективы в этом проекте.
ну, а я потерял интерес в ответах ленивым студентам)

выше я уже написал:
Цитата Сообщение от XLAT Посмотреть сообщение
Вопрос: ПОЧЕМУ ВЫ НЕ МОЖЕТЕ СДЕЛАТЬ ИНТЕРЕСНЫЙ ПРОЕКТ?
Ответ: ПОТОМУ ЧТО ВЫ НЕ МОЖЕТЕ СДЕЛАТЬ И НЕИНТЕРЕСНЫЙ ПРОЕКТ!
Code
1
2
3
Если вы собирается сделать убицу киберпОнка,
то для начала сделайте хотя бы крестики-нолики!
                                      (Лао-Цзы)

Не по теме:

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

продолжу только после завтра.

но у мя есть и другие задачи а также домашние работы.

1
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
16.03.2023, 23:01
Цитата Сообщение от zayats80888 Посмотреть сообщение
этот проект будет интересен
XLAT, zayats80888,
Да он и мне интересен, но только как пробник.
То есть, делаем минимально рабочий проект, а не : "любой ценой".

Цитата Сообщение от XLAT Посмотреть сообщение
но у мя есть и другие задач
Ну а как же, как и у всех.

XLAT, кстати, ты уже пробовал канали/пайпы/трубы ?
Должно быть куда проще во многих аспектах.
И легче контролировать дочерние процессы.

Добавлено через 1 минуту
Цитата Сообщение от XLAT Посмотреть сообщение
завтра я на работе - вот и весь запал)
Можешь мне дать какие-то задачи по самому арбитру.
Все больше опыта получу чем от "крестики-нолики" )
0
16.03.2023, 23:04

Не по теме:

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

0
Just Do It!
 Аватар для XLAT
4219 / 2680 / 656
Регистрация: 23.09.2014
Сообщений: 9,235
Записей в блоге: 3
17.03.2023, 00:27
Цитата Сообщение от SmallEvil Посмотреть сообщение
кстати, ты уже пробовал канали/пайпы/трубы ?
некогда было, котиков на ютубе смотрел и интерфейс интерфейсов лепил:
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
#ifndef AI_WRAP_H
#define AI_WRAP_H
///----------------------------------------------------------------------------|
/// "ai_wrap.h"
///----------------------------------------------------------------------------|
typedef const char*(__stdcall * get_interface_version_t)();
 
 
struct  AI_wrap
{       AI_wrap(){}
 
    virtual ~AI_wrap()
    {
        if(NULL  != hGetProcIDDLL)
        {   auto FreeResult  = FreeLibrary(hGetProcIDDLL);
            if ( FreeResult != 0)
            {    std::cout  << "ERROR: FreeLibrary ...\n";
            }
        }
    }
 
    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;
 
    virtual const char get_FISHKA  ()     const = 0;
    virtual const std::wstring& who()     const = 0;
    virtual void  set_FISHKA(const char fishka) = 0;
 
 
    HINSTANCE hGetProcIDDLL = NULL ;
    bool      error         = false;
    Statistics                stat ;
 
 
    static HINSTANCE get_hinst(const char* _dllname)
    {
        HINSTANCE _hGetProcIDDLL = LoadLibrary( _dllname);
        if (!_hGetProcIDDLL)
        {   std::cout << "ERROR: Could not DLL ..." << std::endl;
            throw EXIT_FAILURE;
        }
        return _hGetProcIDDLL;
    }
 
    static const char* get_version(HINSTANCE hinst)
    {   get_interface_version_t foo =
       (get_interface_version_t)GetProcAddress(hinst, "get_interface_version");
 
        if (!foo)
        {   std::cout << "ERROR: dll load no version ,,," << std::endl;
            throw EXIT_FAILURE;
        }
        return foo();
    }
};
#endif // AI_WRAP_H
куда можно теперь вот воткнуть твой личный интерфейс:
https://github.com/BDOTimer/cf... mallEvil.h

ссыль на общий рут:
https://github.com/BDOTimer/cf... /tree/main

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

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

Добавлено через 5 минут
Цитата Сообщение от SmallEvil Посмотреть сообщение
Можешь мне дать какие-то задачи по самому арбитру.
симейк прилепить сможешь,
а то все модераторы его требуют:
Цитата Сообщение от sourcerer Посмотреть сообщение
CMake
Цитата Сообщение от alecss131 Посмотреть сообщение
CMake
?

Не по теме:

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



Добавлено через 21 минуты
Цитата Сообщение от SmallEvil Посмотреть сообщение
дать какие-то задачи
вот чисто задача по проектированию то бишь снова по контрактам и интерфейсам:
1. есть гуй.
2. есть абстрактная задача прокручиваемая в цикле.
3. каким образом наладить между ними мост?

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

сделать топорно - не проблема.
а вот как это сделать красиво?

при этом разраб гуя не должен страдать и зависеть от прихотей разраба задачи.
а разраб не должен страдать и зависеть от прихотей разраба гуя.
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6315 / 3037 / 1054
Регистрация: 01.06.2021
Сообщений: 11,569
17.03.2023, 00:28
Цитата Сообщение от SmallEvil
Royal_X, а чего он так долго думает ?
Я же предупреждал, что движок к сожалению недостаточно оптимизирован. Впрочем, если уменьшить макс глубину, то он будет работать шустрее. Но уже сейчас этот движок лучше многих примитивных игр, которые можно встретить, например, в Google Play.
Если будет свободное время, то займусь дальнейшей оптимизацией. Проблема в том, что дерево узлов огромное и ему очень трудно анализировать глубже.
Если шахматы это всего лишь 8х8, то в моей программе самый большой размер это 15х15, который содержит 225! позиций. Столько позиций не сможет анализировать даже суперкомпьютер. Очевидно, что нужно оптимизировать. Но оптимизация движка для крестиков-ноликов более трудная задача, чем оптимизация шахматного движка, т.к. там эвристика более точная.
SmallEvil, а насколько быстрый твой движок? На каком ты уже этапе?
0
Just Do It!
 Аватар для XLAT
4219 / 2680 / 656
Регистрация: 23.09.2014
Сообщений: 9,235
Записей в блоге: 3
18.03.2023, 11:39
Цитата Сообщение от XLAT Посмотреть сообщение
поэтому правильно будет это выпилить iostream в отдельный файл и дергать его через абстракцию.
простые вещи приятно делать,
всего лишь:
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
#ifndef RENDER_H
#define RENDER_H
 
#include <stdio.h>
 
 
/// "render.h"
///----------------------------------------------------------------------------|
/// Render.
///----------------------------------------------------------------------------:
namespace myl
{
    struct Wcout
    {
 
        Wcout& operator<<(size_t n)
        {   printf ("%d", n);
            return *this;
        }
 
        Wcout& operator<<(int n)
        {   printf ("%d", n);
            return *this;
        }
 
        Wcout& operator<<(char c)
        {   printf ("%c", c);
            return *this;
        }
 
        Wcout& operator<<(wchar_t c)
        {   //wprintf (c);
            return *this;
        }
 
        Wcout& operator<<(std::string_view s)
        {   printf (s.data());
            return *this;
        }
 
        Wcout& operator<<(std::wstring_view s)
        {   wprintf (s.data());
            return *this;
        }
 
        static void testclass();
    };
 
    struct Cin
    {
        void get(){ getchar(); }
    };
 
    const char endl = '\n';
 
    extern Wcout wcout;
    extern Cin   cin  ;
}
 
 
namespace  wnd
{
    extern myl::Wcout err  ;
    extern myl::Wcout warn ;
    extern myl::Wcout field;
    extern myl::Wcout mess ;
}
 
#endif // RENDER_H
тут просто тест:
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
#include <locale>
#include <string>
#include <vector>
#include "render.h"
 
 
namespace myl
{   myl::Wcout wcout;
    myl::Cin   cin  ;
}
 
 
namespace wnd
{
    myl::Wcout err   ;
    myl::Wcout warn  ;
    myl::Wcout field ;
    myl::Wcout mess  ;
    myl::Wcout banner;
}
 
///----------------------------------------------------------------------------|
/// Тест.
///----------------------------------------------------------------------------:
struct Plot{ size_t x, y; };
 
 
myl::Wcout& operator<<(myl::Wcout& o, const Plot& plot)
{   o << "Plot:" << '{' << plot.x << ", " << plot.y << '}';
    return o;
}
 
using field_t = std::vector<std::string>;
 
struct PlotC{ Plot p; char c; };
 
field_t& operator<<(field_t& f, const PlotC& plotc)
{   f[plotc.p.y][plotc.p.x] = plotc.c;
    return f;
}
 
 
myl::Wcout& operator<<(myl::Wcout& o, const field_t& f)
{   for    (const auto& r : f)
    {   for(const auto& e : r)
        {
            o <<   e;
        }   o << '\n';
    }       o << '\n';
    return  o;
}
 
///------------------------------|
/// Тест.                        |
///------------------------------:
void myl::Wcout::testclass()
{
    std::setlocale(0, "");
 
    int  n = -333;
    char c =  'Z';
 
    Plot p = {123, 321};
 
    std:: string  str =  "std:: string";
    std::wstring wstr = L"std::wstring";
 
    myl::wcout  <<  "Hello, world!\n"
                << 2023       << "\n"
                << n          << "\n"
                << c          << "\n"
                << L"Привет,  Мир!\n";
    wnd::err    << p          << '\n'
                << str        << '\n'
                << wstr       << '\n';
 
    auto m = std::vector(10, std::string(7, '.'));
 
    m << PlotC{{2,2}, 'S'};
 
    Plot pp{3, 3};
 
    m << PlotC{pp, 'F'};
 
    myl::wcout << m;
 
    getchar();
}
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
18.03.2023, 11:51
XLAT, мои вступительные думки:
Кликните здесь для просмотра всего текста


Сверху рисунка показана примерная структура сервера:

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

Service - отдельная (уникальная для сервера) служба, предоставляет
специализированные услуги. Например, конкретный тип игры
(крестики-нолики, морской бой и др.), общий чат сервера и пр.
Задача службы - менеджмент сессий.

Session - отдельная сеанс службы (сеанс игры, комната чата и пр.).
Про сеанс чуть позже.

Это конечно общее поверхностное представление,
но раз мы начали снизу (с конкретной игры и ограниченной функциональности),
то для того, чтобы не переписывать все подряд при подъеме наверх,
желательно иметь общее представление конечного результата,
даже если он не будет достигнут. И ориентироваться на него при разоаботке.
Сервер в идеале многопоточный. Как минимум - асинхронный.
Предлагаю использовать boost (вчастности asio), чтобы велосипедить по-минимуму,
плюс кроссплатформенность.

В нижней части картинки собственно примерная структура игровой сессии.
Это задача минимум.

State + Logic - твой условный Арбитр, агрегирует игроков
(для крестиков-ноликов двух). Кто конкретно стоит за игроком, буть то бот
в дочернем процессе, живой игрок по сети или ардуинка по серийному порту,
ему не важно, он знает только об интерфейсе `Player`
(не виртуальный, он тут не нужен).

Player - инкапсулирует парсер, возможно хранит дополнительную идентифицирующую
инормацию и является мостиком для связи парсера и арбитра.

Parser - абстракция, за которой скрывается конкретный протокол обмена информации.
Его задача - преобразование данных из/в представления иры(арбитра) в сетевое
(будь то примитивный текст или двоичные данные, протоколы могут менятся со
временем или зависить от конкретного канала).

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

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

Задача минимум, которой я могу заняться для начала - каркас сессии крестики-нолики:
реализация канала связи с процессом для запуска ботов,
реализация парсера простенького текстового протокола для ботов.
Арбитр у тебя уже есть вроде.

Если тебя все устраивает, или почти все, то подумай, внеси правки, сообщи.
Тогда согласуем протокол и минимальный интерфейс (у меня есть наброски),
мне нужно будет тебе поручить адаптировать арбитра и написать простенький ИИ
(хоть рандом, не важно), пока я буду заниматься кишками.
Это чтоб собрать минимальную демку, запустить на моей и твоей машине, задать каркас проекта.
Если пойдет, можно будет заняться сетью.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
18.03.2023, 11:51

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


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

Или воспользуйтесь поиском по форуму:
180
Ответ Создать тему
Новые блоги и статьи
Расчёт периметра прямоугольника по координатам вершин
Maks 18.07.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Вычислить периметр прямоугольника, заданного координатами своих вершин на плоскости. Решение: Создан документ со следующими. . .
Подсчёт частоты трёхбуквенных слов в тексте
Maks 18.07.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Выясните, сколько раз в предложенном тексте встречается каждое трехбуквенное слово. Решение: Создан документ с единственным. . .
Сумма и количество положительных элементов в чётных строках массива
Maks 18.07.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Вычислить сумму и количество положительных элементов массива, расположенных в четных строках. Решение: Создан документ с. . .
Поиск произведения положительных чётных чисел в последовательности
Maks 18.07.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Дана произвольная последовательность целых чисел. Найти произведение положительных четных чисел данной последовательности. . . .
Обработка трёх чисел: утроение и возведение в степень
Maks 18.07.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Даны три действительных числа. Утроить те из них, значения которых неотрицательны, и возвести в четвертую степень отрицательные. . . .
Расчёт стоимости яблок по весу
Maks 18.07.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Написать программу вычисления стоимости некоторого количества (по весу) яблок. Решение: Создан документ, с табличной частью. . .
сукцессия 30. Фосфорный и азотный замки по "честному" закону лимитирования Либиха
anaschu 16.07.2026
Основные достижения за последние дни 1. Механизм отложенного высвобождения фосфора Добавлен специальный пул для медленного разложения меланизированных гиф ЕСМ Реализована разная скорость. . .
Запрет пометки на удаление и отмены проведения
Maks 16.07.2026
Алгоритм из решения ниже реализован на нетиповом документе "ПутевойЛист" разработанного в КА2. Задача: запретить помечать на удаление и отменять проведения путевого листа при условии, если он сдан. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru