java gui 数独_数独-GUI开发
GUI界面開發(fā)
開發(fā)運(yùn)行環(huán)境
運(yùn)行環(huán)境:JDK1.8
運(yùn)行命令:java -jar sudokuGUI.jar
語言:java
開發(fā)環(huán)境:Intellij IDEA 2019.2,JavaFX Scene Builder 8.3.0
項(xiàng)目結(jié)構(gòu)和說明
為了利用之前的源代碼,UI界面采用javafx進(jìn)行開發(fā),使用MVC框架來設(shè)計(jì)整個(gè)應(yīng)用,使用了數(shù)據(jù)綁定,通過構(gòu)建容器組件,添加menu、監(jiān)聽器等實(shí)現(xiàn)圖形化界面功能。
軟件功能說明
主要頁面如下所示,一打開應(yīng)用自動(dòng)進(jìn)行計(jì)時(shí)。
點(diǎn)擊菜單中的開始,可以開始新游戲、提交當(dāng)前頁面,查看答案,退出游戲。
點(diǎn)擊提交時(shí),計(jì)時(shí)器停止,若有空位置沒有填,會提示填滿再提交,若有錯(cuò)誤會彈窗會提示,完全正確時(shí)會彈窗恭喜用戶。
面向?qū)ο蠓治鲈O(shè)計(jì)
用例圖
類圖
總共有五個(gè)類
Main用于顯示UI界面,界面用xml編寫,在sample.xml中。
Controller監(jiān)聽圖形頁面、鼠標(biāo)、鍵盤等。
Solve驗(yàn)證用戶提交的數(shù)獨(dú)是否正確。
Generate用于生成終局,對終局隨機(jī)挖空,形成數(shù)獨(dú),顯示在UI中。
AlterInfo用于彈窗提示。
SudokuCell表示數(shù)獨(dú)中的每一個(gè)小塊,控制是否可以輸入,顯示數(shù)字等。
狀態(tài)圖
設(shè)計(jì)思路
GUI中的主體代碼和命令行部分幾乎一致,最開始選擇生成數(shù)獨(dú)的回溯算法。最初實(shí)現(xiàn)UI界面,用了優(yōu)化以后利用排列組合快速生成終局的算法,但因?yàn)榻K局是由變換第一宮形成的,所以存在規(guī)律性,降低數(shù)獨(dú)的可玩性。所以采用了最初生成終局的回溯算法。
實(shí)現(xiàn)思路是先通過回溯算法生成一個(gè)終局,因?yàn)橐笞钌偻?0個(gè)空,最多挖60個(gè)空,每個(gè)宮中最少有兩個(gè)。當(dāng)每個(gè)最少挖4個(gè),4×9=36符合要求,每個(gè)宮最多挖6個(gè),6×9=54個(gè)符合要求。所以循環(huán)九個(gè)宮,每個(gè)宮產(chǎn)生一個(gè)隨機(jī)數(shù)n(4<=n<=6),然后在1-9中生成n個(gè)不同的隨機(jī)數(shù),在該宮中將n個(gè)隨機(jī)數(shù)所在的位置挖掉,便生成了一個(gè)數(shù)獨(dú)。
在編寫代碼的過程中,卡殼了很久一直在思考如何保證數(shù)獨(dú)解的唯一性,但因?yàn)樽约簩@部分算法的理解并不是很深入,所以放棄了保證了數(shù)獨(dú)解的唯一性。用戶提交數(shù)獨(dú)時(shí),不與最初生成的終局比較,而是利用循環(huán)檢查用戶提交的答案中是否有錯(cuò)誤,沒有錯(cuò)誤即為正確答案。若用戶選擇查看答案,則提供最初的終局。
自定義了一個(gè)數(shù)據(jù)類型SudokuCell,來存放數(shù)獨(dú)中的每一個(gè)小塊,其中設(shè)置一個(gè)屬性write保證可以多次修改答案,若數(shù)獨(dú)中該位置需要填寫,則將write設(shè)置為true,若不需要?jiǎng)t設(shè)置為false,并且可以對每一個(gè)SudokuCelle用css進(jìn)行美化,使數(shù)獨(dú)的外觀更加美觀。
具體代碼實(shí)現(xiàn)
對用戶提交數(shù)獨(dú)進(jìn)行檢查,正確時(shí)返回true,錯(cuò)誤時(shí)返回false,這個(gè)方法在命令行中用于測試,檢查對txt數(shù)獨(dú)中求解時(shí),是否有錯(cuò)誤。
/**
* @Title: checkSolution
* @Description: 檢查結(jié)果
* @param data
* @return boolean
* @throws
*/
boolean checkSolution(int[] data)
{
int index=0;
int[] criterion=new int[27];
Solve s=new Solve();
for (int j = 0; j < 27; j++) {
criterion[j] = 511;
}
s.setCriterion(criterion);
if(!checkSudoku(data,index,s))
return false;
return true;
}
/**
* @Title: checkSudoku
* @Description: 檢查數(shù)獨(dú)答案是否正確
* @param data
* @param index
* @param s
* @return boolean
* @throws
*/
private boolean checkSudoku(int[] data,int index,Solve s) {
for (int j = 0; j < 9; j++) {
for (int k = 0; k < 9; k++) {
while (data[index]>9 || data[index]<1)
{
index++;
}
int temp = data[index++];
if (!s.fill(j, k, temp)) {
Logger logger=Logger.getLogger("SolveTest");
logger.setLevel(Level.SEVERE);
String msg="row:"+(j+1)+"clo:"+(k+1)+"value:"+temp;
logger.severe(msg);
return false;
}else{
s.usedNum(j,k,temp);
}
}
}
return true;
}
測試
因?yàn)镚UI項(xiàng)目中,除了UI部分代碼,都是在命令行中經(jīng)過測試的代碼,所以只進(jìn)行簡單的系統(tǒng)測試,檢測頁面的響應(yīng)、監(jiān)聽等是否正常。
編號
操作
預(yù)期結(jié)果
實(shí)際結(jié)果
狀態(tài)
1
頁面有空位,點(diǎn)擊提交
未完成彈窗
未完成彈窗
通過
2
頁面沒有空位,存在錯(cuò)誤,點(diǎn)擊提交
錯(cuò)誤彈窗
錯(cuò)誤彈窗
通過
3
正確完成數(shù)獨(dú),點(diǎn)擊提交
正確彈窗
計(jì)時(shí)停止
正確彈窗
計(jì)時(shí)停止
通過
4
點(diǎn)擊查看答案
顯示答案
計(jì)時(shí)停止
顯示答案
計(jì)時(shí)停止
通過
5
點(diǎn)擊退出
退出程序
退出程序
通過
6
點(diǎn)擊新游戲
開始新游戲
開始新游戲
通過
7
在空位輸入非數(shù)字字符
輸不進(jìn)去
輸不進(jìn)去
通過
8
在空位輸入數(shù)字字符
空位顯示該數(shù)字
空位顯示該數(shù)字
通過
9
點(diǎn)擊查看答案以后,點(diǎn)擊提交
正確彈窗
正確彈窗
通過
10
點(diǎn)擊關(guān)于
信息彈窗
信息彈窗
通過
11
點(diǎn)擊幫助
幫助彈窗
幫助彈窗
通過
簡要開發(fā)過程
時(shí)間
內(nèi)容
2019年12月19日 - 2019年12月20日
需求分析、概要設(shè)計(jì)
2019年12月26日 - 2020年1月1日
基本完成命令行功能
2019年12月26日 - 2020年1月1日
開始單元測試
2020年1月2日 - 2020年1月3日
修改算法、對代碼結(jié)構(gòu)進(jìn)行優(yōu)化,完成測試
2020年1月4日 - 2020年1月16日
代碼質(zhì)量檢測、UI編寫
2020年1月17日 - 2020年1月18日
博客優(yōu)化
總結(jié)
以上是生活随笔為你收集整理的java gui 数独_数独-GUI开发的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 用计算机画画内容,【经验】怎么用电脑绘画
- 下一篇: java 如何执行dig 命令_如何直接