qt实现9×9数独游戏

2023-11-04

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


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

qt实现9×9数独游戏 的相关文章

随机推荐

  • vue把el-dialog提取出来作为子组件,并实现父组件和子组件相互传值

    最近做项目遇到了一个需求是 为了防止组件中代码冗长 需要将el dialog对话弹出框单独封装成子组件 并将父组件中的id传递给子组件 子组件再根据id刷新父组件 具体项目代码太长 这里仅记录一下实现思路 01 把el dialog提取出来
  • 初识kafka---Kafka从入门到精通(一)

    Kafka中的消息是以topic进行分类的 生产者生产消息 消费者消费消息都是面向topic 而每个topic里面都是有分区的概念 一个topic有三个分区 而每个分区都是有分区leader partition leader 和partit
  • http协议详解

    本篇博文主要介绍HTTP请求 响应的系列过程 包括四个部分 是在陆续学习中觉着之间有关联总结下来的 以便自己今后忘记后可以快速查看也为各位看到这篇文章的朋友们梳理一下知识 下面 正文开始 作为一个前端开发人员 我们每天都在与页面打交道 那么
  • 源码编译安装httpd-2.4.39

    环境 apr 1 7 0 tar bz2 apr util 1 6 1 tar bz2 httpd 2 4 39 tar bz2 1 合并源码文件 tar xvf apr 1 7 0 tar bz2 tar xvf apr util 1 6
  • 2020-12-13 51单片机笔记

    单片机型号选择错误 该STC软件左上角的单片机型号 显示不出来 LCD1602显示屏插反 extern uchar time 报错没定义 在其他文件运用时也要加上uchar time 不能直接使用 下图是错误案例 在 c文件定义变量 然后在
  • 华为eNSP配置PPP协议中的CHAP认证

    CHAP认证 CHAP认证过程比较复杂 三次握手机制 使用密文格式发送CHAP认证信息 由认证方发起CHAP认证 有效避免暴力破解 在链路建立成功后具有再次认证检测机制 目前在企业网的远程接入环境中用的比较常见 两个路由器都要加模块 路由器
  • 把照片改成指定像素基于PS(证件照修改为制定像素大小)

    下图所示的图片当前宽度为1064像素 高度为1972像素 右键图片打开 属性 对话框可查看尺寸 接下来我们想将图片尺寸改为宽度1000像素 高度1000像素 同时图片不能变形 操作步骤 1 打开PS软件 按Ctrl N组合键打开 新建文档
  • [译]Android 中 Kotlin 与 RecyclerView 高性能列表

    翻译说明 原标题 Kotlin RecyclerView for High Performance Lists in Android 原文地址 www andreasjakl com 原文作者 Andreas Jakl RecyclerVi
  • nginx 配置 http, https可以同时访问(报错: The plain HTTP request was sent to HTTPS port)

    Aphorism full stack 前言 最近微信项目升级 https 域名 购买好域名后 开放 443 端口后 http 访问竟然出错了 The plain HTTP request was sent to HTTPS port 导致
  • crypto-js 加密、解密使用方法,复制就能用

    一 安装crypto js npm install crypto js 二 封装加密方法 单独在js中封装一个js存放这个方法 后期使用再引入 import CryptoJS from crypto js let aesKeyInfo ke
  • algorithm头文件下的函数

    非修改性序列操作 12个 循环 对序列中的每个元素执行某操作 for each 查找 在序列中找出某个值的第一次出现的位置 find 在序列中找出符合某谓词的第一个元素 find if 在序列中找出一子序列的最后一次出现的位置 find e
  • anaconda

    卸载 直接删除 下载 ENTER anaconda3 和 conda 然后清除 bashrc 中conda相关的字段 安装 sudo Anaconda3 5 2 0 Linux x86 64 sh u u表示覆盖安装 中是默认值 询问过程要
  • proc文件系统探索 之 根目录下的文件[七]

    主要参考内核文档和红帽文档对 gt cat proc meminfo 读出的内核信息进行解释 下篇文章会简单对读出该信息的代码进行简单的分析 MemTotal 507480 kBMemFree 10800 kBBuffers 34728 k
  • 【C语言】课程设计实训——人事管理系统

    目录 题目 总体设计 详细设计 系统实现 题目 1 需求分析 人事档案信息采用文件存储 要提供文件的输入输出操作 根据学院人事的变动情况 可添加或删除记录 因而要提供文件的添加删除操作 能根据编号和姓名进档案查询 所提供文件的查找操作 可以
  • NC01--股票(一次交易)、合并k个有序链表、字符串的排列、接雨水问题、输出二叉树的右视图

    1 股票 一次交易 https www nowcoder com practice 64b4262d4e6d4f6181cd45446a5821ec tpId 117 tqId 37717 rp 1 ru activity oj qru t
  • 递归的基本运用与实践

    一 递归的概念 简单的说 递归就是方法自己调用自己 每次调用时传入不同的变量 递归有利于编程者解决复杂的问题 同时可以让代码变得简洁 二 递归调用机制 入门案例 累加代码实现 public static int accumulation i
  • 基于Java对STOMP服务端进行测试

    目录 一 目标 二 服务端改动 三 测试程序 3 1 依赖 3 1 用户量和消息数 3 2 测试端口是否可用 3 3 客户端连接 订阅测试 3 4 数据发布 断开连接测试 四 消费者会话处理程序 五 生产者会话处理程序 六 测试结果 一 目
  • B/S三层架构[转载]

    三层架构 3 tier application 通常意义上的三层架构就是将整个业务应用划分为 表现层 UI 业务逻辑层 BLL 数据访问层 DAL 区分层次的目的即为了 高内聚 低耦合 的思想 表现层 UI 通俗讲就是展现给用户的界面 即用
  • 多态的理解

    多态的概念 多态的概念 简单来讲 多态的意思就是多种形态 或者说 去完成某个行为 当不同的对象去完成时会产生出不同的状态 也可以理解为我们人去完成同一件事情 但是每一个人去完成 都会产生不一样的结果 多态构成的条件 1 必须通过父类的指针或
  • qt实现9×9数独游戏

    qt实现的数独小游戏 资源有可下载直接跑的exe enigma已经打包好 源码可私信 部分代码 include widget h include ui widget h include form h include