Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #ifndef LOGIC_H
- #define LOGIC_H
- #include <QString>
- #include <QTime>
- class Logic
- {
- private:
- QString matrix_logic[3][3];
- QString result;
- int whose_move;
- int row;
- int column;
- int score_0_1;
- int score_0_2;
- int score_1_1;
- int score_1_2;
- public:
- Logic();
- QString get_matrix_logic(int i, int j);
- void set_matrix_logic(int i, int j, QString X_O);
- int get_whose_move();
- void set_whose_move(int temp);
- int get_score_0_1();
- int get_score_0_2();
- int get_score_1_1();
- int get_score_1_2();
- void set_score_0_1(int score);
- void set_score_0_2(int score);
- void set_score_1_1(int score);
- void set_score_1_2(int score);
- QString get_result();
- int get_row();
- int get_column();
- void set_row_column(QString name);
- void rand_move();
- int attack_O();
- int defense_O();
- int attack_X();
- int defense_X();
- bool full();
- bool win();
- void zeroing_logic();
- };
- #endif // LOGIC_H
- #ifndef VIEW_H
- #define VIEW_H
- #include <QMainWindow>
- #include <QPushButton>
- #include <QVector>
- #include <QGridLayout>
- #include <QFont>
- #include <QDebug>
- #include <QMessageBox>
- #include "logic.h"
- namespace Ui {
- class View;
- }
- class View : public QMainWindow
- {
- Q_OBJECT
- public:
- explicit View(QWidget *parent = nullptr);
- ~View();
- private slots:
- void error_start();
- void error_restart();
- void on_button_start_clicked();
- void on_button_restart_clicked();
- void on_radioButton_move_X_clicked();
- void on_radioButton_move_O_clicked();
- void on_button_reset_clicked();
- void on_button_1_plus_clicked();
- void on_button_2_plus_clicked();
- void on_button_1_minus_clicked();
- void on_button_2_minus_clicked();
- void score();
- void game_mode(const int & bufer);
- void move();
- void print(QPushButton *button);
- void print_computer_move();
- void end();
- void zeroing_view();
- void text_label_start();// для игры вдвоем
- void connect_move();
- void disconnect_move();
- void connect_error_restart();
- void disconnect_error_restart();
- void connect_error_start();
- void disconnect_error_start();
- private:
- Ui::View *ui;
- Logic game;
- QVector<QVector<QPushButton*>> array;
- bool the_end; // отвечает за конец
- int gameMode;
- };
- #endif // VIEW_H
- #include "logic.h"
- Logic::Logic()
- {
- whose_move = 0;
- row = 0;
- column = 0;
- score_0_1 = 0;
- score_0_2 = 0;
- score_1_1 = 0;
- score_1_2 = 0;
- for (int i = 0; i < 3; i++)
- {
- for (int j = 0; j < 3; j++)
- {
- matrix_logic[i][j] = "";
- }
- }
- }
- QString Logic::get_matrix_logic(int i, int j) // возвращает состояние клетки
- {
- return matrix_logic[i][j];
- }
- void Logic::set_matrix_logic(int i, int j,QString X_O) // возвращает состояние клетки
- {
- matrix_logic[i][j] = X_O;
- }
- int Logic::get_whose_move() // возвращает чей ход
- {
- return whose_move;
- }
- void Logic::set_whose_move(int temp) // устанавливает чей ход
- {
- whose_move = temp;
- }
- int Logic::get_score_0_1() // возвращает рекорд
- {
- return score_0_1;
- }
- int Logic::get_score_0_2() // возвращает рекорд
- {
- return score_0_2;
- }
- void Logic::set_score_0_1(int score)
- {
- score_0_1 = score;
- }
- void Logic::set_score_0_2(int score)
- {
- score_0_2 = score;
- }
- int Logic::get_score_1_1() // возвращает рекорд
- {
- return score_1_1;
- }
- int Logic::get_score_1_2() // возвращает рекорд
- {
- return score_1_2;
- }
- void Logic::set_score_1_1(int score)
- {
- score_1_1 = score;
- }
- void Logic::set_score_1_2(int score)
- {
- score_1_2 = score;
- }
- QString Logic::get_result() // возвращает результат игры
- {
- return result;
- }
- int Logic::get_row()
- {
- return row;
- }
- int Logic::get_column()
- {
- return column;
- }
- void Logic::set_row_column(QString name)
- {
- //row = ((QString)name.at(0)).toInt(); //альтернативная сокращенная запись
- QString i_str = name.at(0);
- QString j_str = name.at(1);
- row = i_str.toInt();
- column = j_str.toInt();
- }
- void Logic::rand_move()// делает рандомный ход
- {
- QTime time = QTime::currentTime();
- qsrand((uint)time.msec());
- int i, j;
- bool complete = false;
- while (!complete) // пока не "выполнено"
- {
- i = qrand() % 3;
- j = qrand() % 3;
- if (matrix_logic[i][j] == "") //если клетка пустая, делаем ход
- {
- if(whose_move % 2 == 0)
- {
- matrix_logic[i][j] = "X";
- row = i;
- column = j;
- }
- else
- {
- matrix_logic[i][j] = "O";
- row = i;
- column = j;
- }
- complete = true;
- }
- }
- }
- int Logic::attack_O() // атака O
- {
- int bufer_i = -1, bufer_j = -1; // для хранения соседнего элемента
- for (int i = 0; i < 3; i++) // в поле ищем O
- {
- for (int j = 0; j < 3; j++)
- {
- if (matrix_logic[i][j] == "O") //если нашли
- {
- if (!(i == 1 && j == 1) && matrix_logic[1][1] == "O") //если не в центре, но есть центральный элемент, по переводим на ситуацию "центр"
- goto center;
- if (i == 1 && j == 1) // если он в центре то
- {
- center:
- for (int q = 0; q < 3; q++) //ищем "Соседа", пропуская центр
- {
- for (int p = 0; p < 3; p++)
- {
- if (!(q == 1 && p == 1) && matrix_logic[q][p] == "O")// если нашли "Соседа" не в центре
- {
- bufer_i = q; //запоминаем индексы "Соседа"
- bufer_j = p;
- bufer_i = 1 - bufer_i; //находим "шаг"
- bufer_j = 1 - bufer_j;
- bufer_i = 1 + bufer_i; //находим индексы "недостоющей до тройки" ячейки
- bufer_j = 1 + bufer_j;
- if (matrix_logic[bufer_i][bufer_j] == "")//если эта ячейка пустая, то запоняем
- {
- matrix_logic[bufer_i][bufer_j] = "O";
- row = bufer_i;
- column = bufer_j;
- return 1;
- }
- }
- }
- }
- }
- if (i != 1 && j != 1 && matrix_logic[i][j] == "O") //если Х в углу, то ищем пару
- {
- int count = 0; //cчетчик кол-ва угловых элементов
- for (int q = 0; q < 3; q += 2) //считаем кол-во угловых элементов
- for (int p = 0; p < 3; p += 2)
- if (matrix_logic[q][p] == 'O')
- count++;
- if (count > 1) // если элементов 2 и больше, то ищем пары
- {
- if ((matrix_logic[0][0] == "O" && matrix_logic[2][2] == "O") || (matrix_logic[0][2] == "O" && matrix_logic[2][0] == "O")) //если пара диагональна
- {
- if (matrix_logic[1][1] == "") // и центр свободен, то ставим в центр
- {
- matrix_logic[1][1] = "O";
- row = 1;
- column = 1;
- return 1;
- }
- }
- //4 варианта соседих углов
- // если есть пара и элемент между ними свободен, то делаем этот ход
- if (matrix_logic[0][0] == "O" && matrix_logic[0][2] == "O" && matrix_logic[0][1] == "")
- {
- matrix_logic[0][1] = "O";
- row = 0;
- column = 1;
- return 1;
- }
- if (matrix_logic[0][0] == "O" && matrix_logic[2][0] == "O" && matrix_logic[1][0] == "")
- {
- matrix_logic[1][0] = "O";
- row = 1;
- column = 0;
- return 1;
- }
- if (matrix_logic[2][0] == "O" && matrix_logic[2][2] == "O" && matrix_logic[2][1] == "")
- {
- matrix_logic[2][1] = "O";
- row = 2;
- column = 1;
- return 1;
- }
- if (matrix_logic[0][2] == "O" && matrix_logic[2][2] == "O" && matrix_logic[1][2] == "")
- {
- matrix_logic[1][2] = "O";
- row = 1;
- column = 2;
- return 1;
- }
- }
- }
- if ((matrix_logic[1][0] == "O" && matrix_logic[1][2] == "O") || (matrix_logic[0][1] == "O" && matrix_logic[2][1] == "O")) //если пара противоположная
- {
- if (matrix_logic[1][1] == "O") // и центр свободен, то ставим в центр
- {
- matrix_logic[1][1] = "O";
- row = 1;
- column = 1;
- return 1;
- }
- }
- //8 ситуаций на соседние элементы
- if (matrix_logic[0][0] == "O" && matrix_logic[0][1] == "O" && matrix_logic[0][2] == "")
- {
- matrix_logic[0][2] = "O";
- row = 0;
- column = 2;
- return 1;
- }
- if (matrix_logic[0][1] == "O" && matrix_logic[0][2] == "O" && matrix_logic[0][0] == "")
- {
- matrix_logic[0][0] = "O";
- row = 0;
- column = 0;
- return 1;
- }
- if (matrix_logic[0][2] == "O" && matrix_logic[1][2] == "O" && matrix_logic[2][2] == "")
- {
- matrix_logic[2][2] = "O";
- row = 2;
- column = 2;
- return 1;
- }
- if (matrix_logic[1][2] == "O" && matrix_logic[2][2] == "O" && matrix_logic[0][2] == "")
- {
- matrix_logic[0][2] = "O";
- row = 0;
- column = 2;
- return 1;
- }
- if (matrix_logic[2][2] == "O" && matrix_logic[2][1] == "O" && matrix_logic[2][0] == "")
- {
- matrix_logic[2][0] = "O";
- row = 2;
- column = 0;
- return 1;
- }
- if (matrix_logic[2][0] == "O" && matrix_logic[2][1] == "O" && matrix_logic[2][2] == "")
- {
- matrix_logic[2][2] = "O";
- row = 2;
- column = 2;
- return 1;
- }
- if (matrix_logic[0][0] == "O" && matrix_logic[1][0] == "O" && matrix_logic[2][0] == "")
- {
- matrix_logic[2][0] = "O";
- row = 2;
- column = 0;
- return 1;
- }
- if (matrix_logic[1][0] == "O" && matrix_logic[2][0] == "O" && matrix_logic[0][0] == "")
- {
- matrix_logic[0][0] = "O";
- row = 0;
- column = 0;
- return 1;
- }
- return 2;
- }
- }
- }
- return 2; // при успешной атаке возвращает 1, если атака не произведена, то возвращает 2
- }
- int Logic::defense_O() // защита O
- {
- int bufer_i = -1, bufer_j = -1; // для хранения соседнего элемента
- for (int i = 0; i < 3; i++) // в поле ищем Х
- {
- for (int j = 0; j < 3; j++)
- {
- if (matrix_logic[i][j] == "X") //если нашли
- {
- if (!(i == 1 && j == 1) && matrix_logic[1][1] == "X") //если не в центре, но есть центральный элемент, по переводим на ситуацию "центр"
- goto center;
- if (i == 1 && j == 1) // если он в центре то
- {
- center:
- for (int q = 0; q < 3; q++) //ищем "Соседа", пропуская центр
- {
- for (int p = 0; p < 3; p++)
- {
- if (!(q == 1 && p == 1) && matrix_logic[q][p] == "X") // если нашли не в центре
- {
- bufer_i = q; //запоминаем индексы "Соседа"
- bufer_j = p;
- bufer_i = 1 - bufer_i; //находим "шаг"
- bufer_j = 1 - bufer_j;
- bufer_i = 1 + bufer_i; //находим индексы "недостоющей до тройки" ячейки
- bufer_j = 1 + bufer_j;
- if (matrix_logic[bufer_i][bufer_j] == "")//если эта ячейка пустая, то запоняем
- {
- matrix_logic[bufer_i][bufer_j] = "O";
- row = bufer_i;
- column = bufer_j;
- return 1;
- }
- }
- }
- }
- }
- if (i != 1 && j != 1 && matrix_logic[i][j] == "X") //если Х в углу, то ищем пару
- {
- int count = 0; //cчетчик кол-ва угловых элементов
- for (int q = 0; q < 3; q += 2) //считаем кол-во угловых элементов
- for (int p = 0; p < 3; p += 2)
- if (matrix_logic[q][p] == "X")
- count++;
- if (count > 1) // если элементов 2 и больше, то ищем пары
- {
- if ((matrix_logic[0][0] == "X" && matrix_logic[2][2] == "X") || (matrix_logic[0][2] == "X" && matrix_logic[2][0] == "X")) //если пара диагональна
- {
- if (matrix_logic[1][1] == "") // и центр свободен, то ставим в центр
- {
- matrix_logic[1][1] = "O";
- row = 1;
- column = 1;
- return 1;
- }
- }
- //4 варианта соседих углов
- // если есть пара и элемент между ними свободен, то делаем этот ход
- if (matrix_logic[0][0] == "X" && matrix_logic[0][2] == "X" && matrix_logic[0][1] == "")
- {
- matrix_logic[0][1] = "O";
- row = 0;
- column = 1;
- return 1;
- }
- if (matrix_logic[0][0] == "X" && matrix_logic[2][0] == "X" && matrix_logic[1][0] == "")
- {
- matrix_logic[1][0] = "O";
- row = 1;
- column = 0;
- return 1;
- }
- if (matrix_logic[2][0] == "X" && matrix_logic[2][2] == "X" && matrix_logic[2][1] == "")
- {
- matrix_logic[2][1] = "O";
- row = 2;
- column = 1;
- return 1;
- }
- if (matrix_logic[0][2] == "X" && matrix_logic[2][2] == "X" && matrix_logic[1][2] == "")
- {
- matrix_logic[1][2] = "O";
- row = 1;
- column = 2;
- return 1;
- }
- }
- }
- if ((matrix_logic[1][0] == "X" && matrix_logic[1][2] == "X") || (matrix_logic[0][1] == "X" && matrix_logic[2][1] == "X")) //если пара противоположная
- {
- if (matrix_logic[1][1] == "") // и центр свободен, то ставим в центр
- {
- matrix_logic[1][1] = "O";
- row = 1;
- column = 1;
- return 1;
- }
- }
- //8 ситуаций на соседние элементы
- if (matrix_logic[0][0] == "X" && matrix_logic[0][1] == "X" && matrix_logic[0][2] == "")
- {
- matrix_logic[0][2] = "O";
- row = 0;
- column = 2;
- return 1;
- }
- if (matrix_logic[0][1] == "X" && matrix_logic[0][2] == "X" && matrix_logic[0][0] == "")
- {
- matrix_logic[0][0] = "O";
- row = 0;
- column = 0;
- return 1;
- }
- if (matrix_logic[0][2] == "X" && matrix_logic[1][2] == "X" && matrix_logic[2][2] == "")
- {
- matrix_logic[2][2] = "O";
- row = 2;
- column = 2;
- return 1;
- }
- if (matrix_logic[1][2] == "X" && matrix_logic[2][2] == "X" && matrix_logic[0][2] == "")
- {
- matrix_logic[0][2] = "O";
- row = 0;
- column = 2;
- return 1;
- }
- if (matrix_logic[2][2] == "X" && matrix_logic[2][1] == "X" && matrix_logic[2][0] == "")
- {
- matrix_logic[2][0] = "O";
- row = 2;
- column = 0;
- return 1;
- }
- if (matrix_logic[2][0] == "X" && matrix_logic[2][1] == "X" && matrix_logic[2][2] == "")
- {
- matrix_logic[2][2] = "O";
- row = 2;
- column = 2;
- return 1;
- }
- if (matrix_logic[0][0] == "X" && matrix_logic[1][0] == "X" && matrix_logic[2][0] == "")
- {
- matrix_logic[2][0] = "O";
- row = 2;
- column = 0;
- return 1;
- }
- if (matrix_logic[1][0] == "X" && matrix_logic[2][0] == "X" && matrix_logic[0][0] == "")
- {
- matrix_logic[0][0] = "O";
- row = 0;
- column = 0;
- return 1;
- }
- rand_move(); //если нет в выше рассматриваемых ситуацях, то ходит рандомно
- return 1;
- }
- }
- }
- rand_move(); //если нет в выше рассматриваемых ситуацях, то рандомно
- return 1; // возвращает 1, когда ход сделан (ход делается в любос случае)
- }
- int Logic::attack_X() // атака Х
- {
- int bufer_i = -1, bufer_j = -1; // для хранения соседнего элемента
- for (int i = 0; i < 3; i++) // в поле ищем Х
- {
- for (int j = 0; j < 3; j++)
- {
- if (matrix_logic[i][j] == "X") // если нашли
- {
- if (!(i == 1 && j == 1) && matrix_logic[1][1] == "X") //если не в центре, но есть центральный элемент, по переводим на ситуацию "центр"
- goto center;
- if (i == 1 && j == 1) // если он в центре то
- {
- center:
- for (int q = 0; q < 3; q++) //ищем "Соседа", пропуская центр
- {
- for (int p = 0; p < 3; p++)
- {
- if (!(q == 1 && p == 1) && matrix_logic[q][p] == "X") //если нашли не в центре
- {
- bufer_i = q; //запоминаем индексы "Соседа"
- bufer_j = p;
- bufer_i = 1 - bufer_i; //находим "шаг"
- bufer_j = 1 - bufer_j;
- bufer_i = 1 + bufer_i; //находим индексы "недостоющей до тройки" ячейки
- bufer_j = 1 + bufer_j;
- if (matrix_logic[bufer_i][bufer_j] == "")//если эта ячейка пустая, то запоняем
- {
- matrix_logic[bufer_i][bufer_j] = "X";
- row = bufer_i;
- column = bufer_j;
- return 1;
- }
- }
- }
- }
- }
- if (i != 1 && j != 1 && matrix_logic[i][j] == "X") //если Х в углу, то ищем пару
- {
- int count = 0; //cчетчик кол-ва угловых элементов
- for (int q = 0; q < 3; q += 2) //считаем кол-во угловых элементов
- for (int p = 0; p < 3; p += 2)
- if (matrix_logic[q][p] == "X")
- count++;
- if (count > 1) // если элементов 2 и больше, то ищем пары
- {
- if ((matrix_logic[0][0] == "X" && matrix_logic[2][2] == "X") || (matrix_logic[0][2] == "X" && matrix_logic[2][0] == "X")) //если пара диагональна
- {
- if (matrix_logic[1][1] == "") // и центр свободен, то ставим в центр
- {
- matrix_logic[1][1] = "X";
- row = 1;
- column = 1;
- return 1;
- }
- }
- //4 варианта соседих углов
- // если есть пара и элемент между ними свободен, то делаем этот ход
- if (matrix_logic[0][0] == "X" && matrix_logic[0][2] == "X" && matrix_logic[0][1] == "")
- {
- matrix_logic[0][1] = "X";
- row = 0;
- column = 1;
- return 1;
- }
- if (matrix_logic[0][0] == "X" && matrix_logic[2][0] == "X" && matrix_logic[1][0] == "")
- {
- matrix_logic[1][0] = "X";
- row = 1;
- column = 0;
- return 1;
- }
- if (matrix_logic[2][0] == "X" && matrix_logic[2][2] == "X" && matrix_logic[2][1] == "")
- {
- matrix_logic[2][1] = "X";
- row = 2;
- column = 1;
- return 1;
- }
- if (matrix_logic[0][2] == "X" && matrix_logic[2][2] == "X" && matrix_logic[1][2] == "")
- {
- matrix_logic[1][2] = "X";
- row = 1;
- column = 2;
- return 1;
- }
- }
- }
- if ((matrix_logic[1][0] == "X" && matrix_logic[1][2] == "X") || (matrix_logic[0][1] == "X" && matrix_logic[2][1] == "X")) //если пара противоположная
- {
- if (matrix_logic[1][1] == "") // и центр свободен, то ставим в центр
- {
- matrix_logic[1][1] = "X";
- row = 1;
- column = 1;
- return 1;
- }
- }
- //8 ситуаций на соседние элементы
- if (matrix_logic[0][0] == "X" && matrix_logic[0][1] == "X" && matrix_logic[0][2] == "")
- {
- matrix_logic[0][2] = "X";
- row = 0;
- column = 2;
- return 1;
- }
- if (matrix_logic[0][1] == "X" && matrix_logic[0][2] == "X" && matrix_logic[0][0] == "")
- {
- matrix_logic[0][0] = "X";
- row = 0;
- column = 0;
- return 1;
- }
- if (matrix_logic[0][2] == "X" && matrix_logic[1][2] == "X" && matrix_logic[2][2] == "")
- {
- matrix_logic[2][2] = "X";
- row = 2;
- column = 2;
- return 1;
- }
- if (matrix_logic[1][2] == "X" && matrix_logic[2][2] == "X" && matrix_logic[0][2] == "")
- {
- matrix_logic[0][2] = "X";
- row = 0;
- column = 2;
- return 1;
- }
- if (matrix_logic[2][2] == "X" && matrix_logic[2][1] == "X" && matrix_logic[2][0] == "")
- {
- matrix_logic[2][0] = "X";
- row = 2;
- column = 0;
- return 1;
- }
- if (matrix_logic[2][0] == "X" && matrix_logic[2][1] == "X" && matrix_logic[2][2] == "")
- {
- matrix_logic[2][2] = "X";
- row = 2;
- column = 2;
- return 1;
- }
- if (matrix_logic[0][0] == "X" && matrix_logic[1][0] == "X" && matrix_logic[2][0] == "")
- {
- matrix_logic[2][0] = "X";
- row = 2;
- column = 0;
- return 1;
- }
- if (matrix_logic[1][0] == "X" && matrix_logic[2][0] == "X" && matrix_logic[0][0] == "")
- {
- matrix_logic[0][0] = "X";
- row = 0;
- column = 0;
- return 1;
- }
- return 2;
- }
- }
- }
- // при успешной атаке возвращает 1, если атака не произведена, то возвращает 2
- return 2;
- }
- int Logic::defense_X() // защита X
- {
- int bufer_i = -1, bufer_j = -1; // для хранения соседнего элемента
- for (int i = 0; i < 3; i++) // в поле ищем O
- {
- for (int j = 0; j < 3; j++)
- {
- if (matrix_logic[i][j] == "O") // если нашли
- {
- if (!(i == 1 && j == 1) && matrix_logic[1][1] == "O") //если не в центре, но есть центральный элемент, по переводим на ситуацию "центр"
- goto center;
- if (i == 1 && j == 1) // если он в центре то
- {
- center:
- for (int q = 0; q < 3; q++) //ищем "Соседа", пропуская центр
- {
- for (int p = 0; p < 3; p++)
- {
- if (!(q == 1 && p == 1) && matrix_logic[q][p] == "O") // если нашли не в центре
- {
- bufer_i = q; //запоминаем индексы "Соседа"
- bufer_j = p;
- bufer_i = 1 - bufer_i; //находим "шаг"
- bufer_j = 1 - bufer_j;
- bufer_i = 1 + bufer_i; //находим индексы "недостоющей до тройки" ячейки
- bufer_j = 1 + bufer_j;
- if (matrix_logic[bufer_i][bufer_j] == "")//если эта ячейка пустая, то запоняем
- {
- matrix_logic[bufer_i][bufer_j] = "X";
- row = bufer_i;
- column = bufer_j;
- return 1;
- }
- }
- }
- }
- }
- if (i != 1 && j != 1 && matrix_logic[i][j] == "O") //если Х в углу, то ищем пару
- {
- int count = 0; //cчетчик кол-ва угловых элементов
- for (int q = 0; q < 3; q += 2) //считаем кол-во угловых элементов
- for (int p = 0; p < 3; p += 2)
- if (matrix_logic[q][p] == "O")
- count++;
- if (count > 1) // если элементов 2 и больше, то ищем пары
- {
- if ((matrix_logic[0][0] == "O" && matrix_logic[2][2] == "O") || (matrix_logic[0][2] == "O" && matrix_logic[2][0] == "O")) //если пара диагональна
- {
- if (matrix_logic[1][1] == "") // и центр свободен, то ставим в центр
- {
- matrix_logic[1][1] = "X";
- row = 1;
- column = 1;
- return 1;
- }
- }
- //4 варианта соседих углов
- // если есть пара и элемент между ними свободен, то делаем этот ход
- if (matrix_logic[0][0] == "O" && matrix_logic[0][2] == "O" && matrix_logic[0][1] == "")
- {
- matrix_logic[0][1] = "X";
- row = 0;
- column = 1;
- return 1;
- }
- if (matrix_logic[0][0] == "O" && matrix_logic[2][0] == "O" && matrix_logic[1][0] == "")
- {
- matrix_logic[1][0] = "X";
- row = 1;
- column = 0;
- return 1;
- }
- if (matrix_logic[2][0] == "O" && matrix_logic[2][2] == "O" && matrix_logic[2][1] == "")
- {
- matrix_logic[2][1] = "X";
- row = 2;
- column = 1;
- return 1;
- }
- if (matrix_logic[0][2] == "O" && matrix_logic[2][2] == "O" && matrix_logic[1][2] == "")
- {
- matrix_logic[1][2] = "X";
- row = 1;
- column = 2;
- return 1;
- }
- }
- }
- if ((matrix_logic[1][0] == "O" && matrix_logic[1][2] == "O") || (matrix_logic[0][1] == "O" && matrix_logic[2][1] == "O")) //если пара противоположная
- {
- if (matrix_logic[1][1] == "") // и центр свободен, то ставим в центр
- {
- matrix_logic[1][1] = "X";
- row = 1;
- column = 1;
- return 1;
- }
- }
- //8 ситуаций на соседние элементы
- if (matrix_logic[0][0] == "O" && matrix_logic[0][1] == "O" && matrix_logic[0][2] == "")
- {
- matrix_logic[0][2] = "X";
- row = 0;
- column = 2;
- return 1;
- }
- if (matrix_logic[0][1] == "O" && matrix_logic[0][2] == "O" && matrix_logic[0][0] == "")
- {
- matrix_logic[0][0] = "X";
- row = 0;
- column = 0;
- return 1;
- }
- if (matrix_logic[0][2] == "O" && matrix_logic[1][2] == "O" && matrix_logic[2][2] == "")
- {
- matrix_logic[2][2] = "X";
- row = 2;
- column = 2;
- return 1;
- }
- if (matrix_logic[1][2] == "O" && matrix_logic[2][2] == "O" && matrix_logic[0][2] == "")
- {
- matrix_logic[0][2] = "X";
- row = 0;
- column = 2;
- return 1;
- }
- if (matrix_logic[2][2] == "O" && matrix_logic[2][1] == "O" && matrix_logic[2][0] == "")
- {
- matrix_logic[2][0] = "X";
- row = 2;
- column = 0;
- return 1;
- }
- if (matrix_logic[2][0] == "O" && matrix_logic[2][1] == "O" && matrix_logic[2][2] == "")
- {
- matrix_logic[2][2] = "X";
- row = 2;
- column = 2;
- return 1;
- }
- if (matrix_logic[0][0] == "O" && matrix_logic[1][0] == "O" && matrix_logic[2][0] == "")
- {
- matrix_logic[2][0] = "X";
- row = 2;
- column = 0;
- return 1;
- }
- if (matrix_logic[1][0] == "O" && matrix_logic[2][0] == "O" && matrix_logic[0][0] == "")
- {
- matrix_logic[0][0] = "X";
- row = 0;
- column = 0;
- return 1;
- }
- rand_move(); //если нет в выше рассматриваемых ситуациях, то делает рандомный ход
- return 1;
- }
- }
- }
- rand_move(); //если нет в выше рассматриваемых ситуациях, то делает рандомный ход
- return 1; // возвращает 1, когда ход сделан (ход делается в любос случае)
- }
- bool Logic::full() //проверяет на заполненность
- {
- for (int i = 0; i < 3; i++)
- for (int j = 0; j < 3; j++)
- if (matrix_logic[i][j] == "") // если найдено хоть одно свободное поле,
- return false; // то возвращием false
- result = "N"; //присваем резальтату "Ничью"
- return true;
- }
- bool Logic::win() // проверяет на победу
- {
- bool complete = false;
- //если найдена победная комбинация, то "результату" присваеваем значение победной комбинации
- if (matrix_logic[0][0] == matrix_logic[0][1] && matrix_logic[0][1] == matrix_logic[0][2] && matrix_logic[0][0] != "")
- {
- complete = true;
- result = matrix_logic[0][0];
- }
- if (matrix_logic[1][0] == matrix_logic[1][1] && matrix_logic[1][1] == matrix_logic[1][2] && matrix_logic[1][0] != "")
- {
- complete = true;
- result = matrix_logic[1][0];
- }
- if (matrix_logic[2][0] == matrix_logic[2][1] && matrix_logic[2][1] == matrix_logic[2][2] && matrix_logic[2][0] != "")
- {
- complete = true;
- result = matrix_logic[2][0];
- }
- if (matrix_logic[0][0] == matrix_logic[1][0] && matrix_logic[1][0] == matrix_logic[2][0] && matrix_logic[0][0] != "")
- {
- complete = true;
- result = matrix_logic[0][0];
- }
- if (matrix_logic[0][1] == matrix_logic[1][1] && matrix_logic[1][1] == matrix_logic[2][1] && matrix_logic[0][1] != "")
- {
- complete = true;
- result = matrix_logic[0][1];
- }
- if (matrix_logic[0][2] == matrix_logic[1][2] && matrix_logic[1][2] == matrix_logic[2][2] && matrix_logic[0][2] != "")
- {
- complete = true;
- result = matrix_logic[0][2];
- }
- if (matrix_logic[0][0] == matrix_logic[1][1] && matrix_logic[1][1] == matrix_logic[2][2] && matrix_logic[0][0] != "")
- {
- complete = true;
- result = matrix_logic[0][0];
- }
- if (matrix_logic[0][2] == matrix_logic[1][1] && matrix_logic[1][1] == matrix_logic[2][0] && matrix_logic[0][2] != "")
- {
- complete = true;
- result = matrix_logic[0][2];
- }
- //возвращает true если победа, если игра продолжается, то false
- return complete;
- }
- void Logic::zeroing_logic()
- {
- whose_move = 0;
- for (int i = 0; i < 3; i++)
- {
- for (int j = 0; j < 3; j++)
- {
- matrix_logic[i][j] = "";
- }
- }
- }
- #include "view.h"
- #include <QApplication>
- int main(int argc, char *argv[])
- {
- QApplication a(argc, argv);
- View w;
- w.show();
- return a.exec();
- }
- #include "view.h"
- #include "ui_view.h"
- View::View(QWidget *parent) :
- QMainWindow(parent),
- ui(new Ui::View)
- {
- ui->setupUi(this);
- this->setStyleSheet("background-color: rgb(170, 170, 255);");
- array.resize(3);
- for (int i = 0; i < 3; i++)
- {
- array[i].resize(3);
- }
- for (int i = 0; i < 3; i++)
- {
- for (int j = 0; j < 3; j++)
- {
- QPushButton* button = new QPushButton;
- QString name = QString::number(i) + QString::number(j);
- button->setObjectName(name);
- button->setText("");
- button->setFixedSize(120,120);
- button->setStyleSheet("QPushButton{background:rgb(255, 255, 255)}");
- array[i][j] = button;
- ui->gridLayout->addWidget (button, i, j);
- }
- }
- ui->button_restart->setVisible(false);
- ui->button_1_plus->setVisible(false);
- ui->button_2_plus->setVisible(false);
- ui->button_1_minus->setVisible(false);
- ui->button_2_minus->setVisible(false);
- connect(ui->comboBox_gameMode, SIGNAL(currentIndexChanged(const int &)), this, SLOT (game_mode(const int &)));
- gameMode = 0;
- ui->radioButton_move_X->setChecked(true);
- connect_error_start();
- game.set_whose_move(0);
- the_end = false;
- }
- View::~View()
- {
- delete ui;
- }
- void View::game_mode(const int & bufer)
- {
- gameMode = bufer;
- ui->label_start->setText("");
- game.zeroing_logic();
- zeroing_view();
- the_end = false;
- ui->button_start->setVisible(true);
- ui->button_restart->setVisible(false);
- disconnect_move();
- disconnect_error_restart();
- disconnect_error_start();
- connect_error_start();
- if(gameMode == 0)
- {
- ui->radioButton_move_X->setVisible(true);
- ui->radioButton_move_O->setVisible(true);
- ui->button_1_plus->setVisible(false);
- ui->button_2_plus->setVisible(false);
- ui->button_1_minus->setVisible(false);
- ui->button_2_minus->setVisible(false);
- ui->label_text_1->setText("Вы:");
- ui->label_text_2->setText("Компьютер:");
- ui->label_score_1->setNum(game.get_score_0_1());
- ui->label_score_2->setNum(game.get_score_0_2());
- }
- else
- {
- ui->radioButton_move_X->setVisible(false);
- ui->radioButton_move_O->setVisible(false);
- ui->button_1_plus->setVisible(true);
- ui->button_2_plus->setVisible(true);
- ui->button_1_minus->setVisible(true);
- ui->button_2_minus->setVisible(true);
- ui->label_text_1->setText("Игрок 1:");
- ui->label_text_2->setText("Игрок 2:");
- ui->label_score_1->setNum(game.get_score_1_1());
- ui->label_score_2->setNum(game.get_score_1_2());
- }
- }
- void View::error_start()
- {
- QMessageBox :: information(this, "Ошибка", "Нажмите кнопку \"Начать\"!");
- }
- void View::error_restart()
- {
- QMessageBox :: information(this, "Ошибка", "Нажмите кнопку \"Заново\"\nИли выберете другой режим игры!");
- }
- void View::text_label_start()
- {
- if(game.get_whose_move() % 2 == 0)
- {
- ui->label_start->setStyleSheet("QLabel{color: rgb(200, 0, 0)}");
- ui->label_start->setText("Ходят X!");
- }
- else
- {
- ui->label_start->setStyleSheet("QLabel{color: blue}");
- ui->label_start->setText("Ходят O!");
- }
- }
- void View::on_button_start_clicked()
- {
- game.set_whose_move(0);
- if(gameMode == 0)
- {
- if(ui->radioButton_move_X->isChecked())
- {
- ui->label_start->setStyleSheet("QLabel{color: rgb(200, 0, 0)}");
- ui->label_start->setText("Игра началась,\nВы играете X!");
- }
- else
- {
- ui->label_start->setStyleSheet("QLabel{color: blue}");
- ui->label_start->setText("Игра началась,\nВы играете O!");
- }
- }
- else
- {
- ui->label_start->setStyleSheet("QLabel{color: rgb(200, 0, 0)}");
- ui->label_start->setText("Игра началась,\nПервыми ходят X!");
- }
- ui->button_start->setVisible(false);
- disconnect_error_start();
- connect_move();
- if(ui->radioButton_move_O->isChecked() && gameMode == 0)
- {
- game.rand_move();// делаем случайный ход
- print(array[game.get_row()][game.get_column()]);
- game.set_whose_move(1);
- }
- }
- void View::move()
- {
- QPushButton *button = (QPushButton *)sender();
- QString name = sender()->objectName();
- game.set_row_column(name); // устанавливаем индексы
- if(gameMode == 0)// если с компом
- {
- if(game.get_matrix_logic(game.get_row(), game.get_column()) != "X" && game.get_matrix_logic(game.get_row(), game.get_column()) != "O")
- {
- print(button);
- game.set_matrix_logic(game.get_row(), game.get_column(),button->text());
- game.set_whose_move(game.get_whose_move() + 1);//изменяем "Чей ход"
- if(!game.win() && !game.full())
- {
- if(ui->radioButton_move_X->isChecked())//если играем крестиками
- {
- if (game.attack_O() == 2)// если атака не выполнилась, то выполняем защиту
- game.defense_O();
- }
- else // если играем ноликами
- {
- if (game.attack_X() == 2)// если атака не выполнилась, то выполняем защиту
- game.defense_X();
- }
- print_computer_move();
- }
- else
- {
- end();
- }
- if((game.win() || game.full()) && the_end == false)
- {
- end();
- }
- }
- }
- else if (gameMode == 1)// если с человеком
- {
- if(!game.win() && !game.full())
- {
- print(button);
- game.set_matrix_logic(game.get_row(), game.get_column(),button->text());
- game.set_whose_move(game.get_whose_move() + 1);
- text_label_start();
- }
- else
- {
- end();
- }
- if((game.win() || game.full()) && the_end == false)
- {
- end();
- }
- }
- }
- void View::print(QPushButton *button)
- {
- if(game.get_whose_move() % 2 == 0)
- {
- button->setText("X");
- button->setStyleSheet("QPushButton{background:rgb(255, 255, 255);color: red}");
- QFont f = button->font(); //QFont определяет шрифт, используемый для рисования текста//Font() берет шрифт кнопки
- f.setPointSize(80); //Устанавливает шрифт
- f.setBold(true); //делает жирным (Принимает bool да/нет)
- button->setFont(f);// устанавливает шрифт по переменной f
- }
- else
- {
- button->setText("O");
- button->setStyleSheet("QPushButton {background:rgb(255, 255, 255);color: blue}");
- QFont f = button->font(); //QFont определяет шрифт, используемый для рисования текста//Font() берет шрифт кнопки
- f.setPointSize(80); //Устанавливает шрифт
- f.setBold(true); //делает жирным (Принимает bool да/нет)
- button->setFont(f);// устанавливает шрифт по переменной f
- }
- }
- void View::print_computer_move()
- {
- print(array[game.get_row()][game.get_column()]);
- game.set_whose_move(game.get_whose_move() + 1);
- }
- void View::end()
- {
- the_end = true;
- ui->button_restart->setVisible(true);
- if(game.get_result() == "X")
- {
- ui->label_start->setStyleSheet("QLabel{color: rgb(200, 0, 0)}");
- ui->label_start->setText("Игра закончена,\nПобедили X!");
- }
- else if(game.get_result() == "O")
- {
- ui->label_start->setStyleSheet("QLabel{color: blue}");
- ui->label_start->setText("Игра закончена,\nПобедили O!");
- }
- else
- {
- ui->label_start->setStyleSheet("QLabel{color: rgb(0, 85, 0);}");
- ui->label_start->setText("Игра закончена,\nНичья!");
- }
- score();
- disconnect_move();
- connect_error_restart();
- }
- void View::zeroing_view()
- {
- for (int i = 0; i < 3; i++)
- {
- for (int j = 0; j < 3; j++)
- {
- array[i][j]->setText("");
- }
- }
- }
- void View::on_button_restart_clicked()
- {
- the_end = false;
- ui->button_restart->setVisible(false);
- game.set_whose_move(0);
- game.zeroing_logic();
- zeroing_view();
- if(gameMode == 0)
- {
- if(ui->radioButton_move_X->isChecked())
- {
- ui->label_start->setStyleSheet("QLabel{color: rgb(200, 00, 0)}");
- ui->label_start->setText("Игра началась,\nВы играете X!");
- }
- else
- {
- ui->label_start->setStyleSheet("QLabel{color: blue}");
- ui->label_start->setText("Игра началась,\nВы играете O!");
- }
- }
- else
- {
- ui->label_start->setStyleSheet("QLabel{color: rgb(200, 0, 0);}");
- ui->label_start->setText("Игра началась,\nПервыми ходят X!");
- }
- disconnect_error_restart();
- connect_move();
- if(ui->radioButton_move_O->isChecked() && gameMode == 0)
- {
- game.rand_move();// делаем случайный ход
- print(array[game.get_row()][game.get_column()]);
- game.set_whose_move(1);
- }
- }
- void View::connect_move()
- {
- connect(array[0][0], SIGNAL(clicked()), this, SLOT (move()));
- connect(array[0][1], SIGNAL(clicked()), this, SLOT (move()));
- connect(array[0][2], SIGNAL(clicked()), this, SLOT (move()));
- connect(array[1][0], SIGNAL(clicked()), this, SLOT (move()));
- connect(array[1][1], SIGNAL(clicked()), this, SLOT (move()));
- connect(array[1][2], SIGNAL(clicked()), this, SLOT (move()));
- connect(array[2][0], SIGNAL(clicked()), this, SLOT (move()));
- connect(array[2][1], SIGNAL(clicked()), this, SLOT (move()));
- connect(array[2][2], SIGNAL(clicked()), this, SLOT (move()));
- }
- void View::disconnect_move()
- {
- disconnect(array[0][0], SIGNAL(clicked()), this, SLOT (move()));
- disconnect(array[0][1], SIGNAL(clicked()), this, SLOT (move()));
- disconnect(array[0][2], SIGNAL(clicked()), this, SLOT (move()));
- disconnect(array[1][0], SIGNAL(clicked()), this, SLOT (move()));
- disconnect(array[1][1], SIGNAL(clicked()), this, SLOT (move()));
- disconnect(array[1][2], SIGNAL(clicked()), this, SLOT (move()));
- disconnect(array[2][0], SIGNAL(clicked()), this, SLOT (move()));
- disconnect(array[2][1], SIGNAL(clicked()), this, SLOT (move()));
- disconnect(array[2][2], SIGNAL(clicked()), this, SLOT (move()));
- }
- void View::connect_error_start()
- {
- connect(array[0][0], SIGNAL(clicked()), this, SLOT (error_start()));
- connect(array[0][1], SIGNAL(clicked()), this, SLOT (error_start()));
- connect(array[0][2], SIGNAL(clicked()), this, SLOT (error_start()));
- connect(array[1][0], SIGNAL(clicked()), this, SLOT (error_start()));
- connect(array[1][1], SIGNAL(clicked()), this, SLOT (error_start()));
- connect(array[1][2], SIGNAL(clicked()), this, SLOT (error_start()));
- connect(array[2][0], SIGNAL(clicked()), this, SLOT (error_start()));
- connect(array[2][1], SIGNAL(clicked()), this, SLOT (error_start()));
- connect(array[2][2], SIGNAL(clicked()), this, SLOT (error_start()));
- }
- void View::disconnect_error_start()
- {
- disconnect(array[0][0], SIGNAL(clicked()), this, SLOT (error_start()));
- disconnect(array[0][1], SIGNAL(clicked()), this, SLOT (error_start()));
- disconnect(array[0][2], SIGNAL(clicked()), this, SLOT (error_start()));
- disconnect(array[1][0], SIGNAL(clicked()), this, SLOT (error_start()));
- disconnect(array[1][1], SIGNAL(clicked()), this, SLOT (error_start()));
- disconnect(array[1][2], SIGNAL(clicked()), this, SLOT (error_start()));
- disconnect(array[2][0], SIGNAL(clicked()), this, SLOT (error_start()));
- disconnect(array[2][1], SIGNAL(clicked()), this, SLOT (error_start()));
- disconnect(array[2][2], SIGNAL(clicked()), this, SLOT (error_start()));
- }
- void View::connect_error_restart()
- {
- connect(array[0][0], SIGNAL(clicked()), this, SLOT (error_restart()));
- connect(array[0][1], SIGNAL(clicked()), this, SLOT (error_restart()));
- connect(array[0][2], SIGNAL(clicked()), this, SLOT (error_restart()));
- connect(array[1][0], SIGNAL(clicked()), this, SLOT (error_restart()));
- connect(array[1][1], SIGNAL(clicked()), this, SLOT (error_restart()));
- connect(array[1][2], SIGNAL(clicked()), this, SLOT (error_restart()));
- connect(array[2][0], SIGNAL(clicked()), this, SLOT (error_restart()));
- connect(array[2][1], SIGNAL(clicked()), this, SLOT (error_restart()));
- connect(array[2][2], SIGNAL(clicked()), this, SLOT (error_restart()));
- }
- void View::disconnect_error_restart()
- {
- disconnect(array[0][0], SIGNAL(clicked()), this, SLOT (error_restart()));
- disconnect(array[0][1], SIGNAL(clicked()), this, SLOT (error_restart()));
- disconnect(array[0][2], SIGNAL(clicked()), this, SLOT (error_restart()));
- disconnect(array[1][0], SIGNAL(clicked()), this, SLOT (error_restart()));
- disconnect(array[1][1], SIGNAL(clicked()), this, SLOT (error_restart()));
- disconnect(array[1][2], SIGNAL(clicked()), this, SLOT (error_restart()));
- disconnect(array[2][0], SIGNAL(clicked()), this, SLOT (error_restart()));
- disconnect(array[2][1], SIGNAL(clicked()), this, SLOT (error_restart()));
- disconnect(array[2][2], SIGNAL(clicked()), this, SLOT (error_restart()));
- }
- void View::on_radioButton_move_X_clicked()
- {
- ui->label_start->setText("");
- game.zeroing_logic();
- zeroing_view();
- the_end = false;
- ui->button_start->setVisible(true);
- ui->button_restart->setVisible(false);
- disconnect_move();
- disconnect_error_restart();
- disconnect_error_start();
- connect_error_start();
- }
- void View::on_radioButton_move_O_clicked()
- {
- ui->label_start->setText("");
- game.zeroing_logic();
- zeroing_view();
- the_end = false;
- ui->button_start->setVisible(true);
- ui->button_restart->setVisible(false);
- disconnect_move();
- disconnect_error_restart();
- disconnect_error_start();
- connect_error_start();
- }
- void View::score()
- {
- if(gameMode == 0 && ui->radioButton_move_X->isChecked())
- {
- if(game.get_result() == "X")
- {
- game.set_score_0_1(game.get_score_0_1() + 1);
- ui->label_score_1->setNum(game.get_score_0_1());
- }
- if(game.get_result() == "O")
- {
- game.set_score_0_2(game.get_score_0_2() + 1);
- ui->label_score_2->setNum(game.get_score_0_2());
- }
- }
- if(gameMode == 0 && ui->radioButton_move_O->isChecked())
- {
- if(game.get_result() == "X")
- {
- game.set_score_0_2(game.get_score_0_2() + 1);
- ui->label_score_2->setNum(game.get_score_0_2());
- }
- if(game.get_result() == "O")
- {
- game.set_score_1_1(game.get_score_0_1() + 1);
- ui->label_score_1->setNum(game.get_score_0_1());
- }
- }
- }
- void View::on_button_reset_clicked()
- {
- if(gameMode == 0)
- {
- game.set_score_0_1(0);
- game.set_score_0_2(0);
- }
- else
- {
- game.set_score_1_1(0);
- game.set_score_1_2(0);
- }
- ui->label_score_1->setNum(0);
- ui->label_score_2->setNum(0);
- }
- void View::on_button_1_plus_clicked()
- {
- game.set_score_1_1(game.get_score_1_1() + 1);
- ui->label_score_1->setNum(game.get_score_1_1());
- }
- void View::on_button_2_plus_clicked()
- {
- game.set_score_1_2(game.get_score_1_2() + 1);
- ui->label_score_2->setNum(game.get_score_1_2());
- }
- void View::on_button_1_minus_clicked()
- {
- if(game.get_score_1_1() > 0)
- {
- game.set_score_1_1(game.get_score_1_1() - 1);
- ui->label_score_1->setNum(game.get_score_1_1());
- }
- }
- void View::on_button_2_minus_clicked()
- {
- if(game.get_score_1_2() > 0)
- {
- game.set_score_1_2(game.get_score_1_2() - 1);
- ui->label_score_2->setNum(game.get_score_1_2());
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment