Ansaid

Qt

Aug 23rd, 2019
173
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 57.26 KB | None | 0 0
  1. #ifndef LOGIC_H
  2. #define LOGIC_H
  3.  
  4. #include <QString>
  5. #include <QTime>
  6.  
  7. class Logic
  8. {
  9. private:
  10.     QString matrix_logic[3][3];
  11.     QString result;
  12.     int whose_move;
  13.     int row;
  14.     int column;
  15.     int score_0_1;
  16.     int score_0_2;
  17.     int score_1_1;
  18.     int score_1_2;
  19.  
  20. public:
  21.     Logic();
  22.     QString get_matrix_logic(int i, int j);
  23.     void set_matrix_logic(int i, int j, QString X_O);
  24.  
  25.     int get_whose_move();
  26.     void set_whose_move(int temp);
  27.  
  28.     int get_score_0_1();
  29.     int get_score_0_2();
  30.     int get_score_1_1();
  31.     int get_score_1_2();
  32.     void set_score_0_1(int score);
  33.     void set_score_0_2(int score);
  34.     void set_score_1_1(int score);
  35.     void set_score_1_2(int score);
  36.  
  37.     QString get_result();
  38.  
  39.     int get_row();
  40.     int get_column();
  41.     void set_row_column(QString name);
  42.  
  43.     void rand_move();
  44.     int attack_O();
  45.     int defense_O();
  46.     int attack_X();
  47.     int defense_X();
  48.  
  49.     bool full();
  50.     bool win();
  51.  
  52.     void zeroing_logic();
  53. };
  54.  
  55. #endif // LOGIC_H
  56.  
  57.  
  58.  
  59.  
  60. #ifndef VIEW_H
  61. #define VIEW_H
  62.  
  63. #include <QMainWindow>
  64. #include <QPushButton>
  65. #include <QVector>
  66. #include <QGridLayout>
  67. #include <QFont>
  68. #include <QDebug>
  69. #include <QMessageBox>
  70.  
  71. #include "logic.h"
  72.  
  73. namespace Ui {
  74. class View;
  75. }
  76.  
  77. class View : public QMainWindow
  78. {
  79.     Q_OBJECT
  80.  
  81. public:
  82.     explicit View(QWidget *parent = nullptr);
  83.     ~View();
  84.  
  85. private slots:
  86.     void error_start();
  87.     void error_restart();
  88.  
  89.     void on_button_start_clicked();
  90.     void on_button_restart_clicked();
  91.     void on_radioButton_move_X_clicked();
  92.     void on_radioButton_move_O_clicked();
  93.     void on_button_reset_clicked();
  94.     void on_button_1_plus_clicked();
  95.     void on_button_2_plus_clicked();
  96.     void on_button_1_minus_clicked();
  97.     void on_button_2_minus_clicked();
  98.  
  99.     void score();
  100.     void game_mode(const int & bufer);
  101.     void move();
  102.     void print(QPushButton *button);
  103.     void print_computer_move();
  104.     void end();
  105.     void zeroing_view();
  106.  
  107.     void text_label_start();// для игры вдвоем
  108.  
  109.     void connect_move();
  110.     void disconnect_move();
  111.     void connect_error_restart();
  112.     void disconnect_error_restart();
  113.     void connect_error_start();
  114.     void disconnect_error_start();
  115.  
  116. private:
  117.     Ui::View *ui;
  118.     Logic game;
  119.     QVector<QVector<QPushButton*>> array;
  120.     bool the_end; // отвечает за конец
  121.     int gameMode;
  122. };
  123.  
  124. #endif // VIEW_H
  125.  
  126.  
  127.  
  128.  
  129. #include "logic.h"
  130.  
  131. Logic::Logic()
  132. {
  133.     whose_move = 0;
  134.     row = 0;
  135.     column = 0;
  136.     score_0_1 = 0;
  137.     score_0_2 = 0;
  138.     score_1_1 = 0;
  139.     score_1_2 = 0;
  140.  
  141.     for (int i = 0; i < 3; i++)
  142.      {
  143.             for (int j = 0; j < 3; j++)
  144.             {
  145.                 matrix_logic[i][j] = "";
  146.             }
  147.     }
  148. }
  149.  
  150. QString Logic::get_matrix_logic(int i, int j) // возвращает состояние клетки
  151. {
  152.     return matrix_logic[i][j];
  153. }
  154.  
  155. void Logic::set_matrix_logic(int i, int j,QString X_O) // возвращает состояние клетки
  156. {
  157.     matrix_logic[i][j] = X_O;
  158. }
  159.  
  160. int Logic::get_whose_move() // возвращает чей ход
  161. {
  162.     return whose_move;
  163. }
  164.  
  165. void Logic::set_whose_move(int temp) // устанавливает чей ход
  166. {
  167.      whose_move = temp;
  168. }
  169.  
  170. int Logic::get_score_0_1() // возвращает рекорд
  171. {
  172.     return score_0_1;
  173. }
  174.  
  175. int Logic::get_score_0_2() // возвращает рекорд
  176. {
  177.     return score_0_2;
  178. }
  179.  
  180. void Logic::set_score_0_1(int score)
  181. {
  182.     score_0_1 = score;
  183. }
  184.  
  185. void Logic::set_score_0_2(int score)
  186. {
  187.     score_0_2 = score;
  188. }
  189.  
  190. int Logic::get_score_1_1() // возвращает рекорд
  191. {
  192.     return score_1_1;
  193. }
  194.  
  195. int Logic::get_score_1_2() // возвращает рекорд
  196. {
  197.     return score_1_2;
  198. }
  199.  
  200. void Logic::set_score_1_1(int score)
  201. {
  202.     score_1_1 = score;
  203. }
  204.  
  205. void Logic::set_score_1_2(int score)
  206. {
  207.     score_1_2 = score;
  208. }
  209.  
  210. QString Logic::get_result() // возвращает результат игры
  211. {
  212.      return result;
  213. }
  214.  
  215. int Logic::get_row()
  216. {
  217.     return row;
  218. }
  219.  
  220. int Logic::get_column()
  221. {
  222.     return column;
  223. }
  224.  
  225. void Logic::set_row_column(QString name)
  226. {
  227.     //row = ((QString)name.at(0)).toInt(); //альтернативная сокращенная запись
  228.     QString i_str = name.at(0);
  229.     QString j_str = name.at(1);
  230.     row = i_str.toInt();
  231.     column = j_str.toInt();
  232. }
  233.  
  234. void Logic::rand_move()// делает рандомный ход
  235. {
  236.     QTime time = QTime::currentTime();
  237.            qsrand((uint)time.msec());
  238.     int i, j;
  239.     bool complete = false;
  240.     while (!complete) // пока не "выполнено"
  241.     {
  242.         i = qrand() % 3;
  243.         j = qrand() % 3;
  244.  
  245.         if (matrix_logic[i][j] == "") //если клетка пустая, делаем ход
  246.         {
  247.             if(whose_move % 2 == 0)
  248.             {
  249.                 matrix_logic[i][j] = "X";
  250.                 row = i;
  251.                 column = j;
  252.             }
  253.             else
  254.             {
  255.                 matrix_logic[i][j] = "O";
  256.                 row = i;
  257.                 column = j;
  258.             }
  259.             complete = true;
  260.         }
  261.     }
  262. }
  263.  
  264. int Logic::attack_O()  // атака O
  265. {
  266.     int bufer_i = -1, bufer_j = -1; // для хранения соседнего элемента
  267.     for (int i = 0; i < 3; i++)     // в поле ищем O
  268.     {
  269.         for (int j = 0; j < 3; j++)
  270.         {
  271.             if (matrix_logic[i][j] == "O")   //если нашли
  272.             {
  273.  
  274.                 if (!(i == 1 && j == 1) && matrix_logic[1][1] == "O") //если не в центре, но есть центральный элемент, по переводим на ситуацию "центр"
  275.                     goto center;
  276.  
  277.                 if (i == 1 && j == 1) // если он в центре то
  278.                 {
  279.                 center:
  280.                     for (int q = 0; q < 3; q++) //ищем "Соседа", пропуская центр
  281.                     {
  282.                         for (int p = 0; p < 3; p++)
  283.                         {
  284.                             if (!(q == 1 && p == 1) && matrix_logic[q][p] == "O")// если нашли "Соседа" не в центре
  285.                             {
  286.                                 bufer_i = q; //запоминаем индексы "Соседа"
  287.                                 bufer_j = p;
  288.  
  289.                                 bufer_i = 1 - bufer_i; //находим "шаг"
  290.                                 bufer_j = 1 - bufer_j;
  291.                                 bufer_i = 1 + bufer_i; //находим индексы "недостоющей до тройки" ячейки
  292.                                 bufer_j = 1 + bufer_j;
  293.                                 if (matrix_logic[bufer_i][bufer_j] == "")//если эта ячейка пустая, то запоняем
  294.                                 {
  295.                                     matrix_logic[bufer_i][bufer_j] = "O";
  296.  
  297.                                     row = bufer_i;
  298.                                     column = bufer_j;
  299.  
  300.                                     return 1;
  301.                                 }
  302.                             }
  303.                         }
  304.                     }
  305.                 }
  306.  
  307.                 if (i != 1 && j != 1 && matrix_logic[i][j] == "O") //если Х в углу, то ищем пару
  308.                 {
  309.                     int count = 0; //cчетчик кол-ва угловых элементов
  310.  
  311.                     for (int q = 0; q < 3; q += 2) //считаем кол-во угловых элементов
  312.                         for (int p = 0; p < 3; p += 2)
  313.                             if (matrix_logic[q][p] == 'O')
  314.                                 count++;
  315.  
  316.                     if (count > 1) // если элементов 2 и больше, то ищем пары
  317.                     {
  318.                         if ((matrix_logic[0][0] == "O" && matrix_logic[2][2] == "O") || (matrix_logic[0][2] == "O" && matrix_logic[2][0] == "O")) //если пара диагональна
  319.                         {
  320.                             if (matrix_logic[1][1] == "") // и центр свободен, то ставим в центр
  321.                             {
  322.                                 matrix_logic[1][1] = "O";
  323.  
  324.                                 row = 1;
  325.                                 column = 1;
  326.  
  327.                                 return 1;
  328.                             }
  329.                         }
  330.  
  331.                         //4 варианта соседих углов
  332.                         // если есть пара и элемент между ними свободен, то делаем этот ход
  333.                         if (matrix_logic[0][0] == "O" && matrix_logic[0][2] == "O" && matrix_logic[0][1] == "")
  334.                         {
  335.                             matrix_logic[0][1] = "O";
  336.  
  337.                             row = 0;
  338.                             column = 1;
  339.  
  340.                             return 1;
  341.                         }
  342.                         if (matrix_logic[0][0] == "O" && matrix_logic[2][0] == "O" && matrix_logic[1][0] == "")
  343.                         {
  344.                             matrix_logic[1][0] = "O";
  345.  
  346.                             row = 1;
  347.                             column = 0;
  348.  
  349.                             return 1;
  350.                         }
  351.                         if (matrix_logic[2][0] == "O" && matrix_logic[2][2] == "O" && matrix_logic[2][1] == "")
  352.                         {
  353.                             matrix_logic[2][1] = "O";
  354.  
  355.                             row = 2;
  356.                             column = 1;
  357.  
  358.                             return 1;
  359.                         }
  360.                         if (matrix_logic[0][2] == "O" && matrix_logic[2][2] == "O" && matrix_logic[1][2] == "")
  361.                         {
  362.                             matrix_logic[1][2] = "O";
  363.  
  364.                             row = 1;
  365.                             column = 2;
  366.  
  367.                             return 1;
  368.                         }
  369.                     }
  370.                 }
  371.  
  372.                 if ((matrix_logic[1][0] == "O" && matrix_logic[1][2] == "O") || (matrix_logic[0][1] == "O" && matrix_logic[2][1] == "O")) //если пара противоположная
  373.                 {
  374.                     if (matrix_logic[1][1] == "O") // и центр свободен, то ставим в центр
  375.                     {
  376.                         matrix_logic[1][1] = "O";
  377.  
  378.                         row = 1;
  379.                         column = 1;
  380.  
  381.                         return 1;
  382.                     }
  383.                 }
  384.  
  385.                 //8 ситуаций на соседние элементы
  386.                 if (matrix_logic[0][0] == "O" && matrix_logic[0][1] == "O" &&  matrix_logic[0][2] == "")
  387.                 {
  388.                     matrix_logic[0][2] = "O";
  389.  
  390.                     row = 0;
  391.                     column = 2;
  392.  
  393.                     return 1;
  394.                 }
  395.                 if (matrix_logic[0][1] == "O" && matrix_logic[0][2] == "O" &&  matrix_logic[0][0] == "")
  396.                 {
  397.                     matrix_logic[0][0] = "O";
  398.  
  399.                     row = 0;
  400.                     column = 0;
  401.  
  402.                     return 1;
  403.                 }
  404.                 if (matrix_logic[0][2] == "O" && matrix_logic[1][2] == "O" &&  matrix_logic[2][2] == "")
  405.                 {
  406.                     matrix_logic[2][2] = "O";
  407.  
  408.                     row = 2;
  409.                     column = 2;
  410.  
  411.                     return 1;
  412.                 }
  413.                 if (matrix_logic[1][2] == "O" && matrix_logic[2][2] == "O" &&  matrix_logic[0][2] == "")
  414.                 {
  415.                     matrix_logic[0][2] = "O";
  416.  
  417.                     row = 0;
  418.                     column = 2;
  419.  
  420.                     return 1;
  421.                 }
  422.                 if (matrix_logic[2][2] == "O" && matrix_logic[2][1] == "O" &&  matrix_logic[2][0] == "")
  423.                 {
  424.                     matrix_logic[2][0] = "O";
  425.  
  426.                     row = 2;
  427.                     column = 0;
  428.  
  429.                     return 1;
  430.                 }
  431.                 if (matrix_logic[2][0] == "O" && matrix_logic[2][1] == "O" &&  matrix_logic[2][2] == "")
  432.                 {
  433.                     matrix_logic[2][2] = "O";
  434.  
  435.                     row = 2;
  436.                     column = 2;
  437.  
  438.                     return 1;
  439.                 }
  440.                 if (matrix_logic[0][0] == "O" && matrix_logic[1][0] == "O" &&  matrix_logic[2][0] == "")
  441.                 {
  442.                     matrix_logic[2][0] = "O";
  443.  
  444.                     row = 2;
  445.                     column = 0;
  446.  
  447.                     return 1;
  448.                 }
  449.                 if (matrix_logic[1][0] == "O" && matrix_logic[2][0] == "O" &&  matrix_logic[0][0] == "")
  450.                 {
  451.                     matrix_logic[0][0] = "O";
  452.  
  453.                     row = 0;
  454.                     column = 0;
  455.                     return 1;
  456.                 }
  457.  
  458.                 return 2;
  459.             }
  460.         }
  461.     }
  462.     return 2; // при успешной атаке возвращает 1, если атака не произведена, то возвращает 2
  463. }
  464.  
  465. int Logic::defense_O() // защита O
  466. {
  467.     int bufer_i = -1, bufer_j = -1; // для хранения соседнего элемента
  468.     for (int i = 0; i < 3; i++) // в поле ищем Х
  469.     {
  470.         for (int j = 0; j < 3; j++)
  471.         {
  472.             if (matrix_logic[i][j] == "X") //если нашли
  473.             {
  474.  
  475.                 if (!(i == 1 && j == 1) && matrix_logic[1][1] == "X") //если не в центре, но есть центральный элемент, по переводим на ситуацию "центр"
  476.                     goto center;
  477.  
  478.                 if (i == 1 && j == 1) // если он в центре то
  479.                 {
  480.                 center:
  481.                     for (int q = 0; q < 3; q++) //ищем "Соседа", пропуская центр
  482.                     {
  483.                         for (int p = 0; p < 3; p++)
  484.                         {
  485.                             if (!(q == 1 && p == 1) && matrix_logic[q][p] == "X") // если нашли не в центре
  486.                             {
  487.                                 bufer_i = q; //запоминаем индексы "Соседа"
  488.                                 bufer_j = p;
  489.  
  490.                                 bufer_i = 1 - bufer_i; //находим "шаг"
  491.                                 bufer_j = 1 - bufer_j;
  492.                                 bufer_i = 1 + bufer_i; //находим индексы "недостоющей до тройки" ячейки
  493.                                 bufer_j = 1 + bufer_j;
  494.                                 if (matrix_logic[bufer_i][bufer_j] == "")//если эта ячейка пустая, то запоняем
  495.                                 {
  496.                                     matrix_logic[bufer_i][bufer_j] = "O";
  497.  
  498.                                     row = bufer_i;
  499.                                     column = bufer_j;
  500.  
  501.                                     return 1;
  502.                                 }
  503.                             }
  504.                         }
  505.                     }
  506.                 }
  507.  
  508.                 if (i != 1 && j != 1 && matrix_logic[i][j] == "X") //если Х в углу, то ищем пару
  509.                 {
  510.                     int count = 0; //cчетчик кол-ва угловых элементов
  511.  
  512.                     for (int q = 0; q < 3; q += 2) //считаем кол-во угловых элементов
  513.                         for (int p = 0; p < 3; p += 2)
  514.                             if (matrix_logic[q][p] == "X")
  515.                                 count++;
  516.  
  517.                     if (count > 1) // если элементов 2 и больше, то ищем пары
  518.                     {
  519.                         if ((matrix_logic[0][0] == "X" && matrix_logic[2][2] == "X") || (matrix_logic[0][2] == "X" && matrix_logic[2][0] == "X")) //если пара диагональна
  520.                         {
  521.                             if (matrix_logic[1][1] == "") // и центр свободен, то ставим в центр
  522.                             {
  523.                                 matrix_logic[1][1] = "O";
  524.  
  525.                                 row = 1;
  526.                                 column = 1;
  527.  
  528.                                 return 1;
  529.                             }
  530.                         }
  531.  
  532.                         //4 варианта соседих углов
  533.                         // если есть пара и элемент между ними свободен, то делаем этот ход
  534.                         if (matrix_logic[0][0] == "X" && matrix_logic[0][2] == "X" && matrix_logic[0][1] == "")
  535.                         {
  536.                             matrix_logic[0][1] = "O";
  537.  
  538.                             row = 0;
  539.                             column = 1;
  540.  
  541.                             return 1;
  542.                         }
  543.                         if (matrix_logic[0][0] == "X" && matrix_logic[2][0] == "X" && matrix_logic[1][0] == "")
  544.                         {
  545.                             matrix_logic[1][0] = "O";
  546.  
  547.                             row = 1;
  548.                             column = 0;
  549.  
  550.                             return 1;
  551.                         }
  552.                         if (matrix_logic[2][0] == "X" && matrix_logic[2][2] == "X" && matrix_logic[2][1] == "")
  553.                         {
  554.                             matrix_logic[2][1] = "O";
  555.  
  556.                             row = 2;
  557.                             column = 1;
  558.  
  559.                             return 1;
  560.                         }
  561.                         if (matrix_logic[0][2] == "X" && matrix_logic[2][2] == "X" && matrix_logic[1][2] == "")
  562.                         {
  563.                             matrix_logic[1][2] = "O";
  564.  
  565.                             row = 1;
  566.                             column = 2;
  567.  
  568.                             return 1;
  569.                         }
  570.                     }
  571.                 }
  572.  
  573.                 if ((matrix_logic[1][0] == "X" && matrix_logic[1][2] == "X") || (matrix_logic[0][1] == "X" && matrix_logic[2][1] == "X")) //если пара противоположная
  574.                 {
  575.                     if (matrix_logic[1][1] == "") // и центр свободен, то ставим в центр
  576.                     {
  577.                         matrix_logic[1][1] = "O";
  578.  
  579.                         row = 1;
  580.                         column = 1;
  581.  
  582.                         return 1;
  583.                     }
  584.                 }
  585.  
  586.                 //8 ситуаций на соседние элементы
  587.                 if (matrix_logic[0][0] == "X" && matrix_logic[0][1] == "X" &&  matrix_logic[0][2] == "")
  588.                 {
  589.                     matrix_logic[0][2] = "O";
  590.  
  591.                     row = 0;
  592.                     column = 2;
  593.  
  594.                     return 1;
  595.                 }
  596.                 if (matrix_logic[0][1] == "X" && matrix_logic[0][2] == "X" &&  matrix_logic[0][0] == "")
  597.                 {
  598.                     matrix_logic[0][0] = "O";
  599.  
  600.                     row = 0;
  601.                     column = 0;
  602.  
  603.                     return 1;
  604.                 }
  605.                 if (matrix_logic[0][2] == "X" && matrix_logic[1][2] == "X" &&  matrix_logic[2][2] == "")
  606.                 {
  607.                     matrix_logic[2][2] = "O";
  608.  
  609.                     row = 2;
  610.                     column = 2;
  611.  
  612.                     return 1;
  613.                 }
  614.                 if (matrix_logic[1][2] == "X" && matrix_logic[2][2] == "X" &&  matrix_logic[0][2] == "")
  615.                 {
  616.                     matrix_logic[0][2] = "O";
  617.  
  618.                     row = 0;
  619.                     column = 2;
  620.  
  621.                     return 1;
  622.                 }
  623.                 if (matrix_logic[2][2] == "X" && matrix_logic[2][1] == "X" &&  matrix_logic[2][0] == "")
  624.                 {
  625.                     matrix_logic[2][0] = "O";
  626.  
  627.                     row = 2;
  628.                     column = 0;
  629.  
  630.                     return 1;
  631.                 }
  632.                 if (matrix_logic[2][0] == "X" && matrix_logic[2][1] == "X" &&  matrix_logic[2][2] == "")
  633.                 {
  634.                     matrix_logic[2][2] = "O";
  635.  
  636.                     row = 2;
  637.                     column = 2;
  638.  
  639.                     return 1;
  640.                 }
  641.                 if (matrix_logic[0][0] == "X" && matrix_logic[1][0] == "X" &&  matrix_logic[2][0] == "")
  642.                 {
  643.                     matrix_logic[2][0] = "O";
  644.  
  645.                     row = 2;
  646.                     column = 0;
  647.  
  648.                     return 1;
  649.                 }
  650.                 if (matrix_logic[1][0] == "X" && matrix_logic[2][0] == "X" &&  matrix_logic[0][0] == "")
  651.                 {
  652.                     matrix_logic[0][0] = "O";
  653.  
  654.                     row = 0;
  655.                     column = 0;
  656.  
  657.                     return 1;
  658.                 }
  659.  
  660.                 rand_move(); //если нет в выше рассматриваемых ситуацях, то ходит рандомно
  661.                 return 1;
  662.             }
  663.         }
  664.     }
  665.  
  666.     rand_move(); //если нет в выше рассматриваемых ситуацях, то рандомно
  667.     return 1; // возвращает 1, когда ход сделан (ход делается в любос случае)
  668. }
  669.  
  670. int Logic::attack_X()  // атака Х
  671. {
  672.     int bufer_i = -1, bufer_j = -1; // для хранения соседнего элемента
  673.     for (int i = 0; i < 3; i++) // в поле ищем Х
  674.     {
  675.         for (int j = 0; j < 3; j++)
  676.         {
  677.             if (matrix_logic[i][j] == "X") // если нашли
  678.             {
  679.  
  680.                 if (!(i == 1 && j == 1) && matrix_logic[1][1] == "X") //если не в центре, но есть центральный элемент, по переводим на ситуацию "центр"
  681.                     goto center;
  682.  
  683.                 if (i == 1 && j == 1) // если он в центре то
  684.                 {
  685.                 center:
  686.                     for (int q = 0; q < 3; q++) //ищем "Соседа", пропуская центр
  687.                     {
  688.                         for (int p = 0; p < 3; p++)
  689.                         {
  690.                             if (!(q == 1 && p == 1) && matrix_logic[q][p] == "X") //если нашли не в центре
  691.                             {
  692.                                 bufer_i = q; //запоминаем индексы "Соседа"
  693.                                 bufer_j = p;
  694.  
  695.                                 bufer_i = 1 - bufer_i; //находим "шаг"
  696.                                 bufer_j = 1 - bufer_j;
  697.                                 bufer_i = 1 + bufer_i; //находим индексы "недостоющей до тройки" ячейки
  698.                                 bufer_j = 1 + bufer_j;
  699.                                 if (matrix_logic[bufer_i][bufer_j] == "")//если эта ячейка пустая, то запоняем
  700.                                 {
  701.                                     matrix_logic[bufer_i][bufer_j] = "X";
  702.  
  703.                                     row = bufer_i;
  704.                                     column = bufer_j;
  705.  
  706.                                     return 1;
  707.                                 }
  708.                             }
  709.                         }
  710.                     }
  711.                 }
  712.  
  713.                 if (i != 1 && j != 1 && matrix_logic[i][j] == "X") //если Х в углу, то ищем пару
  714.                 {
  715.                     int count = 0; //cчетчик кол-ва угловых элементов
  716.  
  717.                     for (int q = 0; q < 3; q += 2) //считаем кол-во угловых элементов
  718.                         for (int p = 0; p < 3; p += 2)
  719.                             if (matrix_logic[q][p] == "X")
  720.                                 count++;
  721.  
  722.                     if (count > 1) // если элементов 2 и больше, то ищем пары
  723.                     {
  724.                         if ((matrix_logic[0][0] == "X" && matrix_logic[2][2] == "X") || (matrix_logic[0][2] == "X" && matrix_logic[2][0] == "X")) //если пара диагональна
  725.                         {
  726.                             if (matrix_logic[1][1] == "") // и центр свободен, то ставим в центр
  727.                             {
  728.                                 matrix_logic[1][1] = "X";
  729.  
  730.                                 row = 1;
  731.                                 column = 1;
  732.  
  733.                                 return 1;
  734.                             }
  735.                         }
  736.  
  737.                         //4 варианта соседих углов
  738.                         // если есть пара и элемент между ними свободен, то делаем этот ход
  739.                         if (matrix_logic[0][0] == "X" && matrix_logic[0][2] == "X" && matrix_logic[0][1] == "")
  740.                         {
  741.                             matrix_logic[0][1] = "X";
  742.  
  743.                             row = 0;
  744.                             column = 1;
  745.  
  746.                             return 1;
  747.                         }
  748.                         if (matrix_logic[0][0] == "X" && matrix_logic[2][0] == "X" && matrix_logic[1][0] == "")
  749.                         {
  750.                             matrix_logic[1][0] = "X";
  751.  
  752.                             row = 1;
  753.                             column = 0;
  754.  
  755.                             return 1;
  756.                         }
  757.                         if (matrix_logic[2][0] == "X" && matrix_logic[2][2] == "X" && matrix_logic[2][1] == "")
  758.                         {
  759.                             matrix_logic[2][1] = "X";
  760.  
  761.                             row = 2;
  762.                             column = 1;
  763.  
  764.                             return 1;
  765.                         }
  766.                         if (matrix_logic[0][2] == "X" && matrix_logic[2][2] == "X" && matrix_logic[1][2] == "")
  767.                         {
  768.                             matrix_logic[1][2] = "X";
  769.  
  770.                             row = 1;
  771.                             column = 2;
  772.  
  773.                             return 1;
  774.                         }
  775.                     }
  776.                 }
  777.  
  778.                 if ((matrix_logic[1][0] == "X" && matrix_logic[1][2] == "X") || (matrix_logic[0][1] == "X" && matrix_logic[2][1] == "X")) //если пара противоположная
  779.                 {
  780.                     if (matrix_logic[1][1] == "") // и центр свободен, то ставим в центр
  781.                     {
  782.                         matrix_logic[1][1] = "X";
  783.  
  784.                         row = 1;
  785.                         column = 1;
  786.  
  787.                         return 1;
  788.                     }
  789.                 }
  790.  
  791.                 //8 ситуаций на соседние элементы
  792.                 if (matrix_logic[0][0] == "X" && matrix_logic[0][1] == "X" &&  matrix_logic[0][2] == "")
  793.                 {
  794.                     matrix_logic[0][2] = "X";
  795.  
  796.                     row = 0;
  797.                     column = 2;
  798.  
  799.                     return 1;
  800.                 }
  801.                 if (matrix_logic[0][1] == "X" && matrix_logic[0][2] == "X" &&  matrix_logic[0][0] == "")
  802.                 {
  803.                     matrix_logic[0][0] = "X";
  804.  
  805.                     row = 0;
  806.                     column = 0;
  807.  
  808.                     return 1;
  809.                 }
  810.                 if (matrix_logic[0][2] == "X" && matrix_logic[1][2] == "X" &&  matrix_logic[2][2] == "")
  811.                 {
  812.                     matrix_logic[2][2] = "X";
  813.  
  814.                     row = 2;
  815.                     column = 2;
  816.  
  817.                     return 1;
  818.                 }
  819.                 if (matrix_logic[1][2] == "X" && matrix_logic[2][2] == "X" &&  matrix_logic[0][2] == "")
  820.                 {
  821.                     matrix_logic[0][2] = "X";
  822.  
  823.                     row = 0;
  824.                     column = 2;
  825.  
  826.                     return 1;
  827.                 }
  828.                 if (matrix_logic[2][2] == "X" && matrix_logic[2][1] == "X" &&  matrix_logic[2][0] == "")
  829.                 {
  830.                     matrix_logic[2][0] = "X";
  831.  
  832.                     row = 2;
  833.                     column = 0;
  834.  
  835.                     return 1;
  836.                 }
  837.                 if (matrix_logic[2][0] == "X" && matrix_logic[2][1] == "X" &&  matrix_logic[2][2] == "")
  838.                 {
  839.                     matrix_logic[2][2] = "X";
  840.  
  841.                     row = 2;
  842.                     column = 2;
  843.  
  844.                     return 1;
  845.                 }
  846.                 if (matrix_logic[0][0] == "X" && matrix_logic[1][0] == "X" &&  matrix_logic[2][0] == "")
  847.                 {
  848.                     matrix_logic[2][0] = "X";
  849.  
  850.                     row = 2;
  851.                     column = 0;
  852.  
  853.                     return 1;
  854.                 }
  855.                 if (matrix_logic[1][0] == "X" && matrix_logic[2][0] == "X" &&  matrix_logic[0][0] == "")
  856.                 {
  857.                     matrix_logic[0][0] = "X";
  858.  
  859.                     row = 0;
  860.                     column = 0;
  861.  
  862.                     return 1;
  863.                 }
  864.  
  865.                 return 2;
  866.             }
  867.         }
  868.     }
  869.     // при успешной атаке возвращает 1, если атака не произведена, то возвращает 2
  870.     return 2;
  871. }
  872.  
  873. int Logic::defense_X() // защита X
  874. {
  875.     int bufer_i = -1, bufer_j = -1; // для хранения соседнего элемента
  876.     for (int i = 0; i < 3; i++) // в поле ищем O
  877.     {
  878.         for (int j = 0; j < 3; j++)
  879.         {
  880.             if (matrix_logic[i][j] == "O") // если нашли
  881.             {
  882.  
  883.                 if (!(i == 1 && j == 1) && matrix_logic[1][1] == "O") //если не в центре, но есть центральный элемент, по переводим на ситуацию "центр"
  884.                     goto center;
  885.  
  886.                 if (i == 1 && j == 1) // если он в центре то
  887.                 {
  888.                 center:
  889.                     for (int q = 0; q < 3; q++) //ищем "Соседа", пропуская центр
  890.                     {
  891.                         for (int p = 0; p < 3; p++)
  892.                         {
  893.                             if (!(q == 1 && p == 1) && matrix_logic[q][p] == "O") // если нашли не в центре
  894.                             {
  895.                                 bufer_i = q; //запоминаем индексы "Соседа"
  896.                                 bufer_j = p;
  897.  
  898.                                 bufer_i = 1 - bufer_i; //находим "шаг"
  899.                                 bufer_j = 1 - bufer_j;
  900.                                 bufer_i = 1 + bufer_i; //находим индексы "недостоющей до тройки" ячейки
  901.                                 bufer_j = 1 + bufer_j;
  902.                                 if (matrix_logic[bufer_i][bufer_j] == "")//если эта ячейка пустая, то запоняем
  903.                                 {
  904.                                     matrix_logic[bufer_i][bufer_j] = "X";
  905.  
  906.                                     row = bufer_i;
  907.                                     column = bufer_j;
  908.  
  909.                                     return 1;
  910.                                 }
  911.                             }
  912.                         }
  913.                     }
  914.                 }
  915.  
  916.                 if (i != 1 && j != 1 && matrix_logic[i][j] == "O") //если Х в углу, то ищем пару
  917.                 {
  918.                     int count = 0; //cчетчик кол-ва угловых элементов
  919.  
  920.                     for (int q = 0; q < 3; q += 2) //считаем кол-во угловых элементов
  921.                         for (int p = 0; p < 3; p += 2)
  922.                             if (matrix_logic[q][p] == "O")
  923.                                 count++;
  924.  
  925.                     if (count > 1) // если элементов 2 и больше, то ищем пары
  926.                     {
  927.                         if ((matrix_logic[0][0] == "O" && matrix_logic[2][2] == "O") || (matrix_logic[0][2] == "O" && matrix_logic[2][0] == "O")) //если пара диагональна
  928.                         {
  929.                             if (matrix_logic[1][1] == "") // и центр свободен, то ставим в центр
  930.                             {
  931.                                 matrix_logic[1][1] = "X";
  932.  
  933.                                 row = 1;
  934.                                 column = 1;
  935.  
  936.                                 return 1;
  937.                             }
  938.                         }
  939.  
  940.                         //4 варианта соседих углов
  941.                         // если есть пара и элемент между ними свободен, то делаем этот ход
  942.                         if (matrix_logic[0][0] == "O" && matrix_logic[0][2] == "O" && matrix_logic[0][1] == "")
  943.                         {
  944.                             matrix_logic[0][1] = "X";
  945.  
  946.                             row = 0;
  947.                             column = 1;
  948.  
  949.                             return 1;
  950.                         }
  951.                         if (matrix_logic[0][0] == "O" && matrix_logic[2][0] == "O" && matrix_logic[1][0] == "")
  952.                         {
  953.                             matrix_logic[1][0] = "X";
  954.  
  955.                             row = 1;
  956.                             column = 0;
  957.  
  958.                             return 1;
  959.                         }
  960.                         if (matrix_logic[2][0] == "O" && matrix_logic[2][2] == "O" && matrix_logic[2][1] == "")
  961.                         {
  962.                             matrix_logic[2][1] = "X";
  963.  
  964.                             row = 2;
  965.                             column = 1;
  966.  
  967.                             return 1;
  968.                         }
  969.                         if (matrix_logic[0][2] == "O" && matrix_logic[2][2] == "O" && matrix_logic[1][2] == "")
  970.                         {
  971.                             matrix_logic[1][2] = "X";
  972.  
  973.                             row = 1;
  974.                             column = 2;
  975.  
  976.                             return 1;
  977.                         }
  978.                     }
  979.                 }
  980.  
  981.                 if ((matrix_logic[1][0] == "O" && matrix_logic[1][2] == "O") || (matrix_logic[0][1] == "O" && matrix_logic[2][1] == "O")) //если пара противоположная
  982.                 {
  983.                     if (matrix_logic[1][1] == "") // и центр свободен, то ставим в центр
  984.                     {
  985.                         matrix_logic[1][1] = "X";
  986.  
  987.                         row = 1;
  988.                         column = 1;
  989.  
  990.                         return 1;
  991.                     }
  992.                 }
  993.  
  994.                 //8 ситуаций на соседние элементы
  995.                 if (matrix_logic[0][0] == "O" && matrix_logic[0][1] == "O" &&  matrix_logic[0][2] == "")
  996.                 {
  997.                     matrix_logic[0][2] = "X";
  998.  
  999.                     row = 0;
  1000.                     column = 2;
  1001.  
  1002.                     return 1;
  1003.                 }
  1004.                 if (matrix_logic[0][1] == "O" && matrix_logic[0][2] == "O" &&  matrix_logic[0][0] == "")
  1005.                 {
  1006.                     matrix_logic[0][0] = "X";
  1007.  
  1008.                     row = 0;
  1009.                     column = 0;
  1010.  
  1011.                     return 1;
  1012.                 }
  1013.                 if (matrix_logic[0][2] == "O" && matrix_logic[1][2] == "O" &&  matrix_logic[2][2] == "")
  1014.                 {
  1015.                     matrix_logic[2][2] = "X";
  1016.  
  1017.                     row = 2;
  1018.                     column = 2;
  1019.  
  1020.                     return 1;
  1021.                 }
  1022.                 if (matrix_logic[1][2] == "O" && matrix_logic[2][2] == "O" &&  matrix_logic[0][2] == "")
  1023.                 {
  1024.                     matrix_logic[0][2] = "X";
  1025.  
  1026.                     row = 0;
  1027.                     column = 2;
  1028.  
  1029.                     return 1;
  1030.                 }
  1031.                 if (matrix_logic[2][2] == "O" && matrix_logic[2][1] == "O" &&  matrix_logic[2][0] == "")
  1032.                 {
  1033.                     matrix_logic[2][0] = "X";
  1034.  
  1035.                     row = 2;
  1036.                     column = 0;
  1037.  
  1038.                     return 1;
  1039.                 }
  1040.                 if (matrix_logic[2][0] == "O" && matrix_logic[2][1] == "O" &&  matrix_logic[2][2] == "")
  1041.                 {
  1042.                     matrix_logic[2][2] = "X";
  1043.  
  1044.                     row = 2;
  1045.                     column = 2;
  1046.  
  1047.                     return 1;
  1048.                 }
  1049.                 if (matrix_logic[0][0] == "O" && matrix_logic[1][0] == "O" &&  matrix_logic[2][0] == "")
  1050.                 {
  1051.                     matrix_logic[2][0] = "X";
  1052.  
  1053.                     row = 2;
  1054.                     column = 0;
  1055.  
  1056.                     return 1;
  1057.                 }
  1058.                 if (matrix_logic[1][0] == "O" && matrix_logic[2][0] == "O" &&  matrix_logic[0][0] == "")
  1059.                 {
  1060.                     matrix_logic[0][0] = "X";
  1061.  
  1062.                     row = 0;
  1063.                     column = 0;
  1064.  
  1065.                     return 1;
  1066.                 }
  1067.  
  1068.                 rand_move(); //если нет в выше рассматриваемых ситуациях, то делает рандомный ход
  1069.                 return 1;
  1070.             }
  1071.         }
  1072.     }
  1073.  
  1074.     rand_move(); //если нет в выше рассматриваемых ситуациях, то делает рандомный ход
  1075.     return 1; // возвращает 1, когда ход сделан (ход делается в любос случае)
  1076. }
  1077.  
  1078. bool Logic::full()     //проверяет на заполненность
  1079. {
  1080.  
  1081.     for (int i = 0; i < 3; i++)
  1082.         for (int j = 0; j < 3; j++)
  1083.             if (matrix_logic[i][j] == "") // если найдено хоть одно свободное поле,
  1084.                 return false;     // то возвращием false
  1085.  
  1086.     result = "N";                //присваем резальтату "Ничью"
  1087.  
  1088.     return true;
  1089. }
  1090.  
  1091. bool Logic::win() // проверяет на победу
  1092. {
  1093.     bool complete = false;
  1094.     //если найдена победная комбинация, то "результату" присваеваем значение победной комбинации
  1095.     if (matrix_logic[0][0] == matrix_logic[0][1] && matrix_logic[0][1] == matrix_logic[0][2] && matrix_logic[0][0] != "")
  1096.     {
  1097.         complete = true;
  1098.         result = matrix_logic[0][0];
  1099.     }
  1100.     if (matrix_logic[1][0] == matrix_logic[1][1] && matrix_logic[1][1] == matrix_logic[1][2] && matrix_logic[1][0] != "")
  1101.     {
  1102.         complete = true;
  1103.         result = matrix_logic[1][0];
  1104.     }
  1105.     if (matrix_logic[2][0] == matrix_logic[2][1] && matrix_logic[2][1] == matrix_logic[2][2] && matrix_logic[2][0] != "")
  1106.     {
  1107.         complete = true;
  1108.         result = matrix_logic[2][0];
  1109.     }
  1110.     if (matrix_logic[0][0] == matrix_logic[1][0] && matrix_logic[1][0] == matrix_logic[2][0] && matrix_logic[0][0] != "")
  1111.     {
  1112.         complete = true;
  1113.         result = matrix_logic[0][0];
  1114.     }
  1115.     if (matrix_logic[0][1] == matrix_logic[1][1] && matrix_logic[1][1] == matrix_logic[2][1] && matrix_logic[0][1] != "")
  1116.     {
  1117.         complete = true;
  1118.         result = matrix_logic[0][1];
  1119.     }
  1120.     if (matrix_logic[0][2] == matrix_logic[1][2] && matrix_logic[1][2] == matrix_logic[2][2] && matrix_logic[0][2] != "")
  1121.     {
  1122.         complete = true;
  1123.         result = matrix_logic[0][2];
  1124.     }
  1125.  
  1126.     if (matrix_logic[0][0] == matrix_logic[1][1] && matrix_logic[1][1] == matrix_logic[2][2] && matrix_logic[0][0] != "")
  1127.     {
  1128.         complete = true;
  1129.         result = matrix_logic[0][0];
  1130.     }
  1131.     if (matrix_logic[0][2] == matrix_logic[1][1] && matrix_logic[1][1] == matrix_logic[2][0] && matrix_logic[0][2] != "")
  1132.     {
  1133.         complete = true;
  1134.         result = matrix_logic[0][2];
  1135.     }
  1136.     //возвращает true если победа, если игра продолжается, то false
  1137.     return complete;
  1138. }
  1139.  
  1140. void Logic::zeroing_logic()
  1141. {
  1142.     whose_move = 0;
  1143.  
  1144.     for (int i = 0; i < 3; i++)
  1145.      {
  1146.             for (int j = 0; j < 3; j++)
  1147.             {
  1148.                 matrix_logic[i][j] = "";
  1149.             }
  1150.     }
  1151. }
  1152.  
  1153.  
  1154.  
  1155.  
  1156. #include "view.h"
  1157. #include <QApplication>
  1158.  
  1159. int main(int argc, char *argv[])
  1160. {
  1161.     QApplication a(argc, argv);
  1162.     View w;
  1163.     w.show();
  1164.  
  1165.     return a.exec();
  1166. }
  1167.  
  1168.  
  1169.  
  1170.  
  1171. #include "view.h"
  1172. #include "ui_view.h"
  1173.  
  1174. View::View(QWidget *parent) :
  1175.     QMainWindow(parent),
  1176.     ui(new Ui::View)
  1177. {
  1178.     ui->setupUi(this);
  1179.  
  1180.     this->setStyleSheet("background-color: rgb(170, 170, 255);");
  1181.  
  1182.     array.resize(3);
  1183.        for (int i = 0; i < 3; i++)
  1184.        {
  1185.            array[i].resize(3);
  1186.        }
  1187.  
  1188.        for (int i = 0; i < 3; i++)
  1189.         {
  1190.                for (int j = 0; j < 3; j++)
  1191.                {
  1192.                    QPushButton* button = new QPushButton;
  1193.                    QString name = QString::number(i) + QString::number(j);
  1194.                    button->setObjectName(name);
  1195.                    button->setText("");
  1196.                    button->setFixedSize(120,120);
  1197.                    button->setStyleSheet("QPushButton{background:rgb(255, 255, 255)}");
  1198.                    array[i][j] = button;
  1199.                    ui->gridLayout->addWidget (button, i, j);
  1200.                }
  1201.        }
  1202.  
  1203.     ui->button_restart->setVisible(false);
  1204.     ui->button_1_plus->setVisible(false);
  1205.     ui->button_2_plus->setVisible(false);
  1206.     ui->button_1_minus->setVisible(false);
  1207.     ui->button_2_minus->setVisible(false);
  1208.  
  1209.     connect(ui->comboBox_gameMode, SIGNAL(currentIndexChanged(const int &)), this, SLOT (game_mode(const int &)));
  1210.     gameMode = 0;
  1211.     ui->radioButton_move_X->setChecked(true);
  1212.  
  1213.     connect_error_start();
  1214.  
  1215.     game.set_whose_move(0);
  1216.     the_end = false;
  1217. }
  1218.  
  1219. View::~View()
  1220. {
  1221.     delete ui;
  1222. }
  1223.  
  1224. void View::game_mode(const int & bufer)
  1225. {
  1226.     gameMode = bufer;
  1227.  
  1228.     ui->label_start->setText("");
  1229.     game.zeroing_logic();
  1230.     zeroing_view();
  1231.     the_end = false;
  1232.     ui->button_start->setVisible(true);
  1233.     ui->button_restart->setVisible(false);
  1234.  
  1235.     disconnect_move();
  1236.     disconnect_error_restart();
  1237.     disconnect_error_start();
  1238.     connect_error_start();
  1239.  
  1240.  
  1241.     if(gameMode == 0)
  1242.     {
  1243.         ui->radioButton_move_X->setVisible(true);
  1244.         ui->radioButton_move_O->setVisible(true);
  1245.         ui->button_1_plus->setVisible(false);
  1246.         ui->button_2_plus->setVisible(false);
  1247.         ui->button_1_minus->setVisible(false);
  1248.         ui->button_2_minus->setVisible(false);
  1249.  
  1250.         ui->label_text_1->setText("Вы:");
  1251.         ui->label_text_2->setText("Компьютер:");
  1252.         ui->label_score_1->setNum(game.get_score_0_1());
  1253.         ui->label_score_2->setNum(game.get_score_0_2());
  1254.     }
  1255.     else
  1256.     {
  1257.         ui->radioButton_move_X->setVisible(false);
  1258.         ui->radioButton_move_O->setVisible(false);
  1259.         ui->button_1_plus->setVisible(true);
  1260.         ui->button_2_plus->setVisible(true);
  1261.         ui->button_1_minus->setVisible(true);
  1262.         ui->button_2_minus->setVisible(true);
  1263.  
  1264.         ui->label_text_1->setText("Игрок 1:");
  1265.         ui->label_text_2->setText("Игрок 2:");
  1266.         ui->label_score_1->setNum(game.get_score_1_1());
  1267.         ui->label_score_2->setNum(game.get_score_1_2());
  1268.  
  1269.     }
  1270. }
  1271.  
  1272. void View::error_start()
  1273. {
  1274.     QMessageBox :: information(this, "Ошибка", "Нажмите кнопку \"Начать\"!");
  1275. }
  1276.  
  1277. void View::error_restart()
  1278. {
  1279.     QMessageBox :: information(this, "Ошибка", "Нажмите кнопку \"Заново\"\nИли выберете другой режим игры!");
  1280. }
  1281.  
  1282. void View::text_label_start()
  1283. {
  1284.     if(game.get_whose_move() % 2 == 0)
  1285.     {
  1286.         ui->label_start->setStyleSheet("QLabel{color:  rgb(200, 0, 0)}");
  1287.         ui->label_start->setText("Ходят X!");
  1288.     }
  1289.     else
  1290.     {
  1291.         ui->label_start->setStyleSheet("QLabel{color:  blue}");
  1292.         ui->label_start->setText("Ходят O!");
  1293.     }
  1294. }
  1295.  
  1296. void View::on_button_start_clicked()
  1297. {
  1298.     game.set_whose_move(0);
  1299.  
  1300.     if(gameMode == 0)
  1301.     {
  1302.         if(ui->radioButton_move_X->isChecked())
  1303.         {
  1304.             ui->label_start->setStyleSheet("QLabel{color:  rgb(200, 0, 0)}");
  1305.             ui->label_start->setText("Игра началась,\nВы играете X!");
  1306.         }
  1307.         else
  1308.         {
  1309.             ui->label_start->setStyleSheet("QLabel{color: blue}");
  1310.             ui->label_start->setText("Игра началась,\nВы играете O!");
  1311.         }
  1312.     }
  1313.     else
  1314.     {
  1315.         ui->label_start->setStyleSheet("QLabel{color: rgb(200, 0, 0)}");
  1316.         ui->label_start->setText("Игра началась,\nПервыми ходят X!");
  1317.     }
  1318.  
  1319.     ui->button_start->setVisible(false);
  1320.  
  1321.     disconnect_error_start();
  1322.     connect_move();
  1323.  
  1324.     if(ui->radioButton_move_O->isChecked() && gameMode == 0)
  1325.     {
  1326.         game.rand_move();// делаем случайный ход
  1327.         print(array[game.get_row()][game.get_column()]);
  1328.         game.set_whose_move(1);
  1329.     }
  1330. }
  1331.  
  1332. void View::move()
  1333. {
  1334.     QPushButton *button = (QPushButton *)sender();
  1335.     QString name = sender()->objectName();
  1336.  
  1337.     game.set_row_column(name); // устанавливаем индексы
  1338.  
  1339.     if(gameMode == 0)// если с компом
  1340.     {
  1341.         if(game.get_matrix_logic(game.get_row(), game.get_column()) != "X" && game.get_matrix_logic(game.get_row(), game.get_column()) != "O")
  1342.         {
  1343.             print(button);
  1344.  
  1345.             game.set_matrix_logic(game.get_row(), game.get_column(),button->text());
  1346.  
  1347.             game.set_whose_move(game.get_whose_move() + 1);//изменяем "Чей ход"
  1348.  
  1349.             if(!game.win() && !game.full())
  1350.             {
  1351.                 if(ui->radioButton_move_X->isChecked())//если играем крестиками
  1352.                 {
  1353.                     if (game.attack_O() == 2)// если атака не выполнилась, то выполняем защиту
  1354.                         game.defense_O();
  1355.                 }
  1356.                 else // если играем ноликами
  1357.                 {
  1358.                     if (game.attack_X() == 2)// если атака не выполнилась, то выполняем защиту
  1359.                         game.defense_X();
  1360.                 }
  1361.  
  1362.                 print_computer_move();
  1363.             }
  1364.             else
  1365.             {
  1366.                 end();
  1367.             }
  1368.  
  1369.             if((game.win() || game.full()) && the_end == false)
  1370.             {
  1371.                 end();
  1372.             }
  1373.         }
  1374.     }
  1375.     else if (gameMode == 1)// если с человеком
  1376.     {
  1377.         if(!game.win() && !game.full())
  1378.         {
  1379.             print(button);
  1380.             game.set_matrix_logic(game.get_row(), game.get_column(),button->text());
  1381.             game.set_whose_move(game.get_whose_move() + 1);
  1382.             text_label_start();
  1383.         }
  1384.         else
  1385.         {
  1386.             end();
  1387.         }
  1388.  
  1389.         if((game.win() || game.full()) && the_end == false)
  1390.         {
  1391.             end();
  1392.         }
  1393.     }
  1394. }
  1395.  
  1396. void View::print(QPushButton *button)
  1397. {
  1398.     if(game.get_whose_move() % 2 == 0)
  1399.     {
  1400.         button->setText("X");
  1401.         button->setStyleSheet("QPushButton{background:rgb(255, 255, 255);color: red}");
  1402.         QFont f = button->font(); //QFont определяет шрифт, используемый для рисования текста//Font() берет шрифт кнопки
  1403.         f.setPointSize(80); //Устанавливает шрифт
  1404.         f.setBold(true); //делает жирным (Принимает bool да/нет)
  1405.         button->setFont(f);// устанавливает шрифт по переменной f
  1406.     }
  1407.     else
  1408.     {
  1409.         button->setText("O");
  1410.         button->setStyleSheet("QPushButton {background:rgb(255, 255, 255);color: blue}");
  1411.         QFont f = button->font(); //QFont определяет шрифт, используемый для рисования текста//Font() берет шрифт кнопки
  1412.         f.setPointSize(80); //Устанавливает шрифт
  1413.         f.setBold(true); //делает жирным (Принимает bool да/нет)
  1414.         button->setFont(f);// устанавливает шрифт по переменной f
  1415.     }
  1416. }
  1417.  
  1418. void View::print_computer_move()
  1419. {
  1420.     print(array[game.get_row()][game.get_column()]);
  1421.     game.set_whose_move(game.get_whose_move() + 1);
  1422. }
  1423.  
  1424. void View::end()
  1425. {
  1426.     the_end = true;
  1427.  
  1428.     ui->button_restart->setVisible(true);
  1429.  
  1430.     if(game.get_result() == "X")
  1431.     {
  1432.         ui->label_start->setStyleSheet("QLabel{color:  rgb(200, 0, 0)}");
  1433.         ui->label_start->setText("Игра закончена,\nПобедили X!");
  1434.     }
  1435.     else if(game.get_result() == "O")
  1436.     {
  1437.         ui->label_start->setStyleSheet("QLabel{color:  blue}");
  1438.         ui->label_start->setText("Игра закончена,\nПобедили O!");
  1439.     }
  1440.     else
  1441.     {
  1442.         ui->label_start->setStyleSheet("QLabel{color:  rgb(0, 85, 0);}");
  1443.         ui->label_start->setText("Игра закончена,\nНичья!");
  1444.     }
  1445.  
  1446.     score();
  1447.  
  1448.     disconnect_move();
  1449.     connect_error_restart();
  1450. }
  1451.  
  1452. void View::zeroing_view()
  1453. {
  1454.     for (int i = 0; i < 3; i++)
  1455.      {
  1456.             for (int j = 0; j < 3; j++)
  1457.             {
  1458.                 array[i][j]->setText("");
  1459.             }
  1460.     }
  1461. }
  1462.  
  1463. void View::on_button_restart_clicked()
  1464. {
  1465.     the_end = false;
  1466.     ui->button_restart->setVisible(false);
  1467.  
  1468.     game.set_whose_move(0);
  1469.     game.zeroing_logic();
  1470.     zeroing_view();
  1471.  
  1472.     if(gameMode == 0)
  1473.     {
  1474.         if(ui->radioButton_move_X->isChecked())
  1475.         {
  1476.             ui->label_start->setStyleSheet("QLabel{color:  rgb(200, 00, 0)}");
  1477.             ui->label_start->setText("Игра началась,\nВы играете X!");
  1478.         }
  1479.         else
  1480.         {
  1481.             ui->label_start->setStyleSheet("QLabel{color:  blue}");
  1482.             ui->label_start->setText("Игра началась,\nВы играете O!");
  1483.         }
  1484.     }
  1485.     else
  1486.     {
  1487.         ui->label_start->setStyleSheet("QLabel{color:  rgb(200, 0, 0);}");
  1488.         ui->label_start->setText("Игра началась,\nПервыми ходят X!");
  1489.     }
  1490.  
  1491.     disconnect_error_restart();
  1492.     connect_move();
  1493.  
  1494.     if(ui->radioButton_move_O->isChecked() && gameMode == 0)
  1495.     {
  1496.         game.rand_move();// делаем случайный ход
  1497.         print(array[game.get_row()][game.get_column()]);
  1498.         game.set_whose_move(1);
  1499.     }
  1500. }
  1501.  
  1502. void View::connect_move()
  1503. {
  1504.     connect(array[0][0], SIGNAL(clicked()), this, SLOT (move()));
  1505.     connect(array[0][1], SIGNAL(clicked()), this, SLOT (move()));
  1506.     connect(array[0][2], SIGNAL(clicked()), this, SLOT (move()));
  1507.     connect(array[1][0], SIGNAL(clicked()), this, SLOT (move()));
  1508.     connect(array[1][1], SIGNAL(clicked()), this, SLOT (move()));
  1509.     connect(array[1][2], SIGNAL(clicked()), this, SLOT (move()));
  1510.     connect(array[2][0], SIGNAL(clicked()), this, SLOT (move()));
  1511.     connect(array[2][1], SIGNAL(clicked()), this, SLOT (move()));
  1512.     connect(array[2][2], SIGNAL(clicked()), this, SLOT (move()));
  1513. }
  1514.  
  1515. void View::disconnect_move()
  1516. {
  1517.     disconnect(array[0][0], SIGNAL(clicked()), this, SLOT (move()));
  1518.     disconnect(array[0][1], SIGNAL(clicked()), this, SLOT (move()));
  1519.     disconnect(array[0][2], SIGNAL(clicked()), this, SLOT (move()));
  1520.     disconnect(array[1][0], SIGNAL(clicked()), this, SLOT (move()));
  1521.     disconnect(array[1][1], SIGNAL(clicked()), this, SLOT (move()));
  1522.     disconnect(array[1][2], SIGNAL(clicked()), this, SLOT (move()));
  1523.     disconnect(array[2][0], SIGNAL(clicked()), this, SLOT (move()));
  1524.     disconnect(array[2][1], SIGNAL(clicked()), this, SLOT (move()));
  1525.     disconnect(array[2][2], SIGNAL(clicked()), this, SLOT (move()));
  1526. }
  1527.  
  1528. void View::connect_error_start()
  1529. {
  1530.     connect(array[0][0], SIGNAL(clicked()), this, SLOT (error_start()));
  1531.     connect(array[0][1], SIGNAL(clicked()), this, SLOT (error_start()));
  1532.     connect(array[0][2], SIGNAL(clicked()), this, SLOT (error_start()));
  1533.     connect(array[1][0], SIGNAL(clicked()), this, SLOT (error_start()));
  1534.     connect(array[1][1], SIGNAL(clicked()), this, SLOT (error_start()));
  1535.     connect(array[1][2], SIGNAL(clicked()), this, SLOT (error_start()));
  1536.     connect(array[2][0], SIGNAL(clicked()), this, SLOT (error_start()));
  1537.     connect(array[2][1], SIGNAL(clicked()), this, SLOT (error_start()));
  1538.     connect(array[2][2], SIGNAL(clicked()), this, SLOT (error_start()));
  1539. }
  1540.  
  1541. void View::disconnect_error_start()
  1542. {
  1543.     disconnect(array[0][0], SIGNAL(clicked()), this, SLOT (error_start()));
  1544.     disconnect(array[0][1], SIGNAL(clicked()), this, SLOT (error_start()));
  1545.     disconnect(array[0][2], SIGNAL(clicked()), this, SLOT (error_start()));
  1546.     disconnect(array[1][0], SIGNAL(clicked()), this, SLOT (error_start()));
  1547.     disconnect(array[1][1], SIGNAL(clicked()), this, SLOT (error_start()));
  1548.     disconnect(array[1][2], SIGNAL(clicked()), this, SLOT (error_start()));
  1549.     disconnect(array[2][0], SIGNAL(clicked()), this, SLOT (error_start()));
  1550.     disconnect(array[2][1], SIGNAL(clicked()), this, SLOT (error_start()));
  1551.     disconnect(array[2][2], SIGNAL(clicked()), this, SLOT (error_start()));
  1552. }
  1553.  
  1554. void View::connect_error_restart()
  1555. {
  1556.     connect(array[0][0], SIGNAL(clicked()), this, SLOT (error_restart()));
  1557.     connect(array[0][1], SIGNAL(clicked()), this, SLOT (error_restart()));
  1558.     connect(array[0][2], SIGNAL(clicked()), this, SLOT (error_restart()));
  1559.     connect(array[1][0], SIGNAL(clicked()), this, SLOT (error_restart()));
  1560.     connect(array[1][1], SIGNAL(clicked()), this, SLOT (error_restart()));
  1561.     connect(array[1][2], SIGNAL(clicked()), this, SLOT (error_restart()));
  1562.     connect(array[2][0], SIGNAL(clicked()), this, SLOT (error_restart()));
  1563.     connect(array[2][1], SIGNAL(clicked()), this, SLOT (error_restart()));
  1564.     connect(array[2][2], SIGNAL(clicked()), this, SLOT (error_restart()));
  1565. }
  1566.  
  1567. void View::disconnect_error_restart()
  1568. {
  1569.     disconnect(array[0][0], SIGNAL(clicked()), this, SLOT (error_restart()));
  1570.     disconnect(array[0][1], SIGNAL(clicked()), this, SLOT (error_restart()));
  1571.     disconnect(array[0][2], SIGNAL(clicked()), this, SLOT (error_restart()));
  1572.     disconnect(array[1][0], SIGNAL(clicked()), this, SLOT (error_restart()));
  1573.     disconnect(array[1][1], SIGNAL(clicked()), this, SLOT (error_restart()));
  1574.     disconnect(array[1][2], SIGNAL(clicked()), this, SLOT (error_restart()));
  1575.     disconnect(array[2][0], SIGNAL(clicked()), this, SLOT (error_restart()));
  1576.     disconnect(array[2][1], SIGNAL(clicked()), this, SLOT (error_restart()));
  1577.     disconnect(array[2][2], SIGNAL(clicked()), this, SLOT (error_restart()));
  1578. }
  1579.  
  1580. void View::on_radioButton_move_X_clicked()
  1581. {
  1582.     ui->label_start->setText("");
  1583.  
  1584.     game.zeroing_logic();
  1585.     zeroing_view();
  1586.     the_end = false;
  1587.     ui->button_start->setVisible(true);
  1588.     ui->button_restart->setVisible(false);
  1589.  
  1590.     disconnect_move();
  1591.     disconnect_error_restart();
  1592.     disconnect_error_start();
  1593.     connect_error_start();
  1594. }
  1595.  
  1596. void View::on_radioButton_move_O_clicked()
  1597. {
  1598.     ui->label_start->setText("");
  1599.  
  1600.     game.zeroing_logic();
  1601.     zeroing_view();
  1602.     the_end = false;
  1603.     ui->button_start->setVisible(true);
  1604.     ui->button_restart->setVisible(false);
  1605.  
  1606.     disconnect_move();
  1607.     disconnect_error_restart();
  1608.     disconnect_error_start();
  1609.     connect_error_start();
  1610. }
  1611.  
  1612. void View::score()
  1613. {
  1614.     if(gameMode == 0 && ui->radioButton_move_X->isChecked())
  1615.     {
  1616.         if(game.get_result() == "X")
  1617.         {
  1618.             game.set_score_0_1(game.get_score_0_1() + 1);
  1619.             ui->label_score_1->setNum(game.get_score_0_1());
  1620.         }
  1621.         if(game.get_result() == "O")
  1622.         {
  1623.             game.set_score_0_2(game.get_score_0_2() + 1);
  1624.             ui->label_score_2->setNum(game.get_score_0_2());
  1625.         }
  1626.     }
  1627.  
  1628.     if(gameMode == 0 && ui->radioButton_move_O->isChecked())
  1629.     {
  1630.         if(game.get_result() == "X")
  1631.         {
  1632.             game.set_score_0_2(game.get_score_0_2() + 1);
  1633.             ui->label_score_2->setNum(game.get_score_0_2());
  1634.         }
  1635.         if(game.get_result() == "O")
  1636.         {
  1637.             game.set_score_1_1(game.get_score_0_1() + 1);
  1638.             ui->label_score_1->setNum(game.get_score_0_1());
  1639.         }
  1640.     }
  1641. }
  1642.  
  1643. void View::on_button_reset_clicked()
  1644. {
  1645.     if(gameMode == 0)
  1646.     {
  1647.         game.set_score_0_1(0);
  1648.         game.set_score_0_2(0);
  1649.     }
  1650.     else
  1651.     {
  1652.         game.set_score_1_1(0);
  1653.         game.set_score_1_2(0);
  1654.     }
  1655.  
  1656.     ui->label_score_1->setNum(0);
  1657.     ui->label_score_2->setNum(0);
  1658. }
  1659.  
  1660. void View::on_button_1_plus_clicked()
  1661. {
  1662.     game.set_score_1_1(game.get_score_1_1() + 1);
  1663.     ui->label_score_1->setNum(game.get_score_1_1());
  1664. }
  1665.  
  1666. void View::on_button_2_plus_clicked()
  1667. {
  1668.     game.set_score_1_2(game.get_score_1_2() + 1);
  1669.     ui->label_score_2->setNum(game.get_score_1_2());
  1670. }
  1671.  
  1672. void View::on_button_1_minus_clicked()
  1673. {
  1674.     if(game.get_score_1_1() > 0)
  1675.     {
  1676.         game.set_score_1_1(game.get_score_1_1() - 1);
  1677.         ui->label_score_1->setNum(game.get_score_1_1());
  1678.     }
  1679. }
  1680.  
  1681. void View::on_button_2_minus_clicked()
  1682. {
  1683.     if(game.get_score_1_2() > 0)
  1684.     {
  1685.         game.set_score_1_2(game.get_score_1_2() - 1);
  1686.         ui->label_score_2->setNum(game.get_score_1_2());
  1687.     }
  1688. }
Advertisement
Add Comment
Please, Sign In to add comment