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

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

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

Author24 — интернет-сервис помощи студентам
Я учусь в 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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
05.03.2023, 19:56
Ответы с готовыми решениями:

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

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

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

Оцените сборку в днс , как можно улучшить ? Бюджет 50 к
Вот http://www.dns-shop.ru/conf/b6dc324d86718ee2/ ссылка на днс , хотел бы узнать как вам моя...

Посоветуйте как улучшить код
@Autowired private ClothFabricRepository clothFabricRepository; @Autowired private...

284
Just Do It!
4019 / 2405 / 639
Регистрация: 23.09.2014
Сообщений: 7,739
Записей в блоге: 2
09.03.2023, 15:07 61
Author24 — интернет-сервис помощи студентам
Цитата Сообщение от SmallEvil Посмотреть сообщение
Доска уже часть Бота ?
пока нет. и это я собираюсь исправить.

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

но доступ только на чтение!
что, конешно, мало кто будет соблюдать, поэтому игре сразу краш)

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

там нужно всё же выделить общую часть в хедер и для сервера и для клиента.

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

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

но я такие длл(MSYS2 GCC) подключал и к MS VS C# - работали гуд.

кстати в MSYS2 два крестовых компилятора MinGW и Clang

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

арбитр может как то проверять такие фичи и начислять в рейтинг ...
0
Эксперт функциональных языков программированияЭксперт С++
4125 / 1938 / 960
Регистрация: 01.06.2021
Сообщений: 6,831
Записей в блоге: 6
09.03.2023, 19:48 62
Написал по-быстрому простенькое приложение, чтобы играть с Randoмичем. Будет настроение - напишу норм алгоритм для движка.
Вложения
Тип файла: zip game.zip (95.5 Кб, 6 просмотров)
2
SmallEvil
09.03.2023, 20:20
  #63

Не по теме:

Randoмич ! Закусывать надо )

0
Just Do It!
4019 / 2405 / 639
Регистрация: 23.09.2014
Сообщений: 7,739
Записей в блоге: 2
10.03.2023, 10:39 64
Цитата Сообщение от SmallEvil Посмотреть сообщение
тут еще все "вкурить" нужно...
допустим есть два разных подхода:
1. игрок хочет знать как оно работает во всех деталях и знам отдать игроку все интерфейсы которые есть нужные и не нужные.
2. игрок не хочет знать или ему не нужно знать как оно работает и знам дать ему только то что необходимо.

второй вар это может выглядеть как просто функция возвращающая точку:
C++
1
Plot step(array, typefishka, laststep);
я крутил ко второму вару...

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

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

собсно Гуй.
1. Печать Лога.
2. Редактор конфига(с десяток циферок).
3. всё.
0
Эксперт функциональных языков программированияЭксперт С++
4125 / 1938 / 960
Регистрация: 01.06.2021
Сообщений: 6,831
Записей в блоге: 6
10.03.2023, 11:52 65
Цитата Сообщение от XLAT
кода я не видел, но я надеюсь качественно написал?
в том смысле, к коду можно будет вернуться и спокойно его расширять и главное понимать.
Я-то пойму и смогу вернуться к коду в любое время. Но показатель хорошего кода это когда другой человек тоже в состоянии понять этот код. И тут отмечу несколько моментов: 1) это приложение достаточно простое и сделано начинающим в С++ (сделано лишь с целью иметь гуй, чтобы разрабатывать алгоритм для движка было не так скучно), поэтому любой программист его поймет, даже если написано некачественно; 2) я не думал о распространении этого приложения, поэтому сильно не заморачивался; 3) мои инструменты разработки занимают 1 ГБ на компьютере (это mingw-w64-ucrt+ текстовый редактор). Соответственно, я юзал только WinAPI и графика использует GDI+. Полагаю, что такие проекты никому неинтересны. По крайней мере, у меня сложилось впечатление по этому форуму, что в моде всякие Qt, VCL, WinForms, wxWidgets, и никто не будет делать как я...

Добавлено через 6 минут
XLAT, я ж вообще не эксперт в С++. Есть вещи, которые я не понимаю в твоём коде. Стараюсь искать ответы в сети. Поэтому я в твоей затее с турниром пока наблюдатель. Если потяну и смогу написать движок в таком виде, который нужен для турнира, то буду участвовать. Но если нет, то значит не судьба)
0
Just Do It!
4019 / 2405 / 639
Регистрация: 23.09.2014
Сообщений: 7,739
Записей в блоге: 2
10.03.2023, 13:32 66
Цитата Сообщение от Royal_X Посмотреть сообщение
Есть вещи, которые я не понимаю в твоём коде.
задай все вопросы тут.

Цитата Сообщение от Royal_X Посмотреть сообщение
Полагаю, что такие проекты никому неинтересны
все интересные проекты всегда содержат внутри себя кучи НЕИНТЕРЕСНЫХ штучек.
вопрос тока в том, как приготовить и подать.

и что интересно, что и НЕИНТЕРЕСНЫЕ проекты всё также содержат внутри
себя всё те же неинтересные штучки из интересных проектов.

т.е. в основе везде лежит одно и то же.

Вопрос: ПОЧЕМУ ВЫ НЕ МОЖЕТЕ СДЕЛАТЬ ИНТЕРЕСНЫЙ ПРОЕКТ?
Ответ: ПОТОМУ ЧТО ВЫ НЕ МОЖЕТЕ СДЕЛАТЬ И НЕИНТЕРЕСНЫЙ ПРОЕКТ!

вот в этом и заковырка.

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

у меня тут на форуме есть два варианта:
1. ответить на 100 нубских банальных вопросов("чем плюс отличается от минуса?") от ботов.
2. 100 посмотреть в сторону набора задач связанных в единый прожект.

вопрос:
какой вариант есть тру?
1
3697 / 2647 / 761
Регистрация: 29.06.2020
Сообщений: 9,800
10.03.2023, 13:36 67
Цитата Сообщение от XLAT Посмотреть сообщение
Сообщение от SmallEvil
тут еще все "вкурить" нужно...
допустим есть два разных подхода:
О чем я и говорил.
Моя dll (скомпилированной мною из твоего кода) не работает с твоим Арбитром (скомпилированным тобою).
0
1019 / 965 / 152
Регистрация: 10.08.2015
Сообщений: 5,203
10.03.2023, 13:42 68
Плюсы это язык про классы, а тут каша-малаша.крестики-нолики... нашли во что играть
Универсальная модель игр 1на1: класс игра управляет процессом (нечто типа приложения в приложении), создаёт доску... Класс игрок базовый родительский. От него наследуются классы кожаный игрок и ииигрок. Отличаются они методом получения хода.
0
Just Do It!
4019 / 2405 / 639
Регистрация: 23.09.2014
Сообщений: 7,739
Записей в блоге: 2
10.03.2023, 13:53 69
Цитата Сообщение от SmallEvil Посмотреть сообщение
Моя dll (скомпилированной мною из твоего кода) не работает с твоим Арбитром (скомпилированным тобою).
32 битный Арбитер для 32 длл
64 битный Арбитер для 64 длл

на гите 32 битный.

я щас проверил компиляторы разных - около десятка
гуд:
1. https://www.msys2.org/ (64+32) мощный репозиторий
2. https://jmeubank.github.io/tdm-gcc/ (64+32) легкая установка.(нет некоторых функций в std)
3. https://nuwen.net/mingw.html (64) легкая установка + есть boost внутри.

для остальных нужно либо крутить настройки(VS) либо делать ремарки в коде.

Добавлено через 2 минуты
Цитата Сообщение от vlisp Посмотреть сообщение
Плюсы это язык про классы, а тут каша-малаша.крестики-нолики... нашли во что играть
добавил ещё пункт в
Цитата Сообщение от XLAT Посмотреть сообщение
у меня тут на форуме есть два три варианта:
1. ответить на 100 нубских банальных вопросов("чем плюс отличается от минуса?") от ботов.
2. 100 посмотреть в сторону набора задач связанных в единый прожект.
3. тупо заниматься троллингом.
0
3697 / 2647 / 761
Регистрация: 29.06.2020
Сообщений: 9,800
10.03.2023, 13:59 70
Цитата Сообщение от XLAT Посмотреть сообщение
64 битный Арбитер для 64 длл
Это понятно. С dll очень мало работал.
Кстати dll у тебя без точки входа, это как понимать ?
Добавил точки входа, собрал сам и арбитра и dll.
Получаю исключение.
Код
Сигнатура проблемы:
  Имя события проблемы:	BEX64
  Имя приложения:	main.exe
  Версия приложения:	0.0.0.0
  Отметка времени приложения:	640b0aec
  Имя модуля с ошибкой:	StackHash_ebdf
0
Эксперт функциональных языков программированияЭксперт С++
4125 / 1938 / 960
Регистрация: 01.06.2021
Сообщений: 6,831
Записей в блоге: 6
10.03.2023, 14:09 71
Цитата Сообщение от XLAT
задай все вопросы тут.
При чтении твоего кода у меня появляются вопросы типа, например, для чего эта строка:
C++
1
#pragma pack(push, 1)
Конечно, мне было б удобно задать все вопросы здесь, но так я бы превратил тему в срач и уподобился бы к ботам-школьникам, которые захламляют своими темами форум. Многим это будет неинтересно, т.к. полагаю, что всем программистам твой код понятен. По этой причине, ответы на вопросы ищу в сети. И если уж не смогу там найти ответ, то напишу здесь.

vlisp, если С++ поддерживает ООП, в отличие от С, то разве это повод не заниматься в С++ функциональным программированием? Мне вот больше нравится С++, вот на нем и пишу.
0
Just Do It!
4019 / 2405 / 639
Регистрация: 23.09.2014
Сообщений: 7,739
Записей в блоге: 2
10.03.2023, 14:22 72
Цитата Сообщение от Royal_X Посмотреть сообщение
#pragma pack(push, 1)
из хедера нужно перенести в cpp
и в конце файла добавить #pragma pack(pop, 1)

msys2 gcc на это молчал(мож уровень варнингов не тот)

это из той оперы как если юсинги неймспейсов в хедерах писать.

в экспериментах(только что) с разными компилями я это исправил.

Royal_X, я так понимаю у вас msys2 ucrt или что?

Цитата Сообщение от Royal_X Посмотреть сообщение
если С++ поддерживает ООП
то он ТСу писал)
0
3697 / 2647 / 761
Регистрация: 29.06.2020
Сообщений: 9,800
10.03.2023, 14:23 73
XLAT, паника отменяется.
Все собраное мною заработало, по крайней мере последняя версия проекта.
1
Just Do It!
4019 / 2405 / 639
Регистрация: 23.09.2014
Сообщений: 7,739
Записей в блоге: 2
10.03.2023, 14:25 74
Цитата Сообщение от SmallEvil Посмотреть сообщение
Получаю исключение.
конкретно, что за компилятор?
0
3697 / 2647 / 761
Регистрация: 29.06.2020
Сообщений: 9,800
10.03.2023, 14:29 75
Хотя все равно про точку входа в DLL вопрос остался.
0
Эксперт функциональных языков программированияЭксперт С++
4125 / 1938 / 960
Регистрация: 01.06.2021
Сообщений: 6,831
Записей в блоге: 6
10.03.2023, 14:39 76
Цитата Сообщение от XLAT
я так понимаю у вас msys2 ucrt или что?
совершенно верно. Я предпочитаю UCRT (Universal C Runtime), а не MSVCRT (Microsoft Visual C++ Runtime). Раньше пользовался mingw-w64 ucrt из winlibs, но сейчас пользуюсь тем же, но из терминала msys2.
1
3697 / 2647 / 761
Регистрация: 29.06.2020
Сообщений: 9,800
10.03.2023, 14:42 77
Royal_X, я пытался как то msys2 развернуть, так он уперся в какие-то подписи/ключи и все.
Так я его и послал, туда - откуда он пришел.
0
1019 / 965 / 152
Регистрация: 10.08.2015
Сообщений: 5,203
10.03.2023, 14:42 78
А где тут функции? Смысл функции возвращать значение. А тут что? К тому же с грамматическими ошибками и без комментариев. Кто так код пишет?
0
Эксперт функциональных языков программированияЭксперт С++
4125 / 1938 / 960
Регистрация: 01.06.2021
Сообщений: 6,831
Записей в блоге: 6
10.03.2023, 14:50 79
SmallEvil, я как чел, который пишет не в ide, т.к. не терпит гигабайты лишнего барахла, нуждаюсь в легком тулчейне для редактора. Winlibs мне нравится тем, что скачал архив, разархивировал и все готово (не нужна даже установка). Но обновлять надо вручную. Поэтому перешёл на msys2. Тут установил раз терминал и нужный тулчейн и все готово. А для обновления просто нужно периодически писать команду $pacman -Syu и всегда будет свежий компилятор.
1
3697 / 2647 / 761
Регистрация: 29.06.2020
Сообщений: 9,800
10.03.2023, 14:55 80
Цитата Сообщение от Royal_X Посмотреть сообщение
Тут установил раз терминал и нужный тулчейн и все готово. А для обновления просто нужно периодически писать команду $pacman -Syu и всегда будет свежий компилятор.
Так вот эти команды и не работали у меня.
Ссылаясь на PEG ключи.
То ли не может их получить то ли проверить.
После непродолжительного но усердного разбора, не удалось решить на той системе.
У них очень необычная связь между демонами (службами).
0
10.03.2023, 14:55
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
10.03.2023, 14:55
Помогаю со студенческими работами здесь

Посоветуйте, как улучшить код?
Здравствуйте! Вот такую форму написал. Посоветуйте как улучшить код? &lt;html&gt; &lt;head&gt; ...

Крестики-нолики: как написать код для того, чтобы программа могла объявить победителя?
И да, поле 5 на 5. Сам код: #include &lt;iostream&gt; #include &lt;locale.h&gt; #include &lt;Windows.h&gt; using...

Подскажите какую игру можно написать в Делфи, не сильно сложную, не такую, как змейка, крестики-нолики, пинг-понг и т.д?
Мне нужно написать какую-нибудь программу в делфи, но как говорит мой препод &quot;не такую, что можно...

Крестики нолики(сократить код)
а как в крестиках ноликах можно заменить проверку двух подряд крестиков? ...

Дополнить код крестики-нолики
Задание 1. В Приложении (Урок 4) приведен код игры «Крестикинолики». Создайте диалоговое окно,...

Крестики-нолики: исправить код
Процедура getcoordinates работает неправильно. Только для клеток 3,6,7,8,9 program crozz; uses...


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

Или воспользуйтесь поиском по форуму:
80
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru