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

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

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

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

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
#include <iostream>
#include <stdio.h>
#include <cstdlib>
#include <windows.h>
using namespace std;
 
void output(char** field) {
    cout << "  1 2 3" << endl;
    for (int i = 0; i < 3; i++) {
        cout << i + 1 << " ";
        for (int j = 0; j < 3; j++) {
            cout << field[i][j] << " ";
        }
        cout << endl;
    }
}
void input(char** field, bool& gamer, string& Name1, string& Name2) {
 
    int answer;
    while (true) {
 
        if (gamer) {
            cout << Name1;
        }
        else {
            cout << Name2;
        }
        cout << ", введите номер строки и столбца: ";
 
 
        cin >> answer;
        if (answer > 10 && answer < 34) {
            int i = answer / 10;
            int j = answer % 10;
 
            if (0 < j && j < 4) {
                if (field[i - 1][j - 1] != 'X' && field[i - 1][j - 1] != 'O') {
                    if (gamer) {
                        field[i - 1][j - 1] = 'X';
                    }
                    else {
                        field[i - 1][j - 1] = 'O';
                    }
                    gamer = !gamer;
                    break;
                }
            }
        }
        cout << "Вы ввели неверную ячейку" << endl;
    }
}
char** fieldCreate(char c = '_') {
    int const n = 3;
    char** field = new char* [n];
    for (int i = 0; i < n; i++) {
        field[i] = new char[n];
        field[i][0] = c;
        field[i][1] = c;
        field[i][2] = c;
    }
    return field;
}
bool chekWin(char** field, string& Name1, string& Name2) {
    bool chekWin = false, gamer = false;
 
    if (field[0][0] == field[1][1] && field[0][0] == field[2][2] && (field[0][0] == 'X' || field[0][0] == 'O') || field[2][0] == field[1][1] && field[2][0] == field[0][2] && (field[2][0] == 'X' || field[2][0] == 'O')) {
        chekWin = true;
        if (field[1][1] == 'X') {
            gamer = true;
        }
    }
    else {
        for (int i = 0; i < 3; i++) {
            if (field[i][0] == field[i][1] && field[i][0] == field[i][2] && (field[i][0] == 'X' || field[i][0] == 'O') || field[0][i] == field[1][i] && field[0][i] == field[2][i] && (field[0][i] == 'X' || field[0][i] == 'O')) {
                chekWin = true;
                if (field[i][i] == 'X') {
                    gamer = true;
                }
                break;
            }
        }
    }
 
    if (chekWin) {
        if (gamer) {
            cout << "победил !" << Name1 << endl;
        }
        else {
            cout << "победил  !" << Name2 << endl;
        }
        return true;
    }
    else {
        bool draw = true;
        for (int i = 0; i < 3; i++) {
            for (int j = 0; j < 3; j++) {
                if (field[i][j] != 'X' && field[i][j] != 'O') {
                    draw = false;
                }
            }
        }
 
        if (draw) {
            cout << "ничья";
            return true;
        }
    }
 
    return false;
}
void defoultMassive(char** field, char c = '_') {
    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 3; j++) {
            field[i][j] = c;
        }
    }
}
bool continueGame() {
    bool flag = true;
    while (true) {
        string answer;
        cout << "Хотите ли вы продолжить игру?(Да/Нет)" << endl << "Введите ответ: "; //<< answer;
        cin >> answer;
        if (answer == "Да") {
            break;
        }
        else if (answer == "Нет") {
            flag = false;
            break;
        }
        else {
            cout << "Такого ответа не существует!";
        }
    }
    return flag;
}
void deleteMassive(char** field) {
    for (int i = 0; i < 3; i++) {
        delete[] field[i];
    }
    delete[] field;
}
void randomPlayer(string& Name1, string& Name2) {
    srand(time(0));
    int num = rand() % 2;
    cout << "Введите имя первого игрока: ";
    cin >> Name1;
    cout << "Введите имя второго игрока: ";
    cin >> Name2;
    if (num) {
        string tmp = Name1;
        Name1 = Name2;
        Name2 = tmp;
    }
    cout << "Первым ходит: " << Name1 << endl;
}
 
int main() {
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    bool gamer = true;
    char** field = fieldCreate();
    string Name1, Name2;
    randomPlayer(Name1, Name2);
    while (true) {
        defoultMassive(field);
        while (true) {
            system("Cls");
            output(field);
            if (chekWin(field, Name1, Name2))
                break;
            input(field, gamer, Name1, Name2);
 
        }
        if (!continueGame())
            break;
    }
    deleteMassive(field);
    return 0;
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
05.03.2023, 19:56
Ответы с готовыми решениями:

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

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

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

284
Just Do It!
 Аватар для XLAT
4219 / 2680 / 656
Регистрация: 23.09.2014
Сообщений: 9,235
Записей в блоге: 3
10.03.2023, 15:13
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от vlisp Посмотреть сообщение
а тут каша-малаша.крестики-нолики... нашли во что играть
мы тут почти закачиваем,
чуть подчистим, напишем боты и усё.

vlisp, какой следующий проект ты готов нам предложить???

Добавлено через 4 минуты
Цитата Сообщение от SmallEvil Посмотреть сообщение
Хотя все равно про точку входа в DLL вопрос остался.
честно, даже не знаю, что это такое.

я за здравый смысл:
для меня любая DLL в моих задачах, это набор функций,
именно тех функций, которые на ЭКСПОРТ.

т.е. каждая си функция это и есть точка входа.

много функций - много точек входа!

ещё раз повторюсь:
сделанные таким образом ДЛЛ легко подхватываются сами C# проектами,
что говорит о более менее стандартном способе их изготовлении.

могу гуй на С#WinForms написать, например.
0
 Аватар для vlisp
1070 / 991 / 153
Регистрация: 10.08.2015
Сообщений: 5,426
10.03.2023, 15:25
vlisp, какой следующий проект ты готов нам предложить???
Назовем его блайндчез. В консоли вводим ход. Ии отвечает тут же. Игра по правилам шахмат фишера.начальная позиция выводится перед игрой или вообще не выводится, для слабаков можно выводить доску после каждого хода. Но это фе интерфейс.
0
Just Do It!
 Аватар для XLAT
4219 / 2680 / 656
Регистрация: 23.09.2014
Сообщений: 9,235
Записей в блоге: 3
10.03.2023, 15:35
Цитата Сообщение от vlisp Посмотреть сообщение
В консоли вводим ход.
так это всё те же крестики?

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

но движок кто-то должен всё-равно написать?
верно?
0
 Аватар для vlisp
1070 / 991 / 153
Регистрация: 10.08.2015
Сообщений: 5,426
10.03.2023, 15:43
Обычных шахмат полно. шахматы вслепую - игра для гроссов. Можно прикрутить рыбку. чтоб сломать мозг любому гроссу. Можно кинуть музычку для отвлечения особо семипядистых. Главное дать полную возможность контроля экстремальности
0
Just Do It!
 Аватар для XLAT
4219 / 2680 / 656
Регистрация: 23.09.2014
Сообщений: 9,235
Записей в блоге: 3
10.03.2023, 15:48
Цитата Сообщение от vlisp Посмотреть сообщение
шахматы вслепую
почему сам ещ не сделал?
0
 Аватар для vlisp
1070 / 991 / 153
Регистрация: 10.08.2015
Сообщений: 5,426
10.03.2023, 15:49
Тогда не было бы смысла предлагать
0
Just Do It!
 Аватар для XLAT
4219 / 2680 / 656
Регистрация: 23.09.2014
Сообщений: 9,235
Записей в блоге: 3
10.03.2023, 16:01
Цитата Сообщение от vlisp Посмотреть сообщение
Тогда не было бы смысла предлагать
а какие прожекты сделал?

Не по теме:

я вот такие мелкие прожекты давно обожаю и делаю тут в разделе.

один из моих эпичных:
Задача 1 игра "Просто Филя"

0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
10.03.2023, 16:07
Цитата Сообщение от XLAT Посмотреть сообщение
Сообщение от SmallEvil
Хотя все равно про точку входа в DLL вопрос остался.
честно, даже не знаю, что это такое.
Ну да, необязательная функция.
Но все же рекомендую ознакомится.

Выровнял руки, нормально собираю dll, работает и с твоим арбитром, той же разрядности, конечно.
Но из за передачи ссылки на поле, все же могут быть проблемы (а могут и не быть, я хз).
Вообщем, можно писать бота.
0
Just Do It!
 Аватар для XLAT
4219 / 2680 / 656
Регистрация: 23.09.2014
Сообщений: 9,235
Записей в блоге: 3
10.03.2023, 19:35
Цитата Сообщение от SmallEvil Посмотреть сообщение
Но все же рекомендую ознакомится.
да видел я, когда новый прожект кодеблоке создаю,
там генерится дефолтный прожект со своим DDL хелловорлдом,
может и надо на него было навешивать свои прибамбасы,
а то я контрол-А + DEL

возможно нужно его и юзать - проверять ниохота, ну, раз так работает)

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


Добавлено через 50 минут
Цитата Сообщение от XLAT Посмотреть сообщение
про фейловый(там тестится зависание ИИ) длл отдельная песня...
минимальный тест:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
#include <iostream>
 
void user_main(int argc, char ** argv)
{
    int cnt = 1;
 
    // код пользователя
    while(true)
    {
        ///-----------------|
        /// Бобик сдох...   |
        ///-----------------|
 
        std::cout << "\r" << ++cnt;
    }
}
 
#include <boost/thread.hpp>
#include <boost/chrono.hpp>
 
 
void foo(int argc, char ** argv)
{
    boost::chrono::microseconds maxduration{5'000'000};
 
    using namespace boost::chrono;
    auto start = high_resolution_clock::now();
 
    auto elapsed_times = [&start]()
    {   auto finish = high_resolution_clock::now();
        std::cout << "Elapsed time: " << std::fixed
                  << float(duration_cast<microseconds>(finish - start).count())
                   / 1'000'000 << " s\n";
    };
 
    boost::thread work(
        [] (int argc, char ** argv) -> void
        {
            user_main(argc, argv);
        }
        , argc
        , argv
    );
    if(work.try_join_for(maxduration))
    {
        elapsed_times ();
    }
    else
    {
        elapsed_times ();
        std::cout << "Time Limit Exceeded\n";
 
        work.interrupt(); ///<—- ???
    }
}
 
int main(int argc, char ** argv)
{   foo (    argc,         argv);
 
    std::cout << "PROGRAMM GOOD FINISHED\n";
 
    /// зависший поток продолжает кутить ...
 
    std::cin.get(); 
}
запустите у себя чтобы увидеть проблему.

Добавлено через 4 минуты
Цитата Сообщение от SmallEvil Посмотреть сообщение
Но из за передачи ссылки на поле, все же могут быть проблемы
я ещё вчера это исправил.
https://github.com/BDOTimer/cf... e/ai.dll.h

поле ваще никак не передаётся, а создаётся локально у каждого игрока свой экземпляр и у Арбитра тоже свой.
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
10.03.2023, 19:52
Цитата Сообщение от XLAT Посмотреть сообщение
work.interrupt(); ///<—- ???
Вы этим зависший поток не убъете. Это для взаимодействия через точки прерывания. https://www.boost.org/doc/libs... terruption. Убить поток можно только через системное API.
1
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
10.03.2023, 19:53
Цитата Сообщение от XLAT Посмотреть сообщение
поле ваще никак не передаётся, а создаётся локально у каждого игрока свой экземпляр и у Арбитра тоже свой.
А я то слона и не увидел. Тапком меня
1
Just Do It!
 Аватар для XLAT
4219 / 2680 / 656
Регистрация: 23.09.2014
Сообщений: 9,235
Записей в блоге: 3
10.03.2023, 20:10
Цитата Сообщение от zayats80888 Посмотреть сообщение
поток можно только через системное API
хм, зачем тогда boost, если такое можно и на std простым древним детачем сделать и я уже и делал(

в С++20 есть cancelation
он в эту тему?

Добавлено через 5 минут
вот ещё на posix посмотреть:
https://www.ibm.com/docs/en/zo... nal-thread
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
10.03.2023, 20:14
Цитата Сообщение от XLAT Посмотреть сообщение
если такое можно и на std простым древним детачем сделать и я уже и делал(
Детач не убивает поток.
Цитата Сообщение от XLAT Посмотреть сообщение
в С++20 есть cancelation
он в эту тему?
Это то же самое - точки прерывания.

Убить поток - это взять его нативный хэндл и вызвать соответствующую системную функцию (TerminateThread или pthread_kill, например). Однако, лучше до этого не доводить. Это считай UB. Код нужно писать нормально.
1
Just Do It!
 Аватар для XLAT
4219 / 2680 / 656
Регистрация: 23.09.2014
Сообщений: 9,235
Записей в блоге: 3
10.03.2023, 20:25
Цитата Сообщение от zayats80888 Посмотреть сообщение
Это считай UB. Код нужно писать нормально.
если у олимпиадников расчет укладки золотого рюкзака не укладывается в 2 секунды,
откуда олимпиадники могут знать об этом заранее?

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

или запускать отдельную прогу и юзать её по сокету?))
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
10.03.2023, 20:28
Цитата Сообщение от XLAT Посмотреть сообщение
или запускать отдельную прогу
Если нужно оставить свой процесс живым, запустив чужой код, то да - запускайте отдельный процесс.
1
Just Do It!
 Аватар для XLAT
4219 / 2680 / 656
Регистрация: 23.09.2014
Сообщений: 9,235
Записей в блоге: 3
10.03.2023, 20:54
итак, настало время костылей:
например,
если игрок завис, то Арбитр сохраняет своё состояние в файл,
в этом же файле делает пометку о дисквалификации игрока, запускает свою копию, а сам завершает работу.
хм...

копия грузит файл и продолжает работу уже без фейлового игрока.

Не по теме:

или плавно тредкилл проблема дрейфует нас в тему сокетов:
Делаем(!) С++ сервак для Морского Боя и Морской Бой тоже

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

Не по теме:

Цитата Сообщение от XLAT Посмотреть сообщение
или плавно тредкилл проблема дрейфует нас в тему сокетов
Почему именно сокеты? Средств для IPC много разных...

0
Just Do It!
 Аватар для XLAT
4219 / 2680 / 656
Регистрация: 23.09.2014
Сообщений: 9,235
Записей в блоге: 3
10.03.2023, 21:14
Цитата Сообщение от zayats80888 Посмотреть сообщение
Детач не убивает поток.
я и говорю что поведение его полностью идентично примеру буста.

Цитата Сообщение от zayats80888 Посмотреть сообщение
Я не в теме. Я сюда случайно зашел, какую проблему решаете (всю тему лень листать)?
коротко и вроде вполне ясно о чём, тут:
https://github.com/BDOTimer/cf-cross-zero

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

Добавлено через 4 минуты
Цитата Сообщение от XLAT Посмотреть сообщение
итак, настало время костылей:
или как в старые добрые древние времена - через ручной контроль)
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
10.03.2023, 21:20
Цитата Сообщение от XLAT Посмотреть сообщение
или как в старые добрые древние времена
Бумажка с ходом, в конверт, плюнь-плюнь и две марки
1
Just Do It!
 Аватар для XLAT
4219 / 2680 / 656
Регистрация: 23.09.2014
Сообщений: 9,235
Записей в блоге: 3
10.03.2023, 21:26
Цитата Сообщение от SmallEvil Посмотреть сообщение
Бумажка с ходом, в конверт, плюнь-плюнь и две марки
можно так,
если игрок сфейлил,
то турнир прекращается + делается пометка о фейловом игроке.
без записи и загрузки текущего состояния.

при следующем запуске эта длл просто не грузится.

и это(черный список) очень легко сделать.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
10.03.2023, 21:26

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


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

Или воспользуйтесь поиском по форуму:
100
Ответ Создать тему
Новые блоги и статьи
Теория всего 12. ВГК
anaschu 21.07.2026
### Главные семантические изменения и дешифровка новой физики 1. **`REPRODUCTIVE_EMISSION` вместо фотосинтеза (`PS_base`)**: Энергия и ресурсы, которые класс средних мужчин (`_W_MEN_DONORS`). . .
Публикация отклонённая на хабре. Как «пернатого» заставить осваивать новые горизонты опыта через масштабирование задачи и целеполагание
Hrethgir 21.07.2026
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11948&stc=1&d=1784657928 Привет Хабр. В этой статье я расскажу, как один закон эпистемологии позволил мне с ходу запустить уникальный. . .
Теория всего 11. Основные параметры
anaschu 21.07.2026
Дешифровка тензорного ядра Soil Chemistry 2. 0: Истинный инвариант Теории Всего Чистовой исходный код многокомпонентной сукцессии зафиксирован. Модель оперирует единым вектором состояния. . .
Теория всего 10. Клод трусишка
anaschu 21.07.2026
Алгоритмический суицид ИИ: Когда математика ОДУ взламывает цензурные шлюзы Свежайший мета-прецедент нашей разработки! Клод официально отказался строить итоговую кроссплатформенную модель, как. . .
Теория всего 9. Окончательная проработка метафоры "дерево = традиции"
anaschu 21.07.2026
Скрытые параметры ядра ОДУ: Механика Глубинного Рока Клод утаил от вас ключевую математику кризисов. В движке игры зашиты пять скрытых коэффициентов, определяющих, как именно ТНК и Мемы ломают. . .
Теория всего 8. Clauude трусишка. Ответ джемени
anaschu 21.07.2026
Игровой баланс «Модели Всего»: Алгоритмический блок как механика Семантического БуфераЭтот скриншот отказа Клода — идеальный, чистейший прецедент для нашей Теории Всего. Вы столкнулись не просто с. . .
Теория всего 7. Дерево - это патриархат, грибы - это феминизм
anaschu 21.07.2026
Уничтожение Патриархата: Как ТНК, Мемы и Половой отбор зачистили «Сексуальный Пролетариат» Величайшая иллюзия современного человека — вера в «свободу воли», «социальный прогресс» и «эволюцию. . .
История и социология Терры на примере борьбы микориз за пространство. 1. Глоссарий терры.
anaschu 21.07.2026
Решил тут подумать о возможности сделать лор некоторой комп игры - стратегии, или худжественной книги антиутопии, которые будут юзать планету,которая максимально будет похожа на нашу землю, но где. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru