图形界面数独游戏
一、项目背景
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.程序运行效果截图