Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include "tiktoktoe.h"
- #include "ui_tiktoktoe.h"
- #define ERROR QPair<char,int>(-1,-1)
- tiktoktoe::tiktoktoe(QWidget *parent)
- : QWidget(parent)
- , ui(new Ui::tiktoktoe)
- {
- ui->setupUi(this);
- ui->pushButton->hide();
- ui->checkBox->hide();
- setFixedSize(210,350);
- ui->radioButton->click();
- }
- /*
- masiv[0][0] = pushButton_4;
- masiv[0][1] = pushButton_8;
- masiv[0][2] = pushButton_9;
- masiv[1][0] = pushButton_2;
- masiv[1][1] = pushButton_7;
- masiv[1][2] = pushButton_10;
- masiv[2][0] = pushButton_5;
- masiv[2][1] = pushButton_6;
- masiv[2][2] = pushButton_11
- */
- /*
- matrix это
- _\_\_
- _\_\_
- \ \
- сетка(поле) для крестиков ноликов ,изначально заполнена числами от 2 до 10 включительно
- поэтому matrix[...][...] > 1 означает что клетка пустая
- */
- tiktoktoe::~tiktoktoe()
- {
- delete ui;
- }
- void tiktoktoe::randomMove()
- {
- for(;;)
- {
- int oneRandIndex = rand()%3;
- int twoRandIndex = rand()%3;
- if(matrix[oneRandIndex][twoRandIndex] > 1)
- {
- ui->masiv[oneRandIndex][twoRandIndex]->click();
- return;
- }
- }
- }
- QPair<char , int> tiktoktoe::check2(char *_matrix)
- {
- char simbol = -1; //символы из которых состоит 2 одинаковые клетки линии если такая имеется
- int location = -1;//расположение пустой клетки если условие ниже выполняется
- if((_matrix[0] == _matrix[1]) || (_matrix[1] == _matrix[2]) || (_matrix[0] == _matrix[2]))
- {
- for(int q = 0;q<3;q++)
- {
- if(_matrix[q] > 1)
- {
- location = q;
- }
- }
- }
- for(int q=0;q<3 && location != -1;q++)
- {
- if(q != location)
- {
- simbol = _matrix[q];
- break;
- }
- }
- return QPair<char , int>(simbol,location); // если возвращает QPair<char,int>(-1,-1) значит предвыйгрышной ситуации в
- //данных 3 клетках нет
- }
- void tiktoktoe::computerEnemy()
- {
- if(matrix[1][1] > 1)//скрипт занимания центра если он свободен
- {
- ui->masiv[1][1]->click();
- return;
- }
- char _matrix[3];
- for(int i = 0;i < 3;i++)
- {
- for(int a=0;a < 3;a++)
- {
- _matrix[a] = matrix[i][a];
- }
- QPair<char,int> resul(check2(_matrix));
- if(resul != ERROR)
- {
- variants.push_back(QPair<char,QPushButton*>(resul.first,ui->masiv[i][resul.second]));
- }
- }
- for(int i = 0;i < 3;i++)
- {
- for(int a=0;a < 3;a++)
- {
- _matrix[a] = matrix[a][i];
- }
- QPair<char,int> resul(check2(_matrix));
- if(resul != ERROR)
- {
- variants.push_back(QPair<char,QPushButton*>(resul.first,ui->masiv[resul.second][i]));
- }
- }
- {//начало искусственного блока
- for (int a = 0;a < 3;a++)
- {
- _matrix[a] = matrix[a][a];
- }
- QPair<char,int> resul(check2(_matrix));
- if(resul != ERROR)
- {
- variants.push_back(QPair<char,QPushButton*>(resul.first,ui->masiv[resul.second][resul.second]));
- }
- _matrix[0] = matrix[0][2];
- _matrix[1] = matrix[1][1];
- _matrix[2] = matrix[2][0];
- }//конец искусственного блока
- QPair<char,int> resul(check2(_matrix));
- if(resul != QPair<char,int>(0,0))
- {
- switch (resul.second)
- {
- case (0):
- variants.push_back(QPair<char,QPushButton*>(resul.first,ui->masiv[resul.second][resul.second+2]));
- break;
- case (1):
- variants.push_back(QPair<char,QPushButton*>(resul.first,ui->masiv[resul.second][resul.second]));
- break;
- case (2):
- variants.push_back(QPair<char,QPushButton*>(resul.first,ui->masiv[resul.second][resul.second-2]));
- break;
- }
- }
- if(variants.size() != 0)
- {
- for(int i=0;i<variants.size();i++)
- {
- if(variants[i].first == move)//если превыйгрышная ситуация получается у стороны за которую играет робот
- { //то он её завершает в первую очередь
- variants[i].second->click();
- variants.clear();
- return;
- }
- }
- variants[rand()%variants.size()].second->click();
- variants.clear();
- return;
- }
- if((moveCounter == 1 || moveCounter == 3) && (matrix[1][1] == ((move+1)%2)))//скрипт предотвращения
- {//100% выйгрыша игрока если тот занял центр и хочет использовать 100% выйгрышную тактику у который только 1 способ предотвращения
- for(;;)//но тактика не сработает если бот будет ходит по диагоналям в начале
- {
- int oneRandIndex = (rand()%2)*2;
- int twoRandIndex = (rand()%2)*2;
- if(matrix[oneRandIndex][twoRandIndex] > 2)
- {
- ui->masiv[oneRandIndex][twoRandIndex]->click();
- return;
- }
- }
- }
- randomMove();
- }
- void tiktoktoe::_end()
- {
- ui->pushButton->show();
- ui->label->setText(strMove + " победили!");
- for(int i=0;i<3;i++)
- {
- for (int a=0;a<3;a++)
- {
- ui->masiv[i][a]->setEnabled(false);
- }
- }
- }
- void tiktoktoe::checkWin()
- {
- moveCounter++;
- for(int i=0;i<3;i++)
- {
- if((matrix[i][0] == matrix[i][1]) && (matrix[i][0] == matrix[i][2]) && (matrix[i][1] == matrix[i][2]))
- {
- _end();
- return;
- }
- }
- for(int i=0;i<3;i++)
- {
- if((matrix[0][i] == matrix[1][i]) && (matrix[0][i] == matrix[2][i]) && (matrix[1][i] == matrix[2][i]))
- {
- _end();
- return;
- }
- }
- if(((matrix[0][0] == matrix[1][1]) && (matrix[0][0] == matrix[2][2]) && (matrix[1][1] == matrix[2][2])) || ((matrix[2][0] == matrix[0][2]) && (matrix[1][1] == matrix[0][2]) && (matrix[1][1] == matrix[2][0])))
- {
- _end();
- return;
- }
- if(moveCounter==9)
- {
- ui->pushButton->show();
- ui->label->setText("Ничья");
- return;
- }
- move = (1+move)%2;
- move == 0 ? strMove = "X" : strMove = "O";
- //2 cтроки ниже определяют ходит сейчас бот или нет
- bool moveComputerEnemy = playerIsFirst ? move == 1 ? true : false : move == 0 ? true : false;
- if(gameFromComputer && moveComputerEnemy)
- computerEnemy();
- }
- void tiktoktoe::on_pushButton_clicked() //функция очищения поля
- {
- char z = 2;
- for(int i = 0;i < 3;i++)
- {
- for(int a=0;a<3;a++)
- {
- matrix[i][a] = z++;
- }
- }
- for (int i =0;i < 3;i++)
- {
- for(int a=0;a<3;a++)
- {
- ui->masiv[i][a]->setText("");
- ui->masiv[i][a]->setEnabled(true);
- }
- }
- strMove = "X";
- moveCounter=0;
- move = 0;
- ui->label->clear();
- ui->pushButton->hide();
- }
- void tiktoktoe::on_radioButton_clicked()
- {
- gameFromComputer = false;
- ui->checkBox->hide();
- on_pushButton_clicked();
- }
- void tiktoktoe::on_radioButton_2_clicked()
- {
- gameFromComputer = true;
- ui->checkBox->show();
- ui->checkBox->setCheckState(Qt::Checked);
- on_pushButton_clicked();
- }
- void tiktoktoe::on_pushButton_4_clicked()
- {
- ui->pushButton_4->setEnabled(false);
- ui->pushButton_4->setText(strMove);
- matrix[0][0] = move;
- checkWin();
- }
- void tiktoktoe::on_pushButton_8_clicked()
- {
- ui->pushButton_8->setEnabled(false);
- ui->pushButton_8->setText(strMove);
- matrix[0][1] = move;
- checkWin();
- }
- void tiktoktoe::on_pushButton_9_clicked()
- {
- ui->pushButton_9->setEnabled(false);
- ui->pushButton_9->setText(strMove);
- matrix[0][2] = move;
- checkWin();
- }
- void tiktoktoe::on_pushButton_2_clicked()
- {
- ui->pushButton_2->setEnabled(false);
- ui->pushButton_2->setText(strMove);
- matrix[1][0] = move;
- checkWin();
- }
- void tiktoktoe::on_pushButton_7_clicked()
- {
- ui->pushButton_7->setEnabled(false);
- ui->pushButton_7->setText(strMove);
- matrix[1][1] = move;
- checkWin();
- }
- void tiktoktoe::on_pushButton_10_clicked()
- {
- ui->pushButton_10->setEnabled(false);
- ui->pushButton_10->setText(strMove);
- matrix[1][2] = move;
- checkWin();
- }
- void tiktoktoe::on_pushButton_5_clicked()
- {
- ui->pushButton_5->setEnabled(false);
- ui->pushButton_5->setText(strMove);
- matrix[2][0] = move;
- checkWin();
- }
- void tiktoktoe::on_pushButton_6_clicked()
- {
- ui->pushButton_6->setEnabled(false);
- ui->pushButton_6->setText(strMove);
- matrix[2][1] = move;
- checkWin();
- }
- void tiktoktoe::on_pushButton_11_clicked()
- {
- ui->pushButton_11->setEnabled(false);
- ui->pushButton_11->setText(strMove);
- matrix[2][2] = move;
- checkWin();
- }
- void tiktoktoe::on_checkBox_stateChanged(int) //если Qt::checked то игрок ходит первым иначе первым ходит бот
- {
- on_pushButton_clicked();
- if(ui->checkBox->checkState() == Qt::Checked)
- playerIsFirst = true;
- else
- {
- playerIsFirst = false;
- computerEnemy();
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement