软件工程大作业——数独游戏1
一、PSP表格
二、问题分析
三、系统设计
四、具体实现
五、单元测试
六、程序性能及质量分析
七、GUI
八、总结
代码地址:https://github.com/friyal0730/sudoku/
这篇文章主要是第一部分PSP表格、第二部分问题分析和第三部分系统设计
一、psp表格
PSP2.1 | Personal Software Progress Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | ||
Estimate | 估计这个任务需要多少时间 | 20 | 30 |
Development | 开发 | ||
Analysis | 需求分析(包括学习新技术) | 180 | 150 |
Design Spec | 生成设计文档 | 120 | |
Review | 设计复审(和同事审核设计文档) | 30 | |
Coding Standard | 代码规范 | 120 | |
Design | 具体设计 | 180 | |
Coding | 具体编码 | 900 | |
Code Review | 代码复审 | 300 | |
Test | 测试(自我测试,修改代码,提交更改) | 300 | |
Reporting | 报告 | ||
Test Report | 测试报告 | 60 | |
Size Measurement | 计算工作量 | 30 | |
Postmortem & Process Improvement | 事后总结,并提出过程改进计划 | 120 | |
Total | 合计 | 2360 |
二、问题分析
1、需求分析
经过研究,我认为软件需要满足的需求如下:
- 生成不重复的数独终盘(0<N<=1000000)
- 生成数独题目(0<N<=100000)
- 读取数独问题,求解,将结果输出(0<N<=1000000)
2、解决方法:
经过查阅资料,我确定的方法如下:
- 生成数独终盘:分为随机法和矩阵转换法。其中,随机法在数据量大时,时间复杂度过大,效率过低。所以我选择矩阵转换法,利用对已有的数独终盘矩阵的行、列和数字的交换,生成新的数据矩阵,能够充分利用矩阵特性,且十分高效。这种方法也可以保证能够输出1000000个不同的数独。证明如下:
对于一个9乘9的矩阵,要保证左上角的第一个数字为(3+7)%9+1=2不变 - 对于行的变换:第一行不变,剩下的行在同一行的九宫格范围内进行变换,共有2x3!x3!=72种方法
- 对于列的变换: 第一列不变,同理共有2x3!x3!=72种方法
- 对于数字的变换:除了2以外,剩下每个数字两两交换一次,共有8!=40320种方法
因为 72x72x40320>1000000,所以可以产生不重复且第一个字为2的数独终盘
- 生成数独题目:随机挖空,但挖空的数量不能太少也不能太多。经过我的观察,数独题目中空位的数量大约是30至42个。所以我挖空的具体方法为:首先在每个小九宫格中挖两个空,然后再随机挖空,第二步挖的空有可能与第一步挖过的某些空重复,保证整个数独题目最少有30个空,最多有42个空
- 解数独题目:回溯法,用dfs来解决
三、系统设计
三个功能,就需要分为三个模块,使用面向对象的方法对其进行分析和建模。
-
用例图
分析需求中的使用者,分为用户和管理员,根据需求描述,画出用例图如下:
、 -
类图
需求描述中设计到的类与对象包括:用户需求解决类(solve)、数独终盘生成类(base)、数独问题求解类(answer)。 功能需求中,第二个功能并没有在用户需求中直接体现出来,所以我将其另作为一个程序。画出的类图如下:
-
顺序图
生成数独终盘的过程顺序图如下:
求解数独的过程顺序图如下: