qt实现的数独小游戏
部分代码
- #include "widget.h"
- #include "ui_widget.h"
- #include"form.h"
- #include<QDebug>
- #include<QPushButton>
- #include<QColor>
- #include<QString>
- #include<QDialog>
- #include<QAction>
- #include<QMessageBox>
- #include<QString>
- #include"mypushbutton.h"
- #define cout qDebug().noquote().nospace()
- void Widget::chooseOne(int r,int c)
- {
- QPoint point=this->cursor().pos();//获取鼠标位置
- Form* fm = new Form(point,0,this,r,c);//新建一个9选1的
- fm->exec();
- }
-
- void Widget::create(int cnt)
- {
- srand(time(nullptr));
- int mid[9]={0};
- bool use[9]={0};
- for(int i=0;i<9;i++)
- {
- bool flag=1;
- while(flag)
- {
- int tmp=(rand()%9+9)%9;
- if(!use[tmp])
- {
- use[tmp]=1;
- mid[i]=tmp;
- flag=0;
- }
- }
- }
- int num[9][9]=
- {
- {mid[8],mid[6],mid[7],mid[2],mid[0],mid[1],mid[5],mid[3],mid[4]},
- {mid[2],mid[0],mid[1],mid[5],mid[3],mid[4],mid[8],mid[6],mid[7]},
- {mid[5],mid[3],mid[4],mid[8],mid[6],mid[7],mid[2],mid[0],mid[1]},
- {mid[6],mid[7],mid[8],mid[0],mid[1],mid[2],mid[3],mid[4],mid[5]},
- {mid[0],mid[1],mid[2],mid[3],mid[4],mid[5],mid[6],mid[7],mid[8]},
- {mid[3],mid[4],mid[5],mid[6],mid[7],mid[8],mid[0],mid[1],mid[2]},
- {mid[7],mid[8],mid[6],mid[1],mid[2],mid[0],mid[4],mid[5],mid[3]},
- {mid[1],mid[2],mid[0],mid[4],mid[5],mid[3],mid[7],mid[8],mid[6]},
- {mid[4],mid[5],mid[3],mid[7],mid[8],mid[6],mid[1],mid[2],mid[0]}
- };
-
- for(int i=0;i<9;i++)
- {
- for(int j=0;j<9;j++)
- {
- num[i][j]++;
- set_Num(i,j,num[i][j]);
- }
- }
- bool s[81]={0};
- int count=0;
-
- while(count!=cnt)
- {
- int tmp=(rand()%81+81)%81;
- if(s[tmp]==0) s[tmp]=1,count++;
- }
-
- for(int i=0;i<9;i++)
- {
- for(int j=0;j<9;j++)
- {
- int tar=i*9+j;
- if(s[tar]==1)
- {
- _btn[i][j].setText(QString::number(num[i][j]));//这里的默认字体是灰色
-
- _btn[i][j].setEnabled(false);
- }
- }
- }
- }
-
- Widget::Widget(QWidget *parent)
- : QWidget(parent)
- , ui(new Ui::Widget)
- {
- ui->setupUi(this);
- this->setWindowTitle("数独游戏");
- QStringList color;
-
- color <<"background-color:rgb(255,192,203)"
- <<"background-color:rgb(255,255,255)"
- <<"background-color:rgb(255,192,203)"
- <<"background-color:rgb(255,255,255)"
- <<"background-color:rgb(255,192,203)"
- <<"background-color:rgb(255,255,255)"
- <<"background-color:rgb(255,192,203)"
- <<"background-color:rgb(255,255,255)"
- <<"background-color:rgb(255,192,203)";
- for(int r=0;r<9;r++)
- {
-
- for(int c=0;c<9;c++)
- {
- _btn[r][c].setFixedSize(65,65);
- QFont ft(nullptr,35);
- _btn[r][c].setFont(ft);
- _btn[r][c].setText("");
- _btn[r][c].setEnabled(true);
- int tor=r/3,toc=c/3;
- int tar=tor*3+toc;
- _btn[r][c].setStyleSheet(color[tar]);
- ui->gridLayout->addWidget(&_btn[r][c],r,c);
- connect(&_btn[r][c],&QPushButton::clicked,[=](){
- QPoint point=this->cursor().pos();
- Form* fm = new Form(point,0,this,r,c);
- fm->exec();
- });
- }
- }
-
- int cnt=0;//cnt是初始给玩家的梳数字数
- create(40);
- cnt=40;
- //点击游戏帮助后弹出一个消息对话框
- connect(ui->btn_help,&QPushButton::clicked,[=](){
- QMessageBox::information(this,"help","玩家需要根据9×"
- "9盘面上的已知数字,推理出所有剩余空格的数字,"
- "并满足每一行、每一列、每一个粗线宫(3*3)内的数"
- "字均含1-9,不重复。\n数独盘面是个九宫,每一宫又"
- "分为九个小格。"
- "在这八十一格中给出一定的已知数字和解题条"
- "件,利用逻辑和推理,在其他的空格上填入1-"
- "9的数字。使1-9每个数字在每一行、每一列和"
- "每一宫中都只出现一次,所以又称“九宫格”。\n"
- "鼠标点击每个小格子即可选择要填入的数字或者清除小格子的数字。\n点击提交答案即可检验你的答案是否正确"
- "。\n点击查看答案程序会自动为你填上最终答案。\n点击生成局面即能再来一局。\n");
- });
- //点击查看答案后填上最终答案
- connect(ui->btn_answer,&QPushButton::clicked,[=](){
- for(int i=0;i<9;i++)
- {
- for(int j=0;j<9;j++)
- {
- setNum(i,j,_num[i][j]);
- }
- }
- });
- //这里又copy了一遍上面create函数的代码,主要自己太懒了
- connect(ui->btn_create,&QPushButton::clicked,[=](){
- srand(time(nullptr));
- int mid[9]={0};
- bool use[9]={0};
- for(int i=0;i<9;i++)
- {
- bool flag=1;
- while(flag)
- {
- int tmp=(rand()%9+9)%9;
- if(!use[tmp])
- {
- use[tmp]=1;
- mid[i]=tmp;
- flag=0;
- }
- }
- }
- int num[9][9]=
- {
- {mid[8],mid[6],mid[7],mid[2],mid[0],mid[1],mid[5],mid[3],mid[4]},
- {mid[2],mid[0],mid[1],mid[5],mid[3],mid[4],mid[8],mid[6],mid[7]},
- {mid[5],mid[3],mid[4],mid[8],mid[6],mid[7],mid[2],mid[0],mid[1]},
- {mid[6],mid[7],mid[8],mid[0],mid[1],mid[2],mid[3],mid[4],mid[5]},
- {mid[0],mid[1],mid[2],mid[3],mid[4],mid[5],mid[6],mid[7],mid[8]},
- {mid[3],mid[4],mid[5],mid[6],mid[7],mid[8],mid[0],mid[1],mid[2]},
- {mid[7],mid[8],mid[6],mid[1],mid[2],mid[0],mid[4],mid[5],mid[3]},
- {mid[1],mid[2],mid[0],mid[4],mid[5],mid[3],mid[7],mid[8],mid[6]},
- {mid[4],mid[5],mid[3],mid[7],mid[8],mid[6],mid[1],mid[2],mid[0]}
- };
-
- for(int i=0;i<9;i++)
- {
- for(int j=0;j<9;j++)
- {
- num[i][j]++;
- }
- }
-
- bool s[81]={0};
- int count=0;
- while(count!=cnt)
- {
- int tmp=(rand()%81+81)%81;
- if(s[tmp]==0) s[tmp]=1,count++;
- }
-
- for(int i=0;i<9;i++)
- {
- for(int j=0;j<9;j++)
- {
- int tar=i*9+j;
- if(s[tar]==1)
- {
- _btn[i][j].setText(QString::number(num[i][j]));
-
- _btn[i][j].setEnabled(false);
- }
- else
- {
- _btn[i][j].setText("");
- _btn[i][j].setEnabled(true);
- }
-
- }
- }
- });
-
- connect(ui->btn_submit,&QPushButton::clicked,[=](){
- int col[9]={0},row[9]={0},cell[3][3]={0};
- bool flag=1;
- for(int i=0;i<9;i++)
- {
- for(int j=0;j<9;j++)
- {
- int num=_btn[i][j].text().toInt()-1;
- if(row[i]>>num&1||col[j]>>num&1||cell[i/3][j/3]>>num&1)
- {
- flag=0;
- }
- col[j]|=1<<num;
- row[i]|=1<<num;
- cell[i/3][j/3]|=1<<num;
- }
- }
- if(flag==1)
- {
- QMessageBox::information(this,"祝贺","成功通过");
- }
- else
- {
- QMessageBox::information(this,"真可惜","答案错误");
- }
- });
- }
- void Widget::setNum(int r, int c, int num)
- {
- _btn[r][c].setText(QString::number(num));
- }
-
- void Widget::clearNum(int r, int c)
- {
- _btn[r][c].setText("");
- }
-
- //这个可能等会就不用了
- bool Widget::check()
- {
- int col[9]={0},row[9]={0},cell[3][3]={0};
- for(int i=0;i<9;i++)
- {
- for(int j=0;j<9;j++)
- {
- int num=_btn[i][j].text().toInt()-1;
- if(col[i]>>num&1||col[j]>>num&1||cell[i/3][j/3]>>num&1)
- {
- return false;
- }
- col[j]|=1<<num;
- row[i]|=1<<num;
- cell[i/3][j/3]|=1<<num;
- }
- }
- return true;
- }
-
- Widget::~Widget()
- {
- delete ui;
- }
-
-
-