没有优化前的设计过程
该程序的核心思想是设计一个Sudoku的类.
Sudoku类
它包含如下变量:
它包含如下成员函数:
SudokuGUI类
它包含如下变量:
它包含如下成员函数:
命令程序流程:
程序流程和函数之间的关系:
命令程序:
1.程序初始化,进入主函数.
2.检查指令.
程序调用check_argument函数检查指令是否错误:
(1)若指令有错结束进程
(2)若是生成终局的指令,返回要生成的终局数量
(3)若是解数独指令,返回0;
3.判断返回值:
(1)若返回值num大于0,调用CreateSudokuN函数生成num个终局转4.
(2)若返回值为0,调用SolvSudokuN函数执行解数独转5.
4.在CreateSudokuN函数中循环生成num个数独终局并写入sudoku.txt文件.生成一个数独终局.
(1)首先要初始化一个Sudoku类.
(2)然后调用Sudoku.Create函数生成一个数独终局,该函数会调用Sudoku.dfs函数进行深搜生成每一个格数字.
(3)最后调用Sudoku.FillFile函数写入相关文档中.
5.在SolvSudokuN函数函数中,循环读取相关文件中的数独残局,并解数独.
(1)首先调用sudoku.GetFile函数,根据残局生成一个Sudoku变量.
(2)然后调用Sudoku.Solv函数对残缺的空位进行深搜填入数字.
(3)最后使用Sudoku.FillFile函数写入相关文档.
GUI界面:
1.界面初始化.:
(1)一个tableWidget控件和三个button控件.
(2)分别使用connect函数:
a.将开始按钮的点击信号与FillSudoku函数连接.
b.将提交按钮的点击信号与SubmitSudoku函数连接.
c.将退出按钮的点击信号与close函数连接.
d.将棋盘表格控件的单元格改变信号与ChangeSudoku函数连接.
2.点击开始游戏按钮,触发信号槽,根据connect函数,调用FillSudoku函数:
(1)解除棋盘表格控件的信号,防止反复调用.
(2)调用sudoku.Creat函数创建一个数独终局.
(3)调用sudoku.GeneratingEndgame函数在终局的基础上,生成一个残局.
(4)根据此时的sudoku变量,填入棋局.
(5)重新连接棋盘表格控件的信号.
3.点击提交按钮,触发信号槽,根据connect函数,调用SubmitSudoku函数:
(1)调用sudoku.Check函数检查提交的数独是否成功.
(2)成功,调用sudoku.Clear()清空棋局.
(3)失败,则选择是否继续,不继续则调用sudoku.Clear()清空棋局.
4.点击退出按钮,触发信号槽,根据connect函数,调用close函数,退出程序.
用例建模
静态建模
类-对象层、属性层,服务层同上.
结构层:
动态建模
状态图
重新优化后设计修改
Sudoku类
它包含如下变量:
它包含如下成员函数:
命令程序流程:
程序流程和函数之间的关系:
命令程序:
1.程序初始化,进入主函数.
2.检查指令.
程序调用check_argument函数检查指令是否错误:
(1)若指令有错结束进程
(2)若是生成终局的指令,返回要生成的终局数量
(3)若是解数独指令,返回0;
3.判断返回值:
(1)若返回值num大于0,调用CreateSudokuN函数生成num个终局转4.
(2)若返回值为0,调用SolvSudokuN函数执行解数独转5.
4.在CreateSudokuN函数中循环生成num个数独终局并写入sudoku.txt文件.生成一个数独终局.
(1)使用swap随即打乱1-9基础数列
(2)然后使用Perm函数寻找这个数列不重复的全排列.
(3)在初始化一个Sudoku类.并使用Sudoku.GetBase获取这个全排列作为生成终局的基础.
(4)然后调用Sudoku.Create函数生成一个DFS基础数独,该函数会调用Sudoku.dfs函数进行深搜生成每一个格数字.
(5)继续用Sudoku.rowExchange和Sudoku.colExchange在DFS基础数独的基础上进行行列交换,生成2!* 3!*3!*2!*3!*3!个数独,并使用Sudoku.GetArry写入char *wfile中.
(6)若没有完成数独数量,转(2)继续生成下一个全排列.
(3)最后使用fprintf将wfile写入文件.
5.在SolvSudokuN函数函数中,循环读取相关文件中的数独残局,并解数独.
(1)首先调用sudoku.GetFile函数,根据残局生成一个Sudoku变量.
(2)然后调用Sudoku.Solv函数对残缺的空位进行深搜填入数字.
(3)最后使用Sudoku.FillFile函数写入相关文档.