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