Advertisement
Ansaid

XO

Aug 10th, 2019
190
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 29.16 KB | None | 0 0
  1. #include "pch.h"
  2. #include <iostream>
  3. #include <string>
  4. #include <conio.h>
  5. #include <Windows.h>
  6. #include <ctime>
  7.  
  8. using namespace std;
  9.  
  10. class Data //хранит инфо о состянии клеточек
  11. {
  12. protected:
  13.     char arr[3][3];
  14.  
  15. public:
  16.  
  17.     Data() // конструктор
  18.     {
  19.         for (int i = 0; i < 3; i++)
  20.             for (int j = 0; j < 3; j++)
  21.                 arr[i][j] = ' ';
  22.     }
  23.  
  24.     char get_info(int i, int j) // возвращает состояние клетки
  25.     {
  26.         return arr[i][j];
  27.     }
  28.  
  29.     void zeroing()
  30.     {
  31.         for (int i = 0; i < 3; i++)
  32.             for (int j = 0; j < 3; j++)
  33.                 arr[i][j] = ' ';
  34.     }
  35.  
  36.     void Enter_X() // фунция для ввода
  37.     {
  38.         bool complete = false;
  39.  
  40.         while (!complete)
  41.         {
  42.             switch (_getch()) // возвращает нажатую клавишу
  43.             {
  44.             case '1':
  45.                 if (arr[0][0] == ' ')
  46.                 {
  47.                     arr[0][0] = 'X';
  48.                     complete = true;
  49.                 }
  50.                 break;
  51.             case '2':
  52.                 if (arr[0][1] == ' ')
  53.                 {
  54.                     arr[0][1] = 'X';
  55.                     complete = true;
  56.                 }
  57.                 break;
  58.             case '3':
  59.                 if (arr[0][2] == ' ')
  60.                 {
  61.                     arr[0][2] = 'X';
  62.                     complete = true;
  63.                 }
  64.                 break;
  65.             case '4':
  66.                 if (arr[1][0] == ' ')
  67.                 {
  68.                     arr[1][0] = 'X';
  69.                     complete = true;
  70.                 }
  71.                 break;
  72.             case '5':
  73.                 if (arr[1][1] == ' ')
  74.                 {
  75.                     arr[1][1] = 'X';
  76.                     complete = true;
  77.                 }
  78.                 break;
  79.             case '6':
  80.                 if (arr[1][2] == ' ')
  81.                 {
  82.                     arr[1][2] = 'X';
  83.                     complete = true;
  84.                 }
  85.                 break;
  86.             case '7':
  87.                 if (arr[2][0] == ' ')
  88.                 {
  89.                     arr[2][0] = 'X';
  90.                     complete = true;
  91.                 }
  92.                 break;
  93.             case '8':
  94.                 if (arr[2][1] == ' ')
  95.                 {
  96.                     arr[2][1] = 'X';
  97.                     complete = true;
  98.                 }
  99.                 break;
  100.             case '9':
  101.                 if (arr[2][2] == ' ')
  102.                 {
  103.                     arr[2][2] = 'X';
  104.                     complete = true;
  105.                 }
  106.                 break;
  107.             default:
  108.                 break;
  109.             }
  110.         }
  111.     }
  112.  
  113.     void Enter_O() // фунция для ввода
  114.     {
  115.         bool complete = false;
  116.  
  117.         while (!complete)
  118.         {
  119.             switch (_getch()) // возвращает нажатую клавишу
  120.             {
  121.             case '1':
  122.                 if (arr[0][0] == ' ')
  123.                 {
  124.                     arr[0][0] = 'O';
  125.                     complete = true;
  126.                 }
  127.                 break;
  128.             case '2':
  129.                 if (arr[0][1] == ' ')
  130.                 {
  131.                     arr[0][1] = 'O';
  132.                     complete = true;
  133.                 }
  134.                 break;
  135.             case '3':
  136.                 if (arr[0][2] == ' ')
  137.                 {
  138.                     arr[0][2] = 'O';
  139.                     complete = true;
  140.                 }
  141.                 break;
  142.             case '4':
  143.                 if (arr[1][0] == ' ')
  144.                 {
  145.                     arr[1][0] = 'O';
  146.                     complete = true;
  147.                 }
  148.                 break;
  149.             case '5':
  150.                 if (arr[1][1] == ' ')
  151.                 {
  152.                     arr[1][1] = 'O';
  153.                     complete = true;
  154.                 }
  155.                 break;
  156.             case '6':
  157.                 if (arr[1][2] == ' ')
  158.                 {
  159.                     arr[1][2] = 'O';
  160.                     complete = true;
  161.                 }
  162.                 break;
  163.             case '7':
  164.                 if (arr[2][0] == ' ')
  165.                 {
  166.                     arr[2][0] = 'O';
  167.                     complete = true;
  168.                 }
  169.                 break;
  170.             case '8':
  171.                 if (arr[2][1] == ' ')
  172.                 {
  173.                     arr[2][1] = 'O';
  174.                     complete = true;
  175.                 }
  176.                 break;
  177.             case '9':
  178.                 if (arr[2][2] == ' ')
  179.                 {
  180.                     arr[2][2] = 'O';
  181.                     complete = true;
  182.                 }
  183.                 break;
  184.             default:
  185.                 break;
  186.             }
  187.         }
  188.     }
  189. };
  190.  
  191. class Logic : public Data // логика
  192. {
  193. public:
  194.  
  195.     void move_O() // делает рандомный ход ноликом
  196.     {
  197.         srand(time(NULL));
  198.         int i, j;
  199.         bool complete = false;
  200.         while (!complete)
  201.         {
  202.             i = rand() % 3;
  203.             j = rand() % 3;
  204.  
  205.             if (arr[i][j] == ' ')
  206.             {
  207.                 arr[i][j] = 'O';
  208.                 complete = true;
  209.             }
  210.         }
  211.     }
  212.  
  213.     void move_X() // делает рандомный ход крестиком
  214.     {
  215.         srand(time(NULL));
  216.         int i, j;
  217.         bool complete = false;
  218.         while (!complete)
  219.         {
  220.             i = rand() % 3;
  221.             j = rand() % 3;
  222.  
  223.             if (arr[i][j] == ' ')
  224.             {
  225.                 arr[i][j] = 'X';
  226.                 complete = true;
  227.             }
  228.         }
  229.     }
  230.  
  231.     bool full(char *result)
  232.     {
  233.  
  234.         for (int i = 0; i < 3; i++)
  235.             for (int j = 0; j < 3; j++)
  236.                 if (arr[i][j] == ' ')
  237.                     return false;
  238.         *result = 'N';
  239.  
  240.         return true;
  241.     }
  242.  
  243.     bool win(char *result)
  244.     {
  245.         bool complete = false;
  246.  
  247.         if (arr[0][0] == arr[0][1] && arr[0][1] == arr[0][2] && arr[0][0] != ' ')
  248.         {
  249.             complete = true;
  250.             *result = arr[0][0];
  251.         }
  252.         if (arr[1][0] == arr[1][1] && arr[1][1] == arr[1][2] && arr[1][0] != ' ')
  253.         {
  254.             complete = true;
  255.             *result = arr[1][0];
  256.         }
  257.         if (arr[2][0] == arr[2][1] && arr[2][1] == arr[2][2] && arr[2][0] != ' ')
  258.         {
  259.             complete = true;
  260.             *result = arr[2][0];
  261.         }
  262.         if (arr[0][0] == arr[1][0] && arr[1][0] == arr[2][0] && arr[0][0] != ' ')
  263.         {
  264.             complete = true;
  265.             *result = arr[0][0];
  266.         }
  267.         if (arr[0][1] == arr[1][1] && arr[1][1] == arr[2][1] && arr[0][1] != ' ')
  268.         {
  269.             complete = true;
  270.             *result = arr[0][1];
  271.         }
  272.         if (arr[0][2] == arr[1][2] && arr[1][2] == arr[2][2] && arr[0][2] != ' ')
  273.         {
  274.             complete = true;
  275.             *result = arr[0][2];
  276.         }
  277.  
  278.         if (arr[0][0] == arr[1][1] && arr[1][1] == arr[2][2] && arr[0][0] != ' ')
  279.         {
  280.             complete = true;
  281.             *result = arr[0][0];
  282.         }
  283.         if (arr[0][2] == arr[1][1] && arr[1][1] == arr[2][0] && arr[0][2] != ' ')
  284.         {
  285.             complete = true;
  286.             *result = arr[0][2];
  287.         }
  288.        
  289.         return complete;
  290.     }
  291.  
  292.     int attack_O()
  293.     {
  294.         int bufer_i = -1, bufer_j = -1; // для хранения соседнего элемента
  295.         for (int i = 0; i < 3; i++) // ищем O
  296.         {
  297.             for (int j = 0; j < 3; j++)
  298.             {
  299.                 if (arr[i][j] == 'O')
  300.                 {
  301.  
  302.                     if (!(i == 1 && j == 1) && arr[1][1] == 'O') //если не в центре, но есть центральный элемент, по переводим на ситуацию "центр"
  303.                         goto center;
  304.  
  305.                     if (i == 1 && j == 1) // если он в центре то ищем "Соседа", пропуская центр
  306.                     {
  307.                     center:
  308.                         for (int q = 0; q < 3; q++)
  309.                         {
  310.                             for (int p = 0; p < 3; p++)
  311.                             {
  312.                                 if (!(q == 1 && p == 1) && arr[q][p] == 'O')
  313.                                 {
  314.                                     bufer_i = q; //запоминаем индексы "Соседа"
  315.                                     bufer_j = p;
  316.  
  317.                                     bufer_i = 1 - bufer_i; //находим "шаг"
  318.                                     bufer_j = 1 - bufer_j;
  319.                                     bufer_i = 1 + bufer_i; //находим индексы "недостоющей до тройки" ячейки
  320.                                     bufer_j = 1 + bufer_j;
  321.                                     if (arr[bufer_i][bufer_j] == ' ')//если эта ячейка пустая, то запоняем
  322.                                     {
  323.                                         arr[bufer_i][bufer_j] = 'O';
  324.                                         return 1;
  325.                                     }
  326.                                 }
  327.                             }
  328.                         }
  329.                     }
  330.  
  331.                     if (i != 1 && j != 1 && arr[i][j] == 'O') //если Х в углу, то ищем пару
  332.                     {
  333.                         int count = 0; //cчетчик кол-ва угловых элементов
  334.  
  335.                         for (int q = 0; q < 3; q += 2) //считаем кол-во угловых элементов
  336.                             for (int p = 0; p < 3; p += 2)
  337.                                 if (arr[q][p] == 'O')
  338.                                     count++;
  339.  
  340.                         if (count > 1) // если элементов 2 и больше, то ищем пары
  341.                         {
  342.                             if ((arr[0][0] == 'O' && arr[2][2] == 'O') || (arr[0][2] == 'O' && arr[2][0] == 'O')) //если пара диагональна
  343.                             {
  344.                                 if (arr[1][1] == ' ') // и центр свободен, то ставим в центр
  345.                                 {
  346.                                     arr[1][1] = 'O';
  347.                                     return 1;
  348.                                 }
  349.                             }
  350.  
  351.                             //4 варианта соседих углов
  352.                             // если есть пара и элемент между ними свободен, то делаем этот ход
  353.                             if (arr[0][0] == 'O' && arr[0][2] == 'O' && arr[0][1] == ' ')
  354.                             {
  355.                                 arr[0][1] = 'O';
  356.                                 return 1;
  357.                             }
  358.                             if (arr[0][0] == 'O' && arr[2][0] == 'O' && arr[1][0] == ' ')
  359.                             {
  360.                                 arr[1][0] = 'O';
  361.                                 return 1;
  362.                             }
  363.                             if (arr[2][0] == 'O' && arr[2][2] == 'O' && arr[2][1] == ' ')
  364.                             {
  365.                                 arr[2][1] = 'O';
  366.                                 return 1;
  367.                             }
  368.                             if (arr[0][2] == 'O' && arr[2][2] == 'O' && arr[1][2] == ' ')
  369.                             {
  370.                                 arr[1][2] = 'O';
  371.                                 return 1;
  372.                             }
  373.                         }
  374.                     }
  375.  
  376.                     if ((arr[1][0] == 'O' && arr[1][2] == 'O') || (arr[0][1] == 'O' && arr[2][1] == 'O')) //если пара противоположная
  377.                     {
  378.                         if (arr[1][1] == ' ') // и центр свободен, то ставим в центр
  379.                         {
  380.                             arr[1][1] = 'O';
  381.                             return 1;
  382.                         }
  383.                     }
  384.  
  385.                     //8 ситуаций на соседние элементы
  386.                     if (arr[0][0] == 'O' && arr[0][1] == 'O' &&  arr[0][2] == ' ')
  387.                     {
  388.                         arr[0][2] = 'O';
  389.                         return 1;
  390.                     }
  391.                     if (arr[0][1] == 'O' && arr[0][2] == 'O' &&  arr[0][0] == ' ')
  392.                     {
  393.                         arr[0][0] = 'O';
  394.                         return 1;
  395.                     }
  396.                     if (arr[0][2] == 'O' && arr[1][2] == 'O' &&  arr[2][2] == ' ')
  397.                     {
  398.                         arr[2][2] = 'O';
  399.                         return 1;
  400.                     }
  401.                     if (arr[1][2] == 'O' && arr[2][2] == 'O' &&  arr[0][2] == ' ')
  402.                     {
  403.                         arr[0][2] = 'O';
  404.                         return 1;
  405.                     }
  406.                     if (arr[2][2] == 'O' && arr[2][1] == 'O' &&  arr[2][0] == ' ')
  407.                     {
  408.                         arr[2][0] = 'O';
  409.                         return 1;
  410.                     }
  411.                     if (arr[2][0] == 'O' && arr[2][1] == 'O' &&  arr[2][2] == ' ')
  412.                     {
  413.                         arr[2][2] = 'O';
  414.                         return 1;
  415.                     }
  416.                     if (arr[0][0] == 'O' && arr[1][0] == 'O' &&  arr[2][0] == ' ')
  417.                     {
  418.                         arr[2][0] = 'O';
  419.                         return 1;
  420.                     }
  421.                     if (arr[1][0] == 'O' && arr[2][0] == 'O' &&  arr[0][0] == ' ')
  422.                     {
  423.                         arr[0][0] = 'O';
  424.                         return 1;
  425.                     }
  426.  
  427.                     return 2;
  428.                 }
  429.             }
  430.         }
  431.         return 2;
  432.     }
  433.  
  434.     int defense_O()
  435.     {
  436.         int bufer_i = -1, bufer_j = -1; // для хранения соседнего элемента
  437.         for (int i = 0; i < 3; i++) // ищем Х
  438.         {
  439.             for (int j = 0; j < 3; j++)
  440.             {
  441.                 if (arr[i][j] == 'X')
  442.                 {
  443.  
  444.                     if (!(i == 1 && j == 1) && arr[1][1] == 'X') //если не в центре, но есть центральный элемент, по переводим на ситуацию "центр"
  445.                         goto center;
  446.  
  447.                     if (i == 1 && j == 1) // если он в центре то ищем "Соседа", пропуская центр
  448.                     {
  449.                         center:
  450.                         for (int q = 0; q < 3; q++)
  451.                         {
  452.                             for (int p = 0; p < 3; p++)
  453.                             {
  454.                                 if (!(q == 1 && p == 1) && arr[q][p] == 'X')
  455.                                 {
  456.                                     bufer_i = q; //запоминаем индексы "Соседа"
  457.                                     bufer_j = p;
  458.  
  459.                                     bufer_i = 1 - bufer_i; //находим "шаг"
  460.                                     bufer_j = 1 - bufer_j;
  461.                                     bufer_i = 1 + bufer_i; //находим индексы "недостоющей до тройки" ячейки
  462.                                     bufer_j = 1 + bufer_j;
  463.                                     if (arr[bufer_i][bufer_j] == ' ')//если эта ячейка пустая, то запоняем
  464.                                     {
  465.                                         arr[bufer_i][bufer_j] = 'O';
  466.                                         return 1;
  467.                                     }
  468.                                 }
  469.                             }
  470.                         }
  471.                     }
  472.  
  473.                     if (i != 1 && j != 1 && arr[i][j] == 'X') //если Х в углу, то ищем пару
  474.                     {
  475.                         int count = 0; //cчетчик кол-ва угловых элементов
  476.  
  477.                         for (int q = 0; q < 3; q += 2) //считаем кол-во угловых элементов
  478.                             for (int p = 0; p < 3; p += 2)
  479.                                 if (arr[q][p] == 'X')
  480.                                     count++;
  481.  
  482.                         if (count > 1) // если элементов 2 и больше, то ищем пары
  483.                         {
  484.                             if ((arr[0][0] == 'X' && arr[2][2] == 'X') || (arr[0][2] == 'X' && arr[2][0] == 'X')) //если пара диагональна
  485.                             {
  486.                                 if (arr[1][1] == ' ') // и центр свободен, то ставим в центр
  487.                                 {
  488.                                     arr[1][1] = 'O';
  489.                                     return 1;
  490.                                 }
  491.                             }
  492.  
  493.                             //4 варианта соседих углов
  494.                             // если есть пара и элемент между ними свободен, то делаем этот ход
  495.                             if (arr[0][0] == 'X' && arr[0][2] == 'X' && arr[0][1] == ' ')
  496.                             {
  497.                                 arr[0][1] = 'O';
  498.                                 return 1;
  499.                             }
  500.                             if (arr[0][0] == 'X' && arr[2][0] == 'X' && arr[1][0] == ' ')
  501.                             {
  502.                                 arr[1][0] = 'O';
  503.                                 return 1;
  504.                             }
  505.                             if (arr[2][0] == 'X' && arr[2][2] == 'X' && arr[2][1] == ' ')
  506.                             {
  507.                                 arr[2][1] = 'O';
  508.                                 return 1;
  509.                             }
  510.                             if (arr[0][2] == 'X' && arr[2][2] == 'X' && arr[1][2] == ' ')
  511.                             {
  512.                                 arr[1][2] = 'O';
  513.                                 return 1;
  514.                             }
  515.                         }
  516.                     }
  517.  
  518.                     if ((arr[1][0] == 'X' && arr[1][2] == 'X') || (arr[0][1] == 'X' && arr[2][1] == 'X')) //если пара противоположная
  519.                     {
  520.                         if (arr[1][1] == ' ') // и центр свободен, то ставим в центр
  521.                         {
  522.                             arr[1][1] = 'O';
  523.                             return 1;
  524.                         }
  525.                     }
  526.  
  527.                     //8 ситуаций на соседние элементы
  528.                     if (arr[0][0] == 'X' && arr[0][1] == 'X' &&  arr[0][2] == ' ')
  529.                     {
  530.                         arr[0][2] = 'O';
  531.                         return 1;
  532.                     }
  533.                     if (arr[0][1] == 'X' && arr[0][2] == 'X' &&  arr[0][0] == ' ')
  534.                     {
  535.                         arr[0][0] = 'O';
  536.                         return 1;
  537.                     }
  538.                     if (arr[0][2] == 'X' && arr[1][2] == 'X' &&  arr[2][2] == ' ')
  539.                     {
  540.                         arr[2][2] = 'O';
  541.                         return 1;
  542.                     }
  543.                     if (arr[1][2] == 'X' && arr[2][2] == 'X' &&  arr[0][2] == ' ')
  544.                     {
  545.                         arr[0][2] = 'O';
  546.                         return 1;
  547.                     }
  548.                     if (arr[2][2] == 'X' && arr[2][1] == 'X' &&  arr[2][0] == ' ')
  549.                     {
  550.                         arr[2][0] = 'O';
  551.                         return 1;
  552.                     }
  553.                     if (arr[2][0] == 'X' && arr[2][1] == 'X' &&  arr[2][2] == ' ')
  554.                     {
  555.                         arr[2][2] = 'O';
  556.                         return 1;
  557.                     }
  558.                     if (arr[0][0] == 'X' && arr[1][0] == 'X' &&  arr[2][0] == ' ')
  559.                     {
  560.                         arr[2][0] = 'O';
  561.                         return 1;
  562.                     }
  563.                     if (arr[1][0] == 'X' && arr[2][0] == 'X' &&  arr[0][0] == ' ')
  564.                     {
  565.                         arr[0][0] = 'O';
  566.                         return 1;
  567.                     }
  568.  
  569.                     move_O(); //если не в рассматриваемой ситуации, то рандомно
  570.                     return 1;
  571.                 }
  572.             }
  573.         }
  574.  
  575.         move_O();//если не в рассматриваемой ситуации, то рандомно
  576.         return 1;
  577.     }
  578.  
  579.     int attack_X()
  580.     {
  581.         int bufer_i = -1, bufer_j = -1; // для хранения соседнего элемента
  582.         for (int i = 0; i < 3; i++) // ищем Х
  583.         {
  584.             for (int j = 0; j < 3; j++)
  585.             {
  586.                 if (arr[i][j] == 'X')
  587.                 {
  588.  
  589.                     if (!(i == 1 && j == 1) && arr[1][1] == 'X') //если не в центре, но есть центральный элемент, по переводим на ситуацию "центр"
  590.                         goto center;
  591.  
  592.                     if (i == 1 && j == 1) // если он в центре то ищем "Соседа", пропуская центр
  593.                     {
  594.                     center:
  595.                         for (int q = 0; q < 3; q++)
  596.                         {
  597.                             for (int p = 0; p < 3; p++)
  598.                             {
  599.                                 if (!(q == 1 && p == 1) && arr[q][p] == 'X')
  600.                                 {
  601.                                     bufer_i = q; //запоминаем индексы "Соседа"
  602.                                     bufer_j = p;
  603.  
  604.                                     bufer_i = 1 - bufer_i; //находим "шаг"
  605.                                     bufer_j = 1 - bufer_j;
  606.                                     bufer_i = 1 + bufer_i; //находим индексы "недостоющей до тройки" ячейки
  607.                                     bufer_j = 1 + bufer_j;
  608.                                     if (arr[bufer_i][bufer_j] == ' ')//если эта ячейка пустая, то запоняем
  609.                                     {
  610.                                         arr[bufer_i][bufer_j] = 'X';
  611.                                         return 1;
  612.                                     }
  613.                                 }
  614.                             }
  615.                         }
  616.                     }
  617.  
  618.                     if (i != 1 && j != 1 && arr[i][j] == 'X') //если Х в углу, то ищем пару
  619.                     {
  620.                         int count = 0; //cчетчик кол-ва угловых элементов
  621.  
  622.                         for (int q = 0; q < 3; q += 2) //считаем кол-во угловых элементов
  623.                             for (int p = 0; p < 3; p += 2)
  624.                                 if (arr[q][p] == 'X')
  625.                                     count++;
  626.  
  627.                         if (count > 1) // если элементов 2 и больше, то ищем пары
  628.                         {
  629.                             if ((arr[0][0] == 'X' && arr[2][2] == 'X') || (arr[0][2] == 'X' && arr[2][0] == 'X')) //если пара диагональна
  630.                             {
  631.                                 if (arr[1][1] == ' ') // и центр свободен, то ставим в центр
  632.                                 {
  633.                                     arr[1][1] = 'X';
  634.                                     return 1;
  635.                                 }
  636.                             }
  637.  
  638.                             //4 варианта соседих углов
  639.                             // если есть пара и элемент между ними свободен, то делаем этот ход
  640.                             if (arr[0][0] == 'X' && arr[0][2] == 'X' && arr[0][1] == ' ')
  641.                             {
  642.                                 arr[0][1] = 'X';
  643.                                 return 1;
  644.                             }
  645.                             if (arr[0][0] == 'X' && arr[2][0] == 'X' && arr[1][0] == ' ')
  646.                             {
  647.                                 arr[1][0] = 'X';
  648.                                 return 1;
  649.                             }
  650.                             if (arr[2][0] == 'X' && arr[2][2] == 'X' && arr[2][1] == ' ')
  651.                             {
  652.                                 arr[2][1] = 'X';
  653.                                 return 1;
  654.                             }
  655.                             if (arr[0][2] == 'X' && arr[2][2] == 'X' && arr[1][2] == ' ')
  656.                             {
  657.                                 arr[1][2] = 'X';
  658.                                 return 1;
  659.                             }
  660.                         }
  661.                     }
  662.  
  663.                     if ((arr[1][0] == 'X' && arr[1][2] == 'X') || (arr[0][1] == 'X' && arr[2][1] == 'X')) //если пара противоположная
  664.                     {
  665.                         if (arr[1][1] == ' ') // и центр свободен, то ставим в центр
  666.                         {
  667.                             arr[1][1] = 'X';
  668.                             return 1;
  669.                         }
  670.                     }
  671.  
  672.                     //8 ситуаций на соседние элементы
  673.                     if (arr[0][0] == 'X' && arr[0][1] == 'X' &&  arr[0][2] == ' ')
  674.                     {
  675.                         arr[0][2] = 'X';
  676.                         return 1;
  677.                     }
  678.                     if (arr[0][1] == 'X' && arr[0][2] == 'X' &&  arr[0][0] == ' ')
  679.                     {
  680.                         arr[0][0] = 'X';
  681.                         return 1;
  682.                     }
  683.                     if (arr[0][2] == 'X' && arr[1][2] == 'X' &&  arr[2][2] == ' ')
  684.                     {
  685.                         arr[2][2] = 'X';
  686.                         return 1;
  687.                     }
  688.                     if (arr[1][2] == 'X' && arr[2][2] == 'X' &&  arr[0][2] == ' ')
  689.                     {
  690.                         arr[0][2] = 'X';
  691.                         return 1;
  692.                     }
  693.                     if (arr[2][2] == 'X' && arr[2][1] == 'X' &&  arr[2][0] == ' ')
  694.                     {
  695.                         arr[2][0] = 'X';
  696.                         return 1;
  697.                     }
  698.                     if (arr[2][0] == 'X' && arr[2][1] == 'X' &&  arr[2][2] == ' ')
  699.                     {
  700.                         arr[2][2] = 'X';
  701.                         return 1;
  702.                     }
  703.                     if (arr[0][0] == 'X' && arr[1][0] == 'X' &&  arr[2][0] == ' ')
  704.                     {
  705.                         arr[2][0] = 'X';
  706.                         return 1;
  707.                     }
  708.                     if (arr[1][0] == 'X' && arr[2][0] == 'X' &&  arr[0][0] == ' ')
  709.                     {
  710.                         arr[0][0] = 'X';
  711.                         return 1;
  712.                     }
  713.  
  714.                     return 2;
  715.                 }
  716.             }
  717.         }
  718.         return 2;
  719.     }
  720.  
  721.     int defense_X()
  722.     {
  723.         int bufer_i = -1, bufer_j = -1; // для хранения соседнего элемента
  724.         for (int i = 0; i < 3; i++) // ищем O
  725.         {
  726.             for (int j = 0; j < 3; j++)
  727.             {
  728.                 if (arr[i][j] == 'O')
  729.                 {
  730.  
  731.                     if (!(i == 1 && j == 1) && arr[1][1] == 'O') //если не в центре, но есть центральный элемент, по переводим на ситуацию "центр"
  732.                         goto center;
  733.  
  734.                     if (i == 1 && j == 1) // если он в центре то ищем "Соседа", пропуская центр
  735.                     {
  736.                     center:
  737.                         for (int q = 0; q < 3; q++)
  738.                         {
  739.                             for (int p = 0; p < 3; p++)
  740.                             {
  741.                                 if (!(q == 1 && p == 1) && arr[q][p] == 'O')
  742.                                 {
  743.                                     bufer_i = q; //запоминаем индексы "Соседа"
  744.                                     bufer_j = p;
  745.  
  746.                                     bufer_i = 1 - bufer_i; //находим "шаг"
  747.                                     bufer_j = 1 - bufer_j;
  748.                                     bufer_i = 1 + bufer_i; //находим индексы "недостоющей до тройки" ячейки
  749.                                     bufer_j = 1 + bufer_j;
  750.                                     if (arr[bufer_i][bufer_j] == ' ')//если эта ячейка пустая, то запоняем
  751.                                     {
  752.                                         arr[bufer_i][bufer_j] = 'X';
  753.                                         return 1;
  754.                                     }
  755.                                 }
  756.                             }
  757.                         }
  758.                     }
  759.  
  760.                     if (i != 1 && j != 1 && arr[i][j] == 'O') //если Х в углу, то ищем пару
  761.                     {
  762.                         int count = 0; //cчетчик кол-ва угловых элементов
  763.  
  764.                         for (int q = 0; q < 3; q += 2) //считаем кол-во угловых элементов
  765.                             for (int p = 0; p < 3; p += 2)
  766.                                 if (arr[q][p] == 'O')
  767.                                     count++;
  768.  
  769.                         if (count > 1) // если элементов 2 и больше, то ищем пары
  770.                         {
  771.                             if ((arr[0][0] == 'O' && arr[2][2] == 'O') || (arr[0][2] == 'O' && arr[2][0] == 'O')) //если пара диагональна
  772.                             {
  773.                                 if (arr[1][1] == ' ') // и центр свободен, то ставим в центр
  774.                                 {
  775.                                     arr[1][1] = 'X';
  776.                                     return 1;
  777.                                 }
  778.                             }
  779.  
  780.                             //4 варианта соседих углов
  781.                             // если есть пара и элемент между ними свободен, то делаем этот ход
  782.                             if (arr[0][0] == 'O' && arr[0][2] == 'O' && arr[0][1] == ' ')
  783.                             {
  784.                                 arr[0][1] = 'X';
  785.                                 return 1;
  786.                             }
  787.                             if (arr[0][0] == 'O' && arr[2][0] == 'O' && arr[1][0] == ' ')
  788.                             {
  789.                                 arr[1][0] = 'X';
  790.                                 return 1;
  791.                             }
  792.                             if (arr[2][0] == 'O' && arr[2][2] == 'O' && arr[2][1] == ' ')
  793.                             {
  794.                                 arr[2][1] = 'X';
  795.                                 return 1;
  796.                             }
  797.                             if (arr[0][2] == 'O' && arr[2][2] == 'O' && arr[1][2] == ' ')
  798.                             {
  799.                                 arr[1][2] = 'X';
  800.                                 return 1;
  801.                             }
  802.                         }
  803.                     }
  804.  
  805.                     if ((arr[1][0] == 'O' && arr[1][2] == 'O') || (arr[0][1] == 'O' && arr[2][1] == 'O')) //если пара противоположная
  806.                     {
  807.                         if (arr[1][1] == ' ') // и центр свободен, то ставим в центр
  808.                         {
  809.                             arr[1][1] = 'X';
  810.                             return 1;
  811.                         }
  812.                     }
  813.  
  814.                     //8 ситуаций на соседние элементы
  815.                     if (arr[0][0] == 'O' && arr[0][1] == 'O' &&  arr[0][2] == ' ')
  816.                     {
  817.                         arr[0][2] = 'X';
  818.                         return 1;
  819.                     }
  820.                     if (arr[0][1] == 'O' && arr[0][2] == 'O' &&  arr[0][0] == ' ')
  821.                     {
  822.                         arr[0][0] = 'X';
  823.                         return 1;
  824.                     }
  825.                     if (arr[0][2] == 'O' && arr[1][2] == 'O' &&  arr[2][2] == ' ')
  826.                     {
  827.                         arr[2][2] = 'X';
  828.                         return 1;
  829.                     }
  830.                     if (arr[1][2] == 'O' && arr[2][2] == 'O' &&  arr[0][2] == ' ')
  831.                     {
  832.                         arr[0][2] = 'X';
  833.                         return 1;
  834.                     }
  835.                     if (arr[2][2] == 'O' && arr[2][1] == 'O' &&  arr[2][0] == ' ')
  836.                     {
  837.                         arr[2][0] = 'X';
  838.                         return 1;
  839.                     }
  840.                     if (arr[2][0] == 'O' && arr[2][1] == 'O' &&  arr[2][2] == ' ')
  841.                     {
  842.                         arr[2][2] = 'X';
  843.                         return 1;
  844.                     }
  845.                     if (arr[0][0] == 'O' && arr[1][0] == 'O' &&  arr[2][0] == ' ')
  846.                     {
  847.                         arr[2][0] = 'X';
  848.                         return 1;
  849.                     }
  850.                     if (arr[1][0] == 'O' && arr[2][0] == 'O' &&  arr[0][0] == ' ')
  851.                     {
  852.                         arr[0][0] = 'X';
  853.                         return 1;
  854.                     }
  855.  
  856.                     move_X(); //если не в рассматриваемой ситуации, то рандомно
  857.                     return 1;
  858.                 }
  859.             }
  860.         }
  861.  
  862.         move_X(); //если не в рассматриваемой ситуации, то рандомно
  863.         return 1;
  864.     }
  865.  
  866. };
  867.  
  868.  
  869. class Draw //рисовалка
  870. {
  871. private:
  872.     COORD position;
  873.     HANDLE hConsole;
  874.  
  875. public:
  876.     Logic logic;
  877.  
  878.     Draw()
  879.     {
  880.         position.X = 0;
  881.         position.Y = 0;
  882.         hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
  883.     }
  884.  
  885.     void color()
  886.     {
  887.         system("color 1B");
  888.     }
  889.  
  890.     void set_cursor(int x, int y)
  891.     {
  892.         position.X = x;
  893.         position.Y = y;
  894.         SetConsoleCursorPosition(hConsole, position);
  895.     }
  896.  
  897.     void rules()
  898.     {
  899.         set_cursor(9, 5);
  900.         cout << "Выбирайте поля цифрами на клавиатуре в соответсвии со схемой";
  901.         set_cursor(37, 8);
  902.         cout << "1|2|3";
  903.         set_cursor(37, 9);
  904.         cout << "—————";
  905.         set_cursor(37, 10);
  906.         cout << "4|5|6";
  907.         set_cursor(37, 11);
  908.         cout << "—————";
  909.         set_cursor(37, 12);
  910.         cout << "7|8|9";
  911.         set_cursor(22, 15);
  912.  
  913.         system("pause");
  914.     }
  915.  
  916.     void map() // выводит все на экран
  917.     {
  918.         system("cls");
  919.         set_cursor(37, 8);
  920.         cout << logic.get_info(0, 0) << "|" << logic.get_info(0, 1) << "|" << logic.get_info(0, 2);
  921.         set_cursor(37, 9);
  922.         cout << "—————";
  923.         set_cursor(37, 10);
  924.         cout << logic.get_info(1, 0) << "|" << logic.get_info(1, 1) << "|" << logic.get_info(1, 2);
  925.         set_cursor(37, 11);
  926.         cout << "—————";
  927.         set_cursor(37, 12);
  928.         cout << logic.get_info(2, 0) << "|" << logic.get_info(2, 1) << "|" << logic.get_info(2, 2);
  929.         set_cursor(0, 0);
  930.     }
  931.  
  932.     void final_map() // выводит все на экран
  933.     {
  934.         system("cls");
  935.         set_cursor(37, 4);
  936.         cout << logic.get_info(0, 0) << "|" << logic.get_info(0, 1) << "|" << logic.get_info(0, 2);
  937.         set_cursor(37, 5);
  938.         cout << "—————";
  939.         set_cursor(37, 6);
  940.         cout << logic.get_info(1, 0) << "|" << logic.get_info(1, 1) << "|" << logic.get_info(1, 2);
  941.         set_cursor(37, 7);
  942.         cout << "—————";
  943.         set_cursor(37, 8);
  944.         cout << logic.get_info(2, 0) << "|" << logic.get_info(2, 1) << "|" << logic.get_info(2, 2);
  945.     }
  946.  
  947.     int start_menu()
  948.     {
  949.         string choice;
  950.         bool error;
  951.  
  952.         system("cls");
  953.  
  954.         do
  955.         {
  956.             error = false;
  957.  
  958.             set_cursor(27, 10);
  959.             cout << "Вы можете:\n";
  960.             set_cursor(27, 11);
  961.             cout << "1. Играть с компьютером\n";
  962.             set_cursor(27, 12);
  963.             cout << "2. Играть вдвоем\n";
  964.             set_cursor(27, 13);
  965.             cout << "Выберете желаемый вариант: ";
  966.             cin >> choice;
  967.  
  968.             if (choice == "1")
  969.                 return 1;
  970.             else if (choice == "2")
  971.                 return 2;
  972.  
  973.             error = true;
  974.  
  975.             system("cls");
  976.  
  977.             set_cursor(30, 7);
  978.             cout << "Ошбика при выборе!\n" << endl;
  979.  
  980.         } while (error);
  981.     }
  982.  
  983.     int move_menu()
  984.     {
  985.         string choice;
  986.         bool error;
  987.  
  988.         system("cls");
  989.         do
  990.         {
  991.             error = false;
  992.  
  993.             set_cursor(28, 8);
  994.             cout << "Крестики ходят первыми!";
  995.             set_cursor(27, 11);
  996.             cout << "Вы можете:";
  997.             set_cursor(27, 12);
  998.             cout << "1. Играть крестиками";
  999.             set_cursor(27, 13);
  1000.             cout << "2. Играть ноликами";
  1001.             set_cursor(27, 14);
  1002.             cout << "Выберете желаемый вариант: ";
  1003.             cin >> choice;
  1004.  
  1005.             if (choice == "1")
  1006.                 return 1;
  1007.             else if (choice == "2")
  1008.                 return 2;
  1009.  
  1010.             error = true;
  1011.  
  1012.             system("cls");
  1013.  
  1014.             set_cursor(30, 17);
  1015.             cout << "Ошбика при выборе!\n" << endl;
  1016.  
  1017.         } while (error);
  1018.     }
  1019.  
  1020.     int final_menu()
  1021.     {
  1022.         string choice;
  1023.         bool error;
  1024.  
  1025.         do
  1026.         {
  1027.             error = false;
  1028.             set_cursor(32, 14);
  1029.             cout << "Вы можете:";
  1030.             set_cursor(32, 15);
  1031.             cout << "1. Играть еще раз";
  1032.             set_cursor(32, 16);
  1033.             cout << "2. Перейти в меню";
  1034.             set_cursor(32, 17);
  1035.             cout << "3. Завершить игру";
  1036.             set_cursor(28, 19);
  1037.             cout << "Выберете желаемый вариант: ";
  1038.             cin >> choice;
  1039.  
  1040.             if (choice == "1")
  1041.                 return 1;
  1042.             else if (choice == "2")
  1043.                 return 2;
  1044.             else if (choice == "3")
  1045.                 return 3;
  1046.  
  1047.             error = true;
  1048.  
  1049.             system("cls");
  1050.  
  1051.             set_cursor(31, 9);
  1052.             cout << "Ошбика при выборе!\n" << endl;
  1053.  
  1054.         } while (error);
  1055.     }
  1056.  
  1057.     void result_info(char* result)
  1058.     {
  1059.         final_map();
  1060.         switch (*result)
  1061.         {
  1062.         case 'N':
  1063.             {
  1064.                 set_cursor(37, 11);
  1065.                 cout << "Ничья!" << endl;
  1066.                 break;
  1067.             }
  1068.         case 'X':
  1069.             {
  1070.                 set_cursor(30, 11);
  1071.                 cout << "Победили крестики - X!" << endl;
  1072.                 break;
  1073.             }
  1074.         case 'O':
  1075.             {
  1076.                 set_cursor(31, 11);
  1077.                 cout << "Победили нолики - O!" << endl;
  1078.                 break;
  1079.             }
  1080.         }
  1081.     }
  1082.  
  1083. };
  1084.  
  1085. int main()
  1086. {
  1087.     setlocale(LC_ALL, "Russian");
  1088.     Draw game;
  1089.     char* result = new char; // победа/поражение/ничья
  1090.     int game_mode = 0;       // режим игры
  1091.     int game_mode_copy = 0;  //копия режима игры
  1092.  
  1093.     game.color();
  1094.     game.rules();
  1095.  
  1096.     do
  1097.     {
  1098.         game.logic.zeroing(); // обнуляем массив
  1099.        
  1100.         if(game_mode == 0)
  1101.             game_mode = game.start_menu(); //открываем меню
  1102.  
  1103.         if (game_mode == 1)// если игра с компьютером
  1104.         {
  1105.             if (game.move_menu() == 1) // если ходишь первым
  1106.             {
  1107.                 game.map();
  1108.                 while (!game.logic.full(result) && !game.logic.win(result)) // пока "не победа" и есть ячейки
  1109.                 {
  1110.                     game.logic.Enter_X();
  1111.                     game.map();
  1112.                     Sleep(500);
  1113.                     if (!game.logic.full(result) && !game.logic.win(result)) // если не победа" и есть ячейки
  1114.                     {
  1115.                         if (game.logic.attack_O() == 2)// если атака не выполнилась, то выполняем защиту
  1116.                             game.logic.defense_O();
  1117.                         game.map();
  1118.                     }
  1119.                 }
  1120.             }
  1121.             else //если ходишь 2ым
  1122.             {
  1123.                 game.map();
  1124.                 while (!game.logic.full(result) && !game.logic.win(result)) // пока "не победа" и есть ячейки
  1125.                 {
  1126.                     Sleep(500);
  1127.                     if (game.logic.attack_X() == 2)// если атака не выполнилась, то выполняем защиту
  1128.                         game.logic.defense_X();
  1129.                     game.map();
  1130.  
  1131.                     if (!game.logic.full(result) && !game.logic.win(result)) // если "не победа" и есть ячейки
  1132.                     {
  1133.                         game.logic.Enter_O();
  1134.                         game.map();
  1135.                     }
  1136.                 }
  1137.             }
  1138.         }
  1139.         else// с человеком
  1140.         {
  1141.             game.map();
  1142.             while (!game.logic.full(result) && !game.logic.win(result)) // пока "не победа" и есть ячейки
  1143.             {
  1144.                 game.logic.Enter_X();
  1145.                 game.map();
  1146.  
  1147.                 if (!game.logic.full(result) && !game.logic.win(result)) // если "не победа" и есть ячейки
  1148.                 {
  1149.                     game.logic.Enter_O();
  1150.                     game.map();
  1151.                 }
  1152.             }
  1153.         }
  1154.         game.result_info(result);
  1155.  
  1156.         game_mode_copy = game.final_menu();
  1157.         if (game_mode_copy == 2) // если выбрали "меню", то обнулить режим игры
  1158.             game_mode = 0;
  1159.  
  1160.     } while (game_mode_copy != 3);
  1161.  
  1162.     delete result;
  1163.     return 0;
  1164. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement