Advertisement
Guest User

Untitled

a guest
Oct 20th, 2019
109
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 14.03 KB | None | 0 0
  1. #include <iostream>
  2.  
  3. using namespace std;
  4.  
  5.  
  6. int main() {
  7.     setlocale(LC_ALL, "rus");
  8.     // двумерный массим, отвечающий за поле
  9.     // когда пользователи будут расставлять крестики или нолики, будем менять
  10.     // символ '_' на 'X' или '0' соответственно
  11.  
  12.  
  13.     // все линии, заполнив которые, игрок побеждает
  14.     int lines[8][3] = {{00, 01, 02},
  15.                        {10, 11, 12},
  16.                        {20, 21, 22},
  17.                        {00, 10, 20},
  18.                        {01, 11, 21},
  19.                        {02, 12, 22},
  20.                        {00, 11, 22},
  21.                        {20, 11, 02}};
  22.  
  23.     cout << "Добро пожаловать в игру крестики-нолики." << endl;
  24.  
  25.     // пока игрок не захочет выйти эта переменная будет false
  26.     bool end_game = false;
  27.     // цикл пока игрок не зохотел выйти
  28.     while (!end_game) {
  29.         // игровое поле
  30.         char playing_field[3][3] = {{'_', '_', '_'},
  31.                                     {'_', '_', '_'},
  32.                                     {'_', '_', '_'}};
  33.         // количество свободных клеток
  34.         int number_of_free_cells = 9;
  35.         cout << "Выберите режим игры:" << endl;
  36.         cout << "1. Два игрока" << endl << "2. Игрок против компьютера" << endl;
  37.         cout << "Введите число (1 или 2): ";
  38.  
  39.         // режим игры Два игрока или Игрок против компьютера
  40.         int game_mode;
  41.  
  42.         cin >> game_mode;
  43.         // пока пользователь не введет корректное значение, будем просить его ввести число (1 или 2)
  44.         while (game_mode != 1 && game_mode != 2) {
  45.             cout << "Некоррктное значение." << endl;
  46.             cout << "Введите число (1 или 2): ";
  47.             cin >> game_mode;
  48.         }
  49.  
  50.         // теперь пусть игрок или игроки выберут сторону
  51.         if (game_mode == 1) {
  52.             cout << "Выберите стороны (сначала написана сторона первого игрока, после второго):" << endl;
  53.             cout << "1. Крестики vs Нолики" << endl << "2. Нолики vs Крестики" << endl;
  54.         } else {
  55.             cout << "Выберите сторону:" << endl;
  56.             cout << "1. Нолики" << endl << "2. Крестики" << endl;
  57.         }
  58.  
  59.         cout << "Введите число (1 или 2): ";
  60.         int players_side;
  61.         cin >> players_side;
  62.         // снова будем просить пользователя ввести корректные данные до тех пор пока он не введет 1 или 2
  63.         while (players_side != 1 && players_side != 2) {
  64.             cout << "Некорректное значение." << endl;
  65.             cout << "Введите число (1 или 2): ";
  66.             cin >> players_side;
  67.         }
  68.         // следующая функция позволяет сделать рандом разным от запуска к запуску
  69.         srand(time(0));
  70.  
  71.         // далее определи кто ходит первый
  72.         int who_walks = rand() % 2;
  73.  
  74.         //Если наше значение who_walks равно нулю, то первый игрок ходит первый. В слечае
  75.         // когда человек играет против компьютера первым игроком является компьютер
  76.         // Далее, если у нас режим игрок против компьютера, мы выводим, что первым ходит компьютер
  77.         // если же режим человек против чедловека, то выводим что начинает первый игрок
  78.  
  79.         // Далее переменная who_walks сигнализирует о том, кто ходит в данный момент
  80.         if (who_walks == 0) {
  81.             if (game_mode == 1) {
  82.                 cout << endl << "Начинает первый игрок." << endl << endl;
  83.             } else {
  84.                 cout << endl << "Начинает компьютер." << endl << endl;
  85.             }
  86.         } else {
  87.             if (game_mode == 1) {
  88.                 cout << endl << "Начинает второй игрок." << endl << endl;
  89.             } else {
  90.                 cout << endl << "Начинает игрок." << endl << endl;
  91.             }
  92.  
  93.         }
  94.  
  95.         //  Информация о том как ходить
  96.         cout << "Для того, чтобы ходить, нужно ввести одно двузначное число, каждая цифра которого" << endl;
  97.         cout << "означает координаты клетки (первая цифра - строку, вторая - столбец)" << endl;
  98.         cout << "Вот координаты каждой клетки:" << endl;
  99.         cout << "11|12|13" << endl;
  100.         cout << "21|22|23" << endl;
  101.         cout << "31|32|33" << endl;
  102.  
  103.         // функция, которая равна false до тех пор, пока либо не закончатся
  104.         // пустые клетки, либо кто-то из игроков не выиграет
  105.         bool end_round = false;
  106.  
  107.         while (!end_round) {
  108.  
  109.             // далее мы выводим информацию о том кто ходит
  110.             if (who_walks == 0) {
  111.                 if (game_mode == 1) {
  112.                     cout << endl << "Ход первого игрока:";
  113.                 } else {
  114.                     cout << endl << "Ход компьютера:";
  115.                 }
  116.             } else {
  117.                 if (game_mode == 1) {
  118.                     cout << endl << "Ход второго игрока:";
  119.                 } else {
  120.                     cout << endl << "Ход игрока:";
  121.                 }
  122.             }
  123.             int coordinates;
  124.  
  125.             // номер столбца и номер строки, в которую чейчас ходят
  126.             int column;
  127.             int line;
  128.  
  129.             // если ходит компьютер
  130.  
  131.             // Если game_mode == 2 && who_walks == 0 то сейчас ходит первый игрок и режим игры
  132.             //  компьютер против человека, значит сейчас ходит компьютер
  133.  
  134.             // Теперь посмотрим на количество оставшихся пустых клеток. Упорядочим(в уме) их и в
  135.             // pos присвоим значение от 1 до umber_of_free_cells. Будем идти подряд и рисваивать переменным line и column
  136.             // знаение нынешней пустой клетки а так же убавлять значение pos , кода будем встречать пустую
  137.             // клетку, до тех пор пока оно(pos) не станет нулём.
  138.             if (game_mode == 2 && who_walks == 0) {
  139.                 int pos;
  140.                 if (number_of_free_cells != 1) {
  141.                     pos = rand() % number_of_free_cells;
  142.                 } else {
  143.                     pos = 1;
  144.                 }
  145.                 if (pos == 0) {
  146.                     pos = number_of_free_cells;
  147.                 }
  148.  
  149.                 for (int i = 0; i < 3; ++i)
  150.                     for (int j = 0; j < 3; ++j)
  151.                         if (playing_field[i][j] == '_' && pos > 0) {
  152.                             column = j + 1;
  153.                             line = i + 1;
  154.                             --pos;
  155.                         }
  156.                 cout << line << column << endl;
  157.             } else {
  158.  
  159.                 // в этом случае ходит человек
  160.                 // считаем корерктные данные
  161.                 cin >> coordinates;
  162.                 column = coordinates % 10;
  163.                 line = coordinates / 10;
  164.  
  165.                 // Пока пользователь не введет корректные данные
  166.                 while (column > 3 || column < 1 || line > 3 || line < 1 ||
  167.                        playing_field[line - 1][column - 1] != '_') {
  168.  
  169.                     cout << "Некорректное значение." << endl;
  170.                     if (who_walks == 0) {
  171.                         cout << endl << "Ход первого игрока:";
  172.                     } else {
  173.                         if (game_mode == 1) {
  174.                             cout << endl << "Ход второго игрока:";
  175.                         } else {
  176.                             cout << endl << "Ход игрока:";
  177.                         }
  178.                     }
  179.                     cin >> coordinates;
  180.  
  181.                     column = coordinates % 10;
  182.                     line = coordinates / 10;
  183.                 }
  184.             }
  185.  
  186.             // убавим количество пустых клеток на 1
  187.             number_of_free_cells -= 1;
  188.  
  189.             //  в зависимости от того чей ход и в каком режиме присвоим клетке значение Х или 0
  190.             if (who_walks == 0) {
  191.                 if (players_side == 1) {
  192.                     playing_field[line - 1][column - 1] = 'X';
  193.                 } else {
  194.                     playing_field[line - 1][column - 1] = '0';
  195.                 }
  196.             } else {
  197.                 if (players_side == 1) {
  198.                     playing_field[line - 1][column - 1] = '0';
  199.                 } else {
  200.                     playing_field[line - 1][column - 1] = 'X';
  201.                 }
  202.             }
  203.  
  204.  
  205.             //выведем все поле
  206.             for (int i = 0; i < 3; ++i) {
  207.                 cout << playing_field[i][0] << '|' << playing_field[i][1] << '|' << playing_field[i][2] << endl;
  208.             }
  209.  
  210.             // теперь изменим игрока, который будет ходить в следующий ход
  211.             if (who_walks == 1) {
  212.                 who_walks = 0;
  213.             } else {
  214.                 who_walks = 1;
  215.             }
  216.  
  217.             // теперь нам нужно проверить, вдруг кто-то заполнил линию своим символом для этого пробежимся по массиву line
  218.             // и будем извлекать координаты клеток и сравнивать все три клетки, если они равны, то присвоим переменной
  219.             // которая отвечает за конец раунда (end_round) значение true, для того чтобы раунл закончился и выведем на
  220.             // экран победителя
  221.             for (int i = 0; i < 8; ++i) {
  222.                 // координаты трех клеток
  223.                 int x1 = lines[i][0] / 10, y1 = lines[i][0] % 10;
  224.                 int x2 = lines[i][1] / 10, y2 = lines[i][1] % 10;
  225.                 int x3 = lines[i][2] / 10, y3 = lines[i][2] % 10;
  226.  
  227.                 // проверка трехклеток на равенство
  228.                 if (playing_field[x1][y1] == playing_field[x2][y2] &&
  229.                     playing_field[x1][y1] == playing_field[x3][y3] &&
  230.                     playing_field[x1][y1] != '_') {
  231.                     end_round = true;
  232.                     if ((playing_field[x1][y1] == 'X' && players_side == 1) ||
  233.                         (playing_field[x1][y1] == '0' && players_side == 2)) {
  234.                         if (game_mode == 1) {
  235.                             cout << "Первый игрок победил!" << endl;
  236.                         } else {
  237.                             cout << "Победил компьютер!" << endl;
  238.                         }
  239.                     } else {
  240.                         if (game_mode == 1) {
  241.                             cout << "Второй игрок победил!" << endl;
  242.                         } else {
  243.                             cout << "Победил игрок!" << endl;
  244.                         }
  245.                     }
  246.                 }
  247.  
  248.                 // если количество пустых клеток закончилось, и никто не выиграл (если бы кто-то выиграл, мы бы не присвоили
  249.                 // переменной end_round значение true)
  250.                 if (number_of_free_cells == 0 && !end_round) {
  251.                     end_round = true;
  252.                     cout << "Ничья!" << endl;
  253.                 }
  254.  
  255.  
  256.             }
  257.  
  258.         }
  259.  
  260.         // Теперь спросим у пользователя, не хочет ли он начать игру занова, если нет,
  261.         // то присвоим переменной end_game значение true, чтобы программа завершила работу
  262.         cout << "Начать заново?" << endl;
  263.         cout << "1. Да" << endl << "2. Нет" << endl;
  264.         cout << "Введите число (1 или 2): ";
  265.         int continue_game;
  266.         cin >> continue_game;
  267.         while (continue_game != 1 && continue_game != 2) {
  268.             cout << "Некорректное значение." << endl;
  269.             cout << "Введите число (1 или 2): ";
  270.             cin >> continue_game;
  271.         }
  272.         // присваиваем переменной end_game значение true
  273.         if (continue_game == 2) {
  274.             end_game = true;
  275.         }
  276.     }
  277.  
  278.     return 0;
  279. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement