Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- using namespace std;
- int main() {
- setlocale(LC_ALL, "rus");
- // двумерный массим, отвечающий за поле
- // когда пользователи будут расставлять крестики или нолики, будем менять
- // символ '_' на 'X' или '0' соответственно
- // все линии, заполнив которые, игрок побеждает
- int lines[8][3] = {{00, 01, 02},
- {10, 11, 12},
- {20, 21, 22},
- {00, 10, 20},
- {01, 11, 21},
- {02, 12, 22},
- {00, 11, 22},
- {20, 11, 02}};
- cout << "Добро пожаловать в игру крестики-нолики." << endl;
- // пока игрок не захочет выйти эта переменная будет false
- bool end_game = false;
- // цикл пока игрок не зохотел выйти
- while (!end_game) {
- // игровое поле
- char playing_field[3][3] = {{'_', '_', '_'},
- {'_', '_', '_'},
- {'_', '_', '_'}};
- // количество свободных клеток
- int number_of_free_cells = 9;
- cout << "Выберите режим игры:" << endl;
- cout << "1. Два игрока" << endl << "2. Игрок против компьютера" << endl;
- cout << "Введите число (1 или 2): ";
- // режим игры Два игрока или Игрок против компьютера
- int game_mode;
- cin >> game_mode;
- // пока пользователь не введет корректное значение, будем просить его ввести число (1 или 2)
- while (game_mode != 1 && game_mode != 2) {
- cout << "Некоррктное значение." << endl;
- cout << "Введите число (1 или 2): ";
- cin >> game_mode;
- }
- // теперь пусть игрок или игроки выберут сторону
- if (game_mode == 1) {
- cout << "Выберите стороны (сначала написана сторона первого игрока, после второго):" << endl;
- cout << "1. Крестики vs Нолики" << endl << "2. Нолики vs Крестики" << endl;
- } else {
- cout << "Выберите сторону:" << endl;
- cout << "1. Нолики" << endl << "2. Крестики" << endl;
- }
- cout << "Введите число (1 или 2): ";
- int players_side;
- cin >> players_side;
- // снова будем просить пользователя ввести корректные данные до тех пор пока он не введет 1 или 2
- while (players_side != 1 && players_side != 2) {
- cout << "Некорректное значение." << endl;
- cout << "Введите число (1 или 2): ";
- cin >> players_side;
- }
- // следующая функция позволяет сделать рандом разным от запуска к запуску
- srand(time(0));
- // далее определи кто ходит первый
- int who_walks = rand() % 2;
- //Если наше значение who_walks равно нулю, то первый игрок ходит первый. В слечае
- // когда человек играет против компьютера первым игроком является компьютер
- // Далее, если у нас режим игрок против компьютера, мы выводим, что первым ходит компьютер
- // если же режим человек против чедловека, то выводим что начинает первый игрок
- // Далее переменная who_walks сигнализирует о том, кто ходит в данный момент
- if (who_walks == 0) {
- if (game_mode == 1) {
- cout << endl << "Начинает первый игрок." << endl << endl;
- } else {
- cout << endl << "Начинает компьютер." << endl << endl;
- }
- } else {
- if (game_mode == 1) {
- cout << endl << "Начинает второй игрок." << endl << endl;
- } else {
- cout << endl << "Начинает игрок." << endl << endl;
- }
- }
- // Информация о том как ходить
- cout << "Для того, чтобы ходить, нужно ввести одно двузначное число, каждая цифра которого" << endl;
- cout << "означает координаты клетки (первая цифра - строку, вторая - столбец)" << endl;
- cout << "Вот координаты каждой клетки:" << endl;
- cout << "11|12|13" << endl;
- cout << "21|22|23" << endl;
- cout << "31|32|33" << endl;
- // функция, которая равна false до тех пор, пока либо не закончатся
- // пустые клетки, либо кто-то из игроков не выиграет
- bool end_round = false;
- while (!end_round) {
- // далее мы выводим информацию о том кто ходит
- if (who_walks == 0) {
- if (game_mode == 1) {
- cout << endl << "Ход первого игрока:";
- } else {
- cout << endl << "Ход компьютера:";
- }
- } else {
- if (game_mode == 1) {
- cout << endl << "Ход второго игрока:";
- } else {
- cout << endl << "Ход игрока:";
- }
- }
- int coordinates;
- // номер столбца и номер строки, в которую чейчас ходят
- int column;
- int line;
- // если ходит компьютер
- // Если game_mode == 2 && who_walks == 0 то сейчас ходит первый игрок и режим игры
- // компьютер против человека, значит сейчас ходит компьютер
- // Теперь посмотрим на количество оставшихся пустых клеток. Упорядочим(в уме) их и в
- // pos присвоим значение от 1 до umber_of_free_cells. Будем идти подряд и рисваивать переменным line и column
- // знаение нынешней пустой клетки а так же убавлять значение pos , кода будем встречать пустую
- // клетку, до тех пор пока оно(pos) не станет нулём.
- if (game_mode == 2 && who_walks == 0) {
- int pos;
- if (number_of_free_cells != 1) {
- pos = rand() % number_of_free_cells;
- } else {
- pos = 1;
- }
- if (pos == 0) {
- pos = number_of_free_cells;
- }
- for (int i = 0; i < 3; ++i)
- for (int j = 0; j < 3; ++j)
- if (playing_field[i][j] == '_' && pos > 0) {
- column = j + 1;
- line = i + 1;
- --pos;
- }
- cout << line << column << endl;
- } else {
- // в этом случае ходит человек
- // считаем корерктные данные
- cin >> coordinates;
- column = coordinates % 10;
- line = coordinates / 10;
- // Пока пользователь не введет корректные данные
- while (column > 3 || column < 1 || line > 3 || line < 1 ||
- playing_field[line - 1][column - 1] != '_') {
- cout << "Некорректное значение." << endl;
- if (who_walks == 0) {
- cout << endl << "Ход первого игрока:";
- } else {
- if (game_mode == 1) {
- cout << endl << "Ход второго игрока:";
- } else {
- cout << endl << "Ход игрока:";
- }
- }
- cin >> coordinates;
- column = coordinates % 10;
- line = coordinates / 10;
- }
- }
- // убавим количество пустых клеток на 1
- number_of_free_cells -= 1;
- // в зависимости от того чей ход и в каком режиме присвоим клетке значение Х или 0
- if (who_walks == 0) {
- if (players_side == 1) {
- playing_field[line - 1][column - 1] = 'X';
- } else {
- playing_field[line - 1][column - 1] = '0';
- }
- } else {
- if (players_side == 1) {
- playing_field[line - 1][column - 1] = '0';
- } else {
- playing_field[line - 1][column - 1] = 'X';
- }
- }
- //выведем все поле
- for (int i = 0; i < 3; ++i) {
- cout << playing_field[i][0] << '|' << playing_field[i][1] << '|' << playing_field[i][2] << endl;
- }
- // теперь изменим игрока, который будет ходить в следующий ход
- if (who_walks == 1) {
- who_walks = 0;
- } else {
- who_walks = 1;
- }
- // теперь нам нужно проверить, вдруг кто-то заполнил линию своим символом для этого пробежимся по массиву line
- // и будем извлекать координаты клеток и сравнивать все три клетки, если они равны, то присвоим переменной
- // которая отвечает за конец раунда (end_round) значение true, для того чтобы раунл закончился и выведем на
- // экран победителя
- for (int i = 0; i < 8; ++i) {
- // координаты трех клеток
- int x1 = lines[i][0] / 10, y1 = lines[i][0] % 10;
- int x2 = lines[i][1] / 10, y2 = lines[i][1] % 10;
- int x3 = lines[i][2] / 10, y3 = lines[i][2] % 10;
- // проверка трехклеток на равенство
- if (playing_field[x1][y1] == playing_field[x2][y2] &&
- playing_field[x1][y1] == playing_field[x3][y3] &&
- playing_field[x1][y1] != '_') {
- end_round = true;
- if ((playing_field[x1][y1] == 'X' && players_side == 1) ||
- (playing_field[x1][y1] == '0' && players_side == 2)) {
- if (game_mode == 1) {
- cout << "Первый игрок победил!" << endl;
- } else {
- cout << "Победил компьютер!" << endl;
- }
- } else {
- if (game_mode == 1) {
- cout << "Второй игрок победил!" << endl;
- } else {
- cout << "Победил игрок!" << endl;
- }
- }
- }
- // если количество пустых клеток закончилось, и никто не выиграл (если бы кто-то выиграл, мы бы не присвоили
- // переменной end_round значение true)
- if (number_of_free_cells == 0 && !end_round) {
- end_round = true;
- cout << "Ничья!" << endl;
- }
- }
- }
- // Теперь спросим у пользователя, не хочет ли он начать игру занова, если нет,
- // то присвоим переменной end_game значение true, чтобы программа завершила работу
- cout << "Начать заново?" << endl;
- cout << "1. Да" << endl << "2. Нет" << endl;
- cout << "Введите число (1 или 2): ";
- int continue_game;
- cin >> continue_game;
- while (continue_game != 1 && continue_game != 2) {
- cout << "Некорректное значение." << endl;
- cout << "Введите число (1 или 2): ";
- cin >> continue_game;
- }
- // присваиваем переменной end_game значение true
- if (continue_game == 2) {
- end_game = true;
- }
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement