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
| #include "pch.h"
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <cstring>
using namespace std;
char PlayerName1[30], //Переменные для имен игроков
PlayerName2[30];
char cells[9] = { '-', '-', '-', '-', '-', '-', '-', '-', '-' };//в нем хранятся данные о клеточках ("-" - пустая, "Х" - первого игрока, "О" - второго)
char win = '-'; //Символ победы ("-" - ничья, "Х" - первого игрока, "О" - второго)
void show_cells()//функция не имеет возвращающего типа, потому что она просто выводит поле
{
system("cls"); //системная функция, которая очищает экран для того чтобы выглядело солидно
cout << "\t\t\tКрестики-нолики\n\n";
cout << "Правила:\n";
cout << "Играют 2 игрока на поле 3х3\n";
cout << "Побеждает тот кто составит выиграшную комбинацию\n";
cout << "Вид поля:\n" << endl;//Номера клеток для того, чтобы человек знал куда ходить
cout << "-" << 1 << "-" << '|' << "-" << 2 << "-" << '|' << "-" << 3 << "-" << endl;
cout << "-" << 4 << "-" << '|' << "-" << 5 << "-" << '|' << "-" << 6 << "-" << endl;
cout << "-" << 7 << "-" << '|' << "-" << 8 << "-" << '|' << "-" << 9 << "-" << "\n" << endl;
cout << "Текущая ситуация:\n" << endl;//Текущая ситуация на поле (клеточка --- - пуста)
cout << "-" << cells[0] << "-" << '|' << "-" << cells[1] << "-" << '|' << "-" << cells[2] << "-" << endl;
cout << "-" << cells[3] << "-" << '|' << "-" << cells[4] << "-" << '|' << "-" << cells[5] << "-" << endl;
cout << "-" << cells[6] << "-" << '|' << "-" << cells[7] << "-" << '|' << "-" << cells[8] << "-" << "\n" << endl;
}
void make_move(int num)//это функция ничего не возвращает, но у нее есть аргумент - номер игрока, который будет делать ход
{
if (num == 1) cout << PlayerName1;//Если аргумент = 1, то выводится имя первого игрока (то есть он будет ходить)
else cout << PlayerName2;
cout << ", введите номер клетки,чтобы сделать ход : ";
int cell;
cin >> cell; //Игрок который ходит должен указать номер клеточки
cout << "\n";
while (cell > 9 || cell < 1 || cells[cell - 1] == 'O' || cells[cell - 1] == 'X')//Проверка на валидность (клеточка не занята и ее номер не <1 и не >9
{
cout << "Введите номер(1-9) клетки,чтобы сделать ход: ";
cin >> cell; //Если проверка не пройдена, то игрок должен еще раз ввести номер клеточки
cout << "\n";
}
if (num == 1) cells[cell - 1] = 'X'; //Первый игрок играет "крестиками", а второй - "ноликами"
else cells[cell - 1] = 'O';
}
char check()
{
for (int i = 0; i < 3; i++) //Для победы нужны 3 клеточки
if (cells[i * 3] == cells[i * 3 + 1] && cells[i * 3 + 1] == cells[i * 3 + 2]) //Комбинации для победы вычисляются по разным формулам
return cells[i]; // По горизонтали 0-1-2,3-4-5 и 6-7-8
//нумерация в массиве начинается с 0
else if (cells[i] == cells[i + 3] && cells[i + 3] == cells[i + 6]) //Вертикальная
return cells[i]; //0-3-6, 1-4-7 и 2-5-8
else if ((cells[2] == cells[4] && cells[4] == cells[6]) || (cells[0] == cells[4] && cells[4] == cells[8]))
return cells[i]; //И по диагонали: 0-4-8 и 2-4-6
return '-'; //Иначе - ничья
}
void result()
{
if (win == 'X') cout << PlayerName1 << " Выиграл! Поздравляю! " << endl;
else if (win == 'O') cout << PlayerName2 << " Выиграл! Поздравляю!" << endl;
else cout << "Ничья!!!" << endl;
}
int main()
{
setlocale(LC_ALL, "rus");
int move = 0;
do {
cout << "Введите имя 1 игрока: ";
cin>>PlayerName1;
cout << "Введите имя 2 игрока: ";
cin>>PlayerName2;
cout << "\n";
}
while (!strcmp(PlayerName1, PlayerName2));/*Функция из cstring для проверки разности строк она возвращает 0, если строки равны*/
show_cells();
for (move = 1; move <= 9; move++) //Цикл на 9 ходов, т.к. у нас 9 клеточек
{
if (move % 2) make_move(1); //Если ход нечетный, то остаток от деления на будет равен 1 (то есть true)
else make_move(2); //Если четный, то 0 (false). Тогда если ход нечетный ходит первый игрок,
show_cells(); //а если четный, то второй
if (move >= 5)/*Если номер хода 5 или больше, то проходит проверка на победу (раньше, чем на 5-ом ходе победить нельзя)*/
{
win = check(); //Символ победы - это возвращенное значение функции проверки
if (win != '-'); //Если символ победы не "-" (то есть кто-то победил)
{
break;//то нету смысла в дальнейших ходах и цикл прерывается
}
}
}//Цикл закончился и ничто не победил - ничья
result(); //Функция, которая выводит результат
system("pause");/*system ("pause") использовано для того, чтобы программа не закрывалась после выполнения (функция использована для того, чтобы игру можно было свободно запускать с .exe-файла, а не через cmd)*/
return 0;
} |