qt实现9×9数独游戏

news2025/1/16 11:06:58

qt实现的数独小游戏,资源有可下载直接跑的exe(enigma已经打包好),源码可私信

在这里插入图片描述
部分代码

#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;
}


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/896709.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数据结构——二叉搜索树(附带C++实现版本)

文章目录 二叉搜索树概念 二叉树的实际应用二叉树模拟实现存储结构二叉搜索树构成二叉搜索树的查找插入操作中序遍历二叉树的删除循环(利用左子树最右节点&#xff09;递归(利用右子树根节点) 二叉树拷贝二叉树资源的销毁 二叉树实现完整代码总结 二叉搜索树 概念 二叉搜索树…

LVS-DR+keepalived实现高可用负载群集

VRRP 通信原理&#xff1a; VRRP就是虚拟路由冗余协议&#xff0c;它的出现就是为了解决静态路由的单点故障。 VRRP是通过一种竞选的一种协议机制&#xff0c;来将路由交给某台VRRP路由。 VRRP用IP多播的方式&#xff08;多播地址224.0.0.18&#xff09;来实现高可用的通信&…

opencv运动目标检测-背景建模

背景建模 帧差法 由于场景中的目标在运动&#xff0c;目标的影像在不同图像帧中的位置不同。该类算法对时间上连续的两帧图像进行差分运算&#xff0c;不同帧对应的像素点相减&#xff0c;判断灰度差的绝对值&#xff0c;当绝对值超过一定阈值时&#xff0c;即可判断为运动目…

Java虚拟机(JVM):垃圾收集算法

目录 一、分代收集理论 二、标记-清除算法 三、标记-复制算法 四、标记-整理算法 一、分代收集理论 分代收集理论建立在两个分代假说之上&#xff1a; 1、弱分代假说&#xff1a;绝大多数对象都是朝生夕灭的。 2、强分代假说&#xff1a;熬过越多次垃圾收集过程的对象就…

Python中数据结构列表详解

列表是最常用的 Python 数据类型&#xff0c;它用一个方括号内的逗号分隔值出现&#xff0c;列表的数据项不需要具有相同的类型。 列表中的每个值都有对应的位置值&#xff0c;称之为索引&#xff0c;第一个索引是 0&#xff0c;第二个索引是 1&#xff0c;依此类推。列表都可…

C语言之指针进阶篇(1)

目录​​​​​​​ 引言 字符指针 指针数组 数组指针 数组指针的定义 &数组名vs数组名 数组指针的使用 一维数组使用 二维数组使用 一维数组传参 二维数组传参 总结 数组参数 一维数组传参 二维数组传参 指针参数 一级指针传参 二级指针传参 引言 今…

Jmeter对websocket进行测试

JMeterWebSocketSampler-1.0.2-SNAPSHOT.jar下载 公司使用websocket比较奇怪&#xff0c;需要带认证信息进行长连接&#xff0c;通过websocket插件是请求失败&#xff0c;如下图&#xff0c;后面通过代码实现随再打包jar包完成websocket测试 本地实现代码如下&#xff1a; pa…

总结,由于顺丰的问题,产生了电脑近期一个月死机问题集锦

由于我搬家&#xff0c;我妈搞顺丰发回家&#xff0c;但是没有检查有没有坏&#xff0c;并且我自己由于不可抗力因素&#xff0c;超过了索赔时间&#xff0c;反馈给顺丰客服&#xff0c;说超过了造成了无法索赔的情况&#xff0c;现在总结发生了损坏配件有几件&#xff0c;显卡…

Java 项目日志实例基础:Log4j

点击下方关注我&#xff0c;然后右上角点击...“设为星标”&#xff0c;就能第一时间收到更新推送啦~~~ 介绍几个日志使用方面的基础知识。 1 Log4j 1、Log4j 介绍 Log4j&#xff08;log for java&#xff09;是 Apache 的一个开源项目&#xff0c;通过使用 Log4j&#xff0c;我…

奥威BI数据可视化工具:个性化定制,打造独特大屏

每个人都有自己独特的审美&#xff0c;因此即使是做可视化大屏&#xff0c;也有很多人希望做出不一样的报表&#xff0c;用以缓解审美疲劳的同时提高报表浏览效率。因此这也催生出了数据可视化工具的个性化可视化大屏制作需求。 奥威BI数据可视化工具&#xff1a;个性化定制&a…

nginx代理webSocket链接响应403

一、场景 使用nginx代理webSocket链接&#xff0c;nginx响应403 1、nginx访问日志响应403 [18/Aug/2023:09:56:36 0800] "GET /FS_WEB_ASS/webim_api/socket/message HTTP/1.1" 403 5 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit…

opencv-dnn

# utils_words.txt 标签文件 import osimage_types (".jpg", ".jpeg", ".png", ".bmp", ".tif", ".tiff")def list_images(basePath, containsNone):# return the set of files that are validreturn list_file…

机器学习|决策树:数学原理及代码解析

机器学习&#xff5c;决策树&#xff1a;数学原理及代码解析 决策树是一种常用的监督学习算法&#xff0c;适用于解决分类和回归问题。在本文中&#xff0c;我们将深入探讨决策树的数学原理&#xff0c;并提供 Python 示例代码帮助读者更好地理解和实现该算法。 决策树数学原…

大语言模型-RLHF(七)-PPO实践(Proximal Policy Optimization)原理实现代码逐行注释

从open AI 的论文可以看到&#xff0c;大语言模型的优化&#xff0c;分下面三个步骤&#xff0c;SFT&#xff0c;RM&#xff0c;PPO&#xff0c;我们跟随大神的步伐&#xff0c;来学习一下这三个步骤和代码实现&#xff0c;本章介绍PPO实践。 生活中&#xff0c;我们经常会遇到…

数字化时代,数据仓库和商业智能BI系统演进的五个阶段

数字化在逐渐成熟的同时&#xff0c;社会上也对数字化的性质有了进一步认识。当下&#xff0c;数字化除了前边提到的将复杂的信息、知识转化为可以度量的数字、数据&#xff0c;在将其转化为二进制代码&#xff0c;引入计算机内部&#xff0c;建立数据模型&#xff0c;统一进行…

Java数据库连接池原理及spring boot使用数据库连接池(HikariCP、Druid)

和线程池类似&#xff0c;数据库连接池的作用是建立一些和数据库的连接供需要连接数据库的业务使用&#xff0c;避免了每次和数据库建立、销毁连接的性能消耗&#xff0c;通过设置连接池参数可以防止建立连接过多导致服务宕机等&#xff0c;以下介绍Java中主要使用的几种数据库…

IP 地址监控工具

地址监控实用程序是一套 IP 工具&#xff0c;包括 IP 地址监控工具、流氓检测工具和 MAC 地址解析器&#xff0c;用于日常监控和管理 DNS 名称、IP和 MAC 地址。地址监控工具用于 IP监控&#xff0c;用于管理 DNS 名称、网络的 IP 和 MAC 地址&#xff0c;并跟踪 IP 地址。 IP…

基于基于springboot+vue+B2C模式的电子商务平台【源码+论文+演示视频+包运行成功】

博主介绍&#xff1a;✌csdn特邀作者、博客专家、java领域优质创作者、博客之星&#xff0c;擅长Java、微信小程序、Python、Android等技术&#xff0c;专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推…

Unity 物体的运动之跟随鼠标

你想让鼠标点击哪里&#xff0c;你的运动的对象就运动到哪里吗&#xff1f; Please follow me ! 首先&#xff0c;你要先添加一个Plane ,以及你的围墙&#xff0c;你的移动的物体 想要实现跟随鼠标移动&#xff0c;我们先创建一个脚本 using System.Collections; using Syst…

Coremail参与编制|《信创安全发展蓝皮书——系统安全分册(2023年)》

信创安全发展蓝皮书 近日&#xff0c;Coremail参与编制的《信创安全发展蓝皮书—系统安全分册&#xff08;2023年&#xff09;》重磅发布。 此次信创安全发展蓝皮书由工业和信息化部电子第五研究所联合大数据协同安全技术国家工程研究中心重磅共同发布。 本次蓝皮书涵盖信创系…