Advertisement
Risonna

KrestikiNoliki

Apr 12th, 2020
271
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 16.04 KB | None | 0 0
  1. #include <ctime>
  2. #include <iostream>
  3. #include <windows.h>
  4. #include <string>
  5. #include "stdio.h"
  6.  
  7.  
  8. using namespace std;
  9.  
  10. int main()
  11. {
  12.     setlocale(LC_ALL, "ru");
  13.     int** m;
  14.     char** a, ** c;
  15.     int* z, * f;
  16.     int rows, cols;//строки, столбцы
  17.  
  18.     rows = cols = 3;//строки = столбцы
  19.     printf("Игра в %dx%d:", rows, cols);
  20.     HANDLE line = GetStdHandle(STD_OUTPUT_HANDLE);
  21.     SetConsoleTextAttribute(line, FOREGROUND_RED);
  22.     cout << "\n-----------------------------------------------------------------------\n";
  23.     SetConsoleTextAttribute(line, FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_BLUE);
  24.  
  25.     m = new int* [rows];//Создаём динамический массив указателей размером количества СТРОК
  26.     a = new char* [rows];
  27.     c = new char* [rows];
  28.     z = new int[9];
  29.     f = new int[9];
  30.  
  31.  
  32.     for (int i = 0; i < rows; i++)
  33.     {
  34.         m[i] = new int[cols];//Присваиваем элементам указателей новые динамические массивы размером количества СТОЛБЦОВ
  35.     }
  36.  
  37.     int n = 0;//Позиция
  38.     for (int i = 0; i < rows; i++)//Заполняем двумерный динамический массив числами
  39.     {
  40.         for (int j = 0; j < cols; j++)
  41.         {
  42.             m[i][j] = ++n;//Ограничиваем значение до 10
  43.         }
  44.     }
  45.  
  46.     /////////////////////////////// CHAR a /////////////////////////////
  47.     for (int i = 0; i < rows; i++)
  48.     {
  49.         a[i] = new char[cols];//Присваиваем элементам указателей новые динамические массивы размером количества СТОЛБЦОВ
  50.     }
  51.  
  52.     for (int i = 0; i < rows; i++)//Заполняем двумерный динамический массив
  53.     {
  54.         for (int j = 0; j < cols; j++)
  55.         {
  56.             a[i][j] = '*';
  57.         }
  58.     }
  59.     //////////////////////////////// CHAR c ////////////////////////////
  60.     for (int i = 0; i < rows; i++)
  61.     {
  62.         c[i] = new char[cols];//Присваиваем элементам указателей новые динамические массивы размером количества СТОЛБЦОВ
  63.     }
  64.  
  65.     for (int i = 0; i < rows; i++)//Заполняем двумерный динамический массив
  66.     {
  67.         for (int j = 0; j < cols; j++)
  68.         {
  69.             c[i][j] = '*';
  70.         }
  71.     }
  72.  
  73.     ////////////////////////// INT z ///////////////////////////////////
  74.  
  75.     ////////////////////////////////////////////////////////////////////
  76.  
  77.     for (int i = 0; i < rows; i++)//Выводим на экран двумерный динамический массив
  78.     {
  79.         for (int j = 0; j < cols; j++)
  80.         {
  81.             cout << m[i][j] << "\t";
  82.         }
  83.         cout << endl << endl << endl;
  84.     }
  85.  
  86.     //////////////////////////// ИНТЕРАКТИВ /////////////////////////////////
  87.     string name;
  88.     cout << "Введите имя[можно использовать только буквы латинского алфавита и символы]: ";
  89.     cin >> name;
  90.     cout << "Ваше имя: " << name;
  91.     name = "[" + name + "]";
  92.  
  93.     bool game;
  94.     int h;//Номер хода
  95.     string p2;
  96.     p2 = "[КОМПЬЮТЕР]: ";
  97.     game = true;
  98.     h = 2;
  99.     int position;
  100.     int there2;
  101.     int countPL1 = 0;
  102.     int countPL2 = 0;
  103.  
  104.     Sleep(2000);
  105.     system("CLS");
  106.     SetConsoleTextAttribute(line, FOREGROUND_RED);
  107.     cout << "-----------------------------------------------------------------------\n";
  108.     SetConsoleTextAttribute(line, FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_BLUE);
  109.     cout << "Ход: " << 1 << endl;
  110.     SetConsoleTextAttribute(line, FOREGROUND_GREEN);
  111.     cout << name << endl << endl;
  112.     SetConsoleTextAttribute(line, FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_BLUE);
  113.     cout << "Выберите позицию[1 - 9]: ";
  114.     cin >> position;
  115.  
  116.     if (position < 1 || position > 9)//Проверка не выходит ли введённое число за границы [1, 9]
  117.     {
  118.         while (position < 1 || position > 9)
  119.         {
  120.             cout << "Выберите позицию от 1 до 9: ";
  121.             cin >> position;
  122.             cout << endl;
  123.         }
  124.     }
  125.  
  126.     int there;
  127.     for (int i = 0; i < rows; i++)//1 ход игрока
  128.     {
  129.         for (int j = 0; j < cols; j++)
  130.         {
  131.             if (position == m[i][j])
  132.             {
  133.                 a[i][j] = 'X';
  134.                 there = position;//Запоминаем позицию крестика
  135.                 countPL1++;//Считаем количество ходов игрока
  136.                 SetConsoleTextAttribute(line, FOREGROUND_GREEN);
  137.                 cout << a[i][j] << "\t";
  138.                 SetConsoleTextAttribute(line, FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_BLUE);
  139.             }
  140.             else cout << c[i][j] << "\t";
  141.             c[i][j] = a[i][j];
  142.  
  143.         }
  144.         cout << endl << endl << endl;
  145.     }
  146.     SetConsoleTextAttribute(line, FOREGROUND_RED);
  147.     cout << "-----------------------------------------------------------------------\n";
  148.     SetConsoleTextAttribute(line, FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_BLUE);
  149.  
  150.     for (int i = 0; i < 9; i++)//Запоминаем позиции крестика
  151.     {
  152.         if ((i + 1) == there) z[i] = there;
  153.     }
  154.  
  155.     ///////////////////////////////// ИГРОВАЯ ЛОГИКА /////////////////////////////////////////
  156.     while (game == true)
  157.     {
  158.         SetConsoleTextAttribute(line, FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_BLUE);
  159.         cout << "\nХод: " << h << endl;
  160.  
  161.         if (h % 2 != 0)//Ход игрока
  162.         {
  163.             SetConsoleTextAttribute(line, FOREGROUND_GREEN);
  164.             cout << name << endl << endl;
  165.             SetConsoleTextAttribute(line, FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_BLUE);
  166.             cout << "Выберите позицию[1 - 9]: ";
  167.             cin >> position;
  168.  
  169.             for (int i = 0; i < 9; i++)//Проверяем введённую позицию на наличие свободного места и на границы
  170.             {
  171.                 if (position < 1 || position > 9 || position == z[i] || position == f[i])
  172.                 {
  173.                     while (position < 1 || position > 9 || position == z[i] || position == f[i])
  174.                     {
  175.                         SetConsoleTextAttribute(line, FOREGROUND_RED);
  176.                         cout << "Это место занято или находится за пределами отрезка [1, 9]." << endl;
  177.                         cout << "Выберите новое место: ";
  178.                         SetConsoleTextAttribute(line, FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_BLUE);
  179.                         cin >> position;
  180.                         i = position - 1;//Приравниваем индекс к значению элемента массива. Например, i = 3, то m[i-1] = 3. Т.к. 1й элемент = 0.  
  181.                     }
  182.                 }
  183.             }
  184.  
  185.             for (int i = 0; i < rows; i++)//Размещаем крестик
  186.             {
  187.                 for (int j = 0; j < cols; j++)
  188.                 {
  189.                     if (position == m[i][j])
  190.                     {
  191.                         a[i][j] = 'X';
  192.                         there = position;//Запоминаем позицию крестика
  193.                         countPL1++;
  194.                         SetConsoleTextAttribute(line, FOREGROUND_GREEN);
  195.                         cout << a[i][j] << "\t";
  196.                         SetConsoleTextAttribute(line, FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_BLUE);
  197.                     }
  198.                     else if (c[i][j] == 'X')
  199.                     {
  200.                         SetConsoleTextAttribute(line, FOREGROUND_GREEN);
  201.                         cout << c[i][j] << "\t";
  202.                         SetConsoleTextAttribute(line, FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_BLUE);
  203.                     }
  204.                     else if (c[i][j] == 'O')
  205.                     {
  206.                         SetConsoleTextAttribute(line, FOREGROUND_BLUE);
  207.                         cout << c[i][j] << "\t";
  208.                         SetConsoleTextAttribute(line, FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_BLUE);
  209.                     }
  210.                     else cout << c[i][j] << "\t";
  211.                     c[i][j] = a[i][j];
  212.                 }
  213.                 cout << endl << endl << endl;
  214.             }
  215.  
  216.             SetConsoleTextAttribute(line, FOREGROUND_RED);
  217.             cout << "-----------------------------------------------------------------------\n";
  218.             SetConsoleTextAttribute(line, FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_BLUE);
  219.  
  220.             for (int i = 0; i < 9; i++)//Запоминаем позиции крестика
  221.             {
  222.                 if ((i + 1) == there) z[i] = there;
  223.             }
  224.  
  225.             SetConsoleTextAttribute(line, FOREGROUND_GREEN);
  226.             if (a[0][0] == 'X' && a[1][0] == 'X' && a[2][0] == 'X')//Левая граница поля
  227.             {
  228.                 cout << "ПОБЕДА " << name << "!" << endl;
  229.                 SetConsoleTextAttribute(line, FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_BLUE);
  230.                 break;
  231.             }
  232.             else if (a[0][0] == 'X' && a[0][1] == 'X' && a[0][2] == 'X')//Верхняя граница поля
  233.             {
  234.                 cout << "ПОБЕДА " << name << "!" << endl;
  235.                 SetConsoleTextAttribute(line, FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_BLUE);
  236.                 break;
  237.             }
  238.             else if (a[0][2] == 'X' && a[1][2] == 'X' && a[2][2] == 'X')//Правая граница поля
  239.             {
  240.                 cout << "ПОБЕДА " << name << "!" << endl;
  241.                 SetConsoleTextAttribute(line, FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_BLUE);
  242.                 break;
  243.             }
  244.             else if (a[2][0] == 'X' && a[2][1] == 'X' && a[2][2] == 'X')//Нижняя граница поля
  245.             {
  246.                 cout << "ПОБЕДА " << name << "!" << endl;
  247.                 SetConsoleTextAttribute(line, FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_BLUE);
  248.                 break;
  249.             }
  250.             else if (a[0][1] == 'X' && a[1][1] == 'X' && a[2][1] == 'X')//Вертикаль
  251.             {
  252.                 cout << "ПОБЕДА " << name << "!" << endl;
  253.                 SetConsoleTextAttribute(line, FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_BLUE);
  254.                 break;
  255.             }
  256.             else if (a[1][0] == 'X' && a[1][1] == 'X' && a[1][2] == 'X')//Горизонталь
  257.             {
  258.                 cout << "ПОБЕДА " << name << "!" << endl;
  259.                 SetConsoleTextAttribute(line, FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_BLUE);
  260.                 break;
  261.             }
  262.             else if (a[0][0] == 'X' && a[1][1] == 'X' && a[2][2] == 'X')//Нисходящая диагональ
  263.             {
  264.                 cout << "ПОБЕДА " << name << "!" << endl;
  265.                 SetConsoleTextAttribute(line, FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_BLUE);
  266.                 break;
  267.             }
  268.             else if (a[2][0] == 'X' && a[1][1] == 'X' && a[0][2] == 'X')//Восходящая диагональ
  269.             {
  270.                 cout << "ПОБЕДА " << name << "!" << endl;
  271.                 SetConsoleTextAttribute(line, FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_BLUE);
  272.                 break;
  273.             }
  274.  
  275.  
  276.             int star = 0;
  277.             for (int i = 0; i < rows; i++)//Проверка на наличие свободного места
  278.             {
  279.                 for (int j = 0; j < cols; j++)
  280.                 {
  281.                     if (a[i][j] != '*') star++;
  282.                 }
  283.             }
  284.  
  285.             if (star == 9)
  286.             {
  287.                 SetConsoleTextAttribute(line, FOREGROUND_RED);
  288.                 cout << "Не осталось свободного места! " << endl;
  289.                 SetConsoleTextAttribute(line, FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_BLUE);
  290.                 break;
  291.             }
  292.  
  293.         }
  294.  
  295.         ////////////////////////////// ИИ //////////////////////////////////////////////////  
  296.  
  297.         bool flag = false;
  298.         if (h % 2 == 0)//Ход ИИ
  299.         {
  300.             SetConsoleTextAttribute(line, FOREGROUND_BLUE);
  301.             cout << p2 << endl;
  302.             SetConsoleTextAttribute(line, FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_BLUE);
  303.             for (int i = 0; i < rows; i++)
  304.             {
  305.                 for (int j = 0; j < cols; j++)
  306.                 {
  307.                     if (a[i][j] != 'X' && a[i][j] != 'O' && flag == false)
  308.                     {
  309.                         a[i][j] = 'O';
  310.                         there2 = m[i][j];//Запоминаем позицию нолика
  311.                         countPL2++;//Считаем количество ходов ИИ
  312.                         SetConsoleTextAttribute(line, FOREGROUND_BLUE);
  313.                         cout << a[i][j] << "\t";
  314.                         SetConsoleTextAttribute(line, FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_BLUE);
  315.                         flag = true;//Оператор if выполняется один раз
  316.                     }
  317.                     else if (c[i][j] == 'X')
  318.                     {
  319.                         SetConsoleTextAttribute(line, FOREGROUND_GREEN);
  320.                         cout << c[i][j] << "\t";
  321.                         SetConsoleTextAttribute(line, FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_BLUE);
  322.                     }
  323.                     else if (c[i][j] == 'O')
  324.                     {
  325.                         SetConsoleTextAttribute(line, FOREGROUND_BLUE);
  326.                         cout << c[i][j] << "\t";
  327.                         SetConsoleTextAttribute(line, FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_BLUE);
  328.                     }
  329.                     else cout << c[i][j] << "\t";
  330.                     c[i][j] = a[i][j];
  331.                 }
  332.                 cout << endl << endl << endl;
  333.             }
  334.  
  335.             SetConsoleTextAttribute(line, FOREGROUND_RED);
  336.             cout << "-----------------------------------------------------------------------\n";
  337.             SetConsoleTextAttribute(line, FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_BLUE);
  338.  
  339.             for (int i = 0; i < 9; i++)//Запоминаем позиции нолика
  340.             {
  341.                 if ((i + 1) == there2) f[i] = there2;
  342.             }
  343.         }
  344.  
  345.         SetConsoleTextAttribute(line, FOREGROUND_BLUE);
  346.         if (a[0][0] == 'O' && a[1][0] == 'O' && a[2][0] == 'O')//Левая граница поля
  347.         {
  348.             cout << "ПОБЕДА КОМПЬЮТЕРА!" << endl;
  349.             SetConsoleTextAttribute(line, FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_BLUE);
  350.             break;
  351.         }
  352.         else if (a[0][0] == 'O' && a[0][1] == 'O' && a[0][2] == 'O')//Верхняя граница поля
  353.         {
  354.             cout << "ПОБЕДА КОМПЬЮТЕРА!" << endl;
  355.             SetConsoleTextAttribute(line, FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_BLUE);
  356.             break;
  357.         }
  358.         else if (a[0][2] == 'O' && a[1][2] == 'O' && a[2][2] == 'O')//Правая граница поля
  359.         {
  360.             cout << "ПОБЕДА КОМПЬЮТЕРА!" << endl;
  361.             SetConsoleTextAttribute(line, FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_BLUE);
  362.             break;
  363.         }
  364.         else if (a[2][0] == 'O' && a[2][1] == 'O' && a[2][2] == 'O')//Нижняя граница поля
  365.         {
  366.             cout << "ПОБЕДА КОМПЬЮТЕРА!" << endl;
  367.             SetConsoleTextAttribute(line, FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_BLUE);
  368.             break;
  369.         }
  370.         else if (a[0][1] == 'O' && a[1][1] == 'O' && a[2][1] == 'O')//Вертикаль
  371.         {
  372.             cout << "ПОБЕДА КОМПЬЮТЕРА!" << endl;
  373.             SetConsoleTextAttribute(line, FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_BLUE);
  374.             break;
  375.         }
  376.         else if (a[1][0] == 'O' && a[1][1] == 'O' && a[1][2] == 'O')//Горизонталь
  377.         {
  378.             cout << "ПОБЕДА КОМПЬЮТЕРА!" << endl;
  379.             SetConsoleTextAttribute(line, FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_BLUE);
  380.             break;
  381.         }
  382.         else if (a[0][0] == 'O' && a[1][1] == 'O' && a[2][2] == 'O')//Нисходящая диагональ
  383.         {
  384.             cout << "ПОБЕДА КОМПЬЮТЕРА!" << endl;
  385.             SetConsoleTextAttribute(line, FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_BLUE);
  386.             break;
  387.         }
  388.         else if (a[2][0] == 'O' && a[1][1] == 'O' && a[0][2] == 'O')//Восходящая диагональ
  389.         {
  390.             cout << "ПОБЕДА КОМПЬЮТЕРА!" << endl;
  391.             SetConsoleTextAttribute(line, FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_BLUE);
  392.             break;
  393.         }
  394.  
  395.         int star = 0;
  396.         for (int i = 0; i < rows; i++)//Проверка на наличие свободного места
  397.         {
  398.             for (int j = 0; j < cols; j++)
  399.             {
  400.                 if (a[i][j] != '*') star++;
  401.             }
  402.         }
  403.  
  404.         if (star == 9)
  405.         {
  406.             SetConsoleTextAttribute(line, FOREGROUND_RED);
  407.             cout << "Не осталось свободного места! " << endl;
  408.             SetConsoleTextAttribute(line, FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_BLUE);
  409.             break;
  410.         }
  411.         h++;//Ход + 1
  412.     }
  413.  
  414.     cout << "Количество ходов: " << h << endl;
  415.     cout << endl;
  416.     SetConsoleTextAttribute(line, FOREGROUND_BLUE);
  417.     cout << "[ИИ]: ";
  418.     SetConsoleTextAttribute(line, FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_BLUE);
  419.     cout << countPL2;
  420.     cout << " | ";
  421.     SetConsoleTextAttribute(line, FOREGROUND_GREEN);
  422.     cout << name;
  423.     SetConsoleTextAttribute(line, FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_BLUE);
  424.     cout << ": ";
  425.     cout << countPL1 << endl;
  426.  
  427.     for (int i = 0; i < rows; i++)//Удаление динамических массивов
  428.     {
  429.         delete[] m[i];
  430.     }
  431.     for (int i = 0; i < rows; i++)//Удаление динамических массивов
  432.     {
  433.         delete[] a[i];
  434.     }
  435.     for (int i = 0; i < rows; i++)//Удаление динамических массивов
  436.     {
  437.         delete[] c[i];
  438.     }
  439.     delete[] m;//Удаление *динамического массива с указателями* на *динамические массивы*
  440.     delete[] a;//Удаление *динамического массива с указателями* на *динамические массивы*
  441.     delete[] c;//Удаление *динамического массива с указателями* на *динамические массивы*
  442.     delete[] z;
  443.     delete[] f;
  444. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement