编程大实践 数独破解 #Cilay #嵩天

发布于:2022-11-28 ⋅ 阅读:(440) ⋅ 点赞:(0)

图形界面数独游戏

一、项目背景

1.数独

**数独(Sudoku)**是一种数学逻辑游戏,游戏由9×9个格子组成,玩家需要根据格子提供的数字推理出其他格子的数字。

这种游戏只需要逻辑思维能力,与数字运算无关,所以数学不好的人也很适合。

虽然玩法简单,但提供的数字却千变万化,所以不少教育者认为数独是锻炼脑筋的好方法。

数独游戏由美国自由拼图发明者Howard Garns于1979年发明,日本出版商Nikoli于1986年发展,意思为“每个格子只有一个数字”。

数独规则:

数独游戏由九个3*3的九宫格呈3*3排列,构成9*9小格的矩阵,每个小格中只能填入1-9中的一个数字,对于数字的位置有如下限制:

  • 矩阵的每一行包含1-9的每一个数字,且不能重复

  • 矩阵每一列的数字不能重复(要求同行)

  • 每一个3*3的九宫格内,数字不能重复

一个填好的9*9矩阵称为终盘(Endgame),在终盘中去掉部分数字,供解谜者填写,称为初盘

2.图形用户界面

图形用户界面(Graphical User Interface,缩写:GUI)是指采用图形方式显示的计算机操作用户界面。

与早期计算机使用的命令行界面相比,除了降低用户的操作负担之外,对于新用户而言,图形界面对于用户来说在视觉上更易于接受,学习成本大幅下降,也让电脑的大众化得以实现。

虽然图形用户界面已经成为现代电脑的主要界面,然而这界面必定要透过在显示器的特定位置,以“各种美观、而不单调的视觉消息”提示用户“状态的改变”,势必得比简单的文字消息呈现,花上更多的电脑运算能力,计算“要改变显示器哪些光点,变成哪些颜色”,功能命令的设计也比较复杂,现代操作系统的图形复杂程度更远超早期的GUI。

3.QT

Qt是一个跨平台的C++应用程序开发框架。广泛用于开发GUI程序,这种情况下又被称为部件工具箱。也可用于开发非GUI程序,例如控制台工具和服务器。

Qt 被用于 OPIE、Skype、VLC media player、Adobe Photoshop Elements、VirtualBox与Mathematica以及被Autodesk、欧洲空间局、梦工厂、Google、HP、KDE、卢卡斯影业、西门子公司、沃尔沃集团,华特迪士尼动画制作公司、三星集团、飞利浦、Panasonic所使用。它是 Digia 公司的产品。

Qt使用标准的C++和特殊的代码生成扩展以及一些宏。通过语言绑定,其他的编程语言也可以使用Qt。 Qt是自由且开放源代码的软件,在GNU宽通用公共许可证(LGPL)条款下发布。所有版本都支持广泛的编译器,包括GCC的C++编译器和Visual Studio。

官方网站:Qt | Cross-platform software development for embedded & desktop

4.PyQT

PyQt 是一组用于Qt 公司的Qt 应用程序框架的 Python 绑定,可在 Qt支持的所有平台上运行,包括 Windows、macOS、Linux、iOS 和 Android。

PyQt6 支持 Qt v6,PyQt5 支持 Qt v5,PyQt4 支持 Qt v4。绑定是作为一组 Python 模块实现的,包含 1,000 多个类。

项目地址:PyQt5 · PyPI

二、项目目标

1.主要目标

编写一个拥有图形界面的数独游戏,功能包括:

  • 游戏主要界面、鼠标/键盘交互操作

  • 游戏过程控制(新建游戏、加载问题、重新开始、退出等)

  • 支持自动游戏求解

2.目标分解

  • 编写图像用户界面

  • 根据添加相关功能

三、技术选型

1.问题:图形界面框架如何选择?

Python常用第三方GUI图形界面框架如下,推荐使用PyQT、TKinter、PySimpleGUI来构建。

  • PyQT

  • TKinter

  • WxPython

  • PySide

  • Kivy

  • PySimpleGUI

2.问题:数独生成算法有那几种?

一般有两种数独生成算法:

  • 矩阵变换:对一个正确的终盘使用随机的矩阵变换,得到一个合乎规范的新终盘,此方法随机程度较差,结果与初始差别不大

  • 自动生成:利用求解算法,先随机填入一些初始格,后交给求解算法得到终盘

3.问题:数独求解算法有那几种?

目前,主流的数独求解算法有以下几种:

  • 暴力搜索:(效率低)

  • 舞蹈链算法:使用交叉链表优化搜索的算法

  • 基于约束满足问题的搜索算法:使用启发式函数优化搜索流程,使更快得解

  • 推理算法:使用逻辑推理的形式,推出问题内容,适用于简单数独求解,复杂数独将无法求解

四、课堂要求

1.提交项目结构

--javascripttypescriptbashsqljsonhtmlcssccppjavarubypythongorustmarkdown

main.py           项目执行主文件
README.md					项目描述说明文档
requirements.txt	项目依赖包版本号(项目需要下载到本地执行,如果有第三方依赖包,必须填写)

2.标注核心算法函数位置

--javascripttypescriptbashsqljsonhtmlcssccppjavarubypythongorustmarkdown

# 破解算法 位于main.py文件 第102行
def sudoku():
  	pass

3.程序运行效果截图

 

本文含有隐藏内容,请 开通VIP 后查看