2025年4月18日 星期五 乙巳(蛇)年 正月十九 设为首页 加入收藏
rss
您当前的位置:首页 > 计算机 > 编程开发 > Qt

qt实现9×9数独游戏

时间:09-16来源:作者:点击数:31
城东书院 www.cdsy.xyz

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);//新建一个91
  • 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;
  • }
城东书院 www.cdsy.xyz
方便获取更多学习、工作、生活信息请关注本站微信公众号城东书院 微信服务号城东书院 微信订阅号
推荐内容
相关内容
栏目更新
栏目热门
本栏推荐