【软件工程基础】个人项目报告 | 数独终局生成及解决

项目地址

[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求解,中间不断判断填入数据的合理性。