-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmain.cpp
128 lines (105 loc) · 4.31 KB
/
main.cpp
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
#include <iostream>
#include <vector>
using namespace std;
// Функция для отображения игрового поля
void displayBoard(const vector<char>& board) {
system("clear"); // Очистка экрана для Linux
cout << "Крестики-нолики\n";
cout << "Используйте numpad для выбора позиции:\n\n";
cout << " " << board[6] << " | " << board[7] << " | " << board[8] << " \n";
cout << "---+---+---\n";
cout << " " << board[3] << " | " << board[4] << " | " << board[5] << " \n";
cout << "---+---+---\n";
cout << " " << board[0] << " | " << board[1] << " | " << board[2] << " \n";
}
// Функция для проверки выигрышных комбинаций
bool checkWin(const vector<char>& board, char player) {
// Проверка горизонтальных линий
for (int i = 0; i < 9; i += 3) {
if (board[i] == player && board[i+1] == player && board[i+2] == player)
return true;
}
// Проверка вертикальных линий
for (int i = 0; i < 3; i++) {
if (board[i] == player && board[i+3] == player && board[i+6] == player)
return true;
}
// Проверка диагоналей
if (board[0] == player && board[4] == player && board[8] == player)
return true;
if (board[2] == player && board[4] == player && board[6] == player)
return true;
return false;
}
// Функция для проверки заполненности поля (ничья)
bool isBoardFull(const vector<char>& board) {
for (char cell : board) {
if (cell == ' ')
return false;
}
return true;
}
// Функция для преобразования ввода numpad в индекс массива
int numpadToIndex(int input) {
switch (input) {
case 1: return 0;
case 2: return 1;
case 3: return 2;
case 4: return 3;
case 5: return 4;
case 6: return 5;
case 7: return 6;
case 8: return 7;
case 9: return 8;
default: return -1;
}
}
int main() {
char playAgain = 'y';
while (playAgain == 'y' || playAgain == 'Y') {
// Инициализация пустого поля
vector<char> board(9, ' ');
bool isXTurn = true;
bool gameOver = false;
while (!gameOver) {
// Отображение текущего состояния поля
displayBoard(board);
// Определение текущего игрока
char currentPlayer = isXTurn ? 'X' : 'O';
// Вывод подсказки
cout << "\nХод " << currentPlayer << ". Введите позицию (1-9): ";
int position;
cin >> position;
// Преобразование ввода в индекс массива
int index = numpadToIndex(position);
// Проверка корректности ввода
if (index == -1 || board[index] != ' ') {
cout << "Некорректный ход! Нажмите Enter для продолжения...";
cin.ignore();
cin.get();
continue;
}
// Установка символа на поле
board[index] = currentPlayer;
// Проверка на выигрыш
if (checkWin(board, currentPlayer)) {
displayBoard(board);
cout << "\nИгрок " << currentPlayer << " выиграл!\n";
gameOver = true;
}
// Проверка на ничью
else if (isBoardFull(board)) {
displayBoard(board);
cout << "\nНичья!\n";
gameOver = true;
}
// Смена хода
isXTurn = !isXTurn;
}
// Спрашиваем, хочет ли игрок сыграть еще раз
cout << "\nХотите сыграть еще раз? (y/n): ";
cin >> playAgain;
}
cout << "Спасибо за игру!\n";
return 0;
}