【软件工程基础】个人项目报告 | 数独终局生成及解决
项目地址
[github]链接: https://github.com/kindoms214/Sudoku.
项目要求
- 能够生成1-1e6个不一样的数独终局并输出到文件(命令:sudoku.exe -c abc)
- 读取文件中的数独问题,求解并将结果输出到文件(命令:sudoku.exe -s path)
- 附加题要求:为数独游戏生成一个GUI界面,能够生成任意数量的数独题目并依次显示,9*9棋盘上挖空数目30<=n<=60。用户可以在界面上方点击或输入完成数独题目。用户完成数独题目后可以得到反馈,知道自己的题目是否做对。
PSP表格
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planing | 计划 | 20 | |
Estimate | 估计这个任务需要多少时间 | 2520 | |
Development | 开发 | 1200 | |
Analysis | 需求分析(包括学习新技术) | 60 | |
Design Spec | 生成设计文档 | 30 | |
Design Review | 设计复审(和同事审核设计文档) | 30 | |
Coding Standard | 代码规范(为目前的开发制定合适的规范) | 30 | |
Design | 具体设计 | 240 | |
Coding | 具体编码 | 300 | |
Code Review | 代码复审 | 60 | |
Test | 测试(自我测试,修改代码,提交代码) | 240 | |
Reporting | 报告 | 120 | |
Test Report | 测试报告 | 150 | |
Size Measurement | 计算工作量 | 10 | |
Postmortem & Process Improvement Plan | 事后总结,并提出过程改进计划 | 30 | |
合计 | 2520 |
一、软件可行性分析时期
选择完项目之后的第一步,就是可行性分析。可行性分析包含四个要点:技术可行性,经济可行性,操作可行性,法律可行性。
- 技术可行性:结合自己的项目经历以及个人能力的评估,在选择完大作业的题目之后,我决定使用C++语言进行项目的开发。虽然别的满足要求的编程语言如Java和python可能在某一方面的优势更大,但我自身没有使用这两种语言进行完成项目开发的经历,所以还是选择了C++。
- 经济可行性:由于是校内课程的大作业,开发环境之类的也无需额外的花费,所以从经济层面上讲,项目的开发是可进行的。
- 操作可行性:对于题目的基本要求:1)生成1~1e6个不同的数独终局 2)能够求解数独。在软件开发完成之后,用户根据项目说明中的操作方法使用软件是能够正确的运行软件的,即使是输入的命令行有误也能够得到相应的错误反馈结果。至于附加题的要求,即GUI界面的生成,只要用户的操作得当,是能够正确运行软件伟大。所以从用户操作层面上来说,此次项目开发是可行的。
- 法律可行性:由于软件开发结束后不存在盈利目的,所以不存在法律层面上的问题。
二、需求分析阶段
仔细阅读项目说明文档,进行此次软件开发的需求分析。首先,项目要求我们能够实现一个命令行程序,程序能:
- 生成不重复的数独终局至文件
- 读取文件内的数独问题,求解并将结果输出至文件
对于生成终局部分,甲方需求如下:
- 在命令行中使用-c参数加数字N(1<=N<=1000000)控制生成数独终局的数量,例如下述命令将生成20个数独终局至文件中:suduku.exe -c 20
- 将生成的数独终局用一个文本文件(假设名字叫suduku.txt)的形式保存起来,每次生成的txt文件需要覆盖上次生成的txt文件,文件内的格式如下,数与数之间由空格分开,终局与终局之间空一行,行末无空格:
- 程序在处理命令行参数时,不仅能处理格式正确的参数,还能够处理各种异常的情况,如:suduku.exe -c abc
- 在生成数独矩阵时,左上角的第一个数为:(学号后两位相加)%9+1。
对于求解数独部分,甲方需求如下:
- 在命令行中使用-s参数加文件名的形式求解数独,并将结果输出至文件,如:suduku.exe -s absolute_path_of_puzzlefile
- 生成的数独题目格式如下,其中0表示空格,题目与题目之间空一行,行末无空格,最后一个数独题目后无空行:
- suduku.txt生成格式与终局的要求一致
- 数独题目N(1<=N<=1000000),保证文件中数独格式正确
根据项目的需求,我们能够画出该软件的数据流图(DFD)如下:
三、概要设计阶段
根据需求分析的结果,在软件项目中大致需要三个类来完成相应的功能需求。一个是分析指令的类,一个是生成数独终局的类,还有一个是求解数独的类。对于分析指令的类,我们需要对用户输入的命令进行判断,看是否合理,合理的话再看是生成数独终局的指令还是求解数独的指令。对于生成数独的类,确定生成数独的方法为“各行通过第一行数字序列的变换得到”,一共设置了三个属性:第一行的数字序列num,各行的变换规则map,以及生成数独的数量cont。对于求解数独的类,目前准备采用的方法是利用DFS求解,中间不断判断填入数据的合理性。