软件工程大作业——数独游戏

软件工程大作业——数独游戏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、需求分析
经过研究,我认为软件需要满足的需求如下:

  1. 生成不重复的数独终盘(0<N<=1000000)
  2. 生成数独题目(0<N<=100000)
  3. 读取数独问题,求解,将结果输出(0<N<=1000000)

2、解决方法:
经过查阅资料,我确定的方法如下:

  • 生成数独终盘:分为随机法和矩阵转换法。其中,随机法在数据量大时,时间复杂度过大,效率过低。所以我选择矩阵转换法,利用对已有的数独终盘矩阵的行、列和数字的交换,生成新的数据矩阵,能够充分利用矩阵特性,且十分高效。这种方法也可以保证能够输出1000000个不同的数独。证明如下:
    对于一个9乘9的矩阵,要保证左上角的第一个数字为(3+7)%9+1=2不变
  • 对于行的变换:第一行不变,剩下的行在同一行的九宫格范围内进行变换,共有2x3!x3!=72种方法
  • 对于列的变换: 第一列不变,同理共有2x3!x3!=72种方法
  • 对于数字的变换:除了2以外,剩下每个数字两两交换一次,共有8!=40320种方法
    因为 72x72x40320>1000000,所以可以产生不重复且第一个字为2的数独终盘
  1. 生成数独题目:随机挖空,但挖空的数量不能太少也不能太多。经过我的观察,数独题目中空位的数量大约是30至42个。所以我挖空的具体方法为:首先在每个小九宫格中挖两个空,然后再随机挖空,第二步挖的空有可能与第一步挖过的某些空重复,保证整个数独题目最少有30个空,最多有42个空
  2. 解数独题目:回溯法,用dfs来解决

三、系统设计

三个功能,就需要分为三个模块,使用面向对象的方法对其进行分析和建模。

  1. 用例图

    分析需求中的使用者,分为用户和管理员,根据需求描述,画出用例图如下:
    在这里插入图片描述

  2. 类图
    需求描述中设计到的类与对象包括:用户需求解决类(solve)、数独终盘生成类(base)、数独问题求解类(answer)。 功能需求中,第二个功能并没有在用户需求中直接体现出来,所以我将其另作为一个程序。画出的类图如下:
    在这里插入图片描述

  3. 顺序图
    生成数独终盘的过程顺序图如下:
    在这里插入图片描述
    求解数独的过程顺序图如下:
    在这里插入图片描述

发布了2 篇原创文章 · 获赞 0 · 访问量 30

猜你喜欢

转载自blog.csdn.net/qq_41343044/article/details/103691629