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

Нужно разобраться в коде. Крестики нолики

02.04.2023, 21:42. Показов 496. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
В общем нужно разобраться в коде и детально понять как что работает. Помогите пожалуйста
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
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
02.04.2023, 21:42
Ответы с готовыми решениями:

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

Игра Крестики-Нолики (Ошибка в коде)
Доброго времени суток. Не показывает победителя если комбинация по вертикали/горизонтали/диагонали сошлась. И если вводить букву...

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

4
Лежебока
 Аватар для Donkix
328 / 244 / 95
Регистрация: 12.05.2021
Сообщений: 1,429
Записей в блоге: 2
02.04.2023, 22:34
Цитата Сообщение от EvgenL Посмотреть сообщение
char** field = fieldCreate();
заполнение массива
Цитата Сообщение от EvgenL Посмотреть сообщение
randomPlayer(Name1, Name2);
Инициализация игроков и очереди игры
Цитата Сообщение от EvgenL Посмотреть сообщение
defoultMassive(field);
инициализация массива
Цитата Сообщение от EvgenL Посмотреть сообщение
output(field);
вывод массива
Цитата Сообщение от EvgenL Посмотреть сообщение
if (chekWin(field, Name1, Name2))
break;
Проверка конца игры
Цитата Сообщение от EvgenL Посмотреть сообщение
input(field, gamer, Name1, Name2);
Модуль, в котором проходит сама игра
Цитата Сообщение от EvgenL Посмотреть сообщение
if (!continueGame())
Выбор для продолжения игры
Цитата Сообщение от EvgenL Посмотреть сообщение
deleteMassive(field);
очищение выделеной памяти
0
0 / 0 / 0
Регистрация: 02.04.2023
Сообщений: 3
06.04.2023, 20:37  [ТС]
Я хотел узнать как именно работают сами процедуры. например как работает вывод поля, ввод координат и как проверяется окончание игры.
0
 Аватар для Kuzia domovenok
4268 / 3327 / 926
Регистрация: 25.03.2012
Сообщений: 12,536
Записей в блоге: 1
06.04.2023, 22:09
EvgenL, непонятно как именно и насколько глубоко требуется объяснять! Вот вывод поля например: тебе необходимы объяснить зачем пишут циклы в С++??? Так ты сначала сам попробуй программу с циклом написать, поиграй с ней, напиши один цикл, другой... сам и поймёшь через недельку! Или ты уже писал, но всё равно не понимаешь сейчас?
0
Лежебока
 Аватар для Donkix
328 / 244 / 95
Регистрация: 12.05.2021
Сообщений: 1,429
Записей в блоге: 2
06.04.2023, 23:20
Цитата Сообщение от EvgenL Посмотреть сообщение
как проверяется окончание игры
А как понять в обычных крестиках-ноликах как победить?(риторический вопрос)
Тут тоже самое, в функции chekwin проверяются все возможные комбинации победы и ому они принадлежат

Добавлено через 2 минуты
Цитата Сообщение от EvgenL Посмотреть сообщение
как работает вывод поля
Цитата Сообщение от EvgenL Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
10
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;
 }
}
Данная процедура принимает на вход указатель на двухмерный массив
затем через внешний цикл выводится номер строки, через внутренний - значения строки

Добавлено через 3 минуты
Цитата Сообщение от EvgenL Посмотреть сообщение
ввод координат
Цитата Сообщение от EvgenL Посмотреть сообщение
cout << ", введите номер строки и столбца: ";
cin >> answer;
if (answer > 10 && answer < 34)
Запрос на ввод двухзначного числа(x,y)
Затем проверка поля, на который указывает число, если пустое - ставим( через булевую переменную узнаем, чей ход), если ячейка не пустая, значит выводим сообщение об этом
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
06.04.2023, 23:20
Помогаю со студенческими работами здесь

Программа крестики нолики, исправить ошибки в коде
Уже неделю пишу программу для игры крестики нолики и понял, что всё очень печально. Был бы очень признателен за помощь. Есть проблема,с...

Крестики нолики, нужно немного дописать
Помогите пожалуйста. Нужно дописать код что бы пользователь не смог вводить уже введенное(выбранное). Если выбрали нолик, то туда уже...

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

Игра крестики нолики, не могу разобраться с циклом не нахожу ошибку
Код еще не дописан во функции main но компилятор уже ругается на цикл whileбподстажите что нужно сделать чтобы заработал( #include...

Ошибка в коде (крестики нолики)
Приветствую ребят! Пишу код к игре крестики нолики, но где то допустил ошибку и неработает функция игра против второго игрока. Против...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Модель заражения группы наркоманов
alhaos 17.04.2026
Условия задачи сформулированы тут Суть: - Группа наркоманов из 10 человек. - Только один инфицирован ВИЧ. - Колются одной иглой. - Колются раз в день. - Колются последовательно через. . .
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru