九宫格数独模型设计(随机生成题目)
前言
?????? 之所以想到要寫這個程序,起源于孩子學校的一個競賽活動,就是九宮格數獨。我本想網上下載幾個題目做做練習一下,畢竟孩子才一年級啦。結果網上搜出來的都不能直接下載,
這當然難不倒我這大咖了,哈哈....果斷截圖打印,搞定。后來感覺總是差了點兒什么,畢竟委屈求全的事兒我還是很不爽的,那好吧,我自己寫一個......造福全人類。
程序代碼
???? 閑話少續,上干貨(代碼):
??? 1. ?? 界面設計
???????????? 簡單來講還是用C#吧,界面設計起來簡單些??聪鹿δ苓€是挺全的吧?
???????????
?????????????????????????????????????????????????????????
2. 核心算法
????????? 我定義了一個9*9的二維數組,用來保存計算出來的全體數據。
????????? private int[,] arrayList = new int[9,9];
????????? 大體思路就是:初始化一個二維數據備用,然后按照每個宮進行計算,每個格子的數都是隨機生成的,規則就是橫豎以及各個宮都包含1-9這9個數且不能重復。
????????? 需要注意的是,這樣隨機算是有很大概率到最后是無法找到合適的數填滿整個九宮格的,那就需要重新開始計算新的一組數據。
???????? 為了保證符合規則,我設計了一個checklist,列表中存的都是不能出現的數字,比如一行中前面有了3,5,7,那就把這幾個數放到checklist中,然后計算這一行后面
???????? 的數的時候就不能出現這幾個了。
初始化九宮格函數:
void InitArray(){try{bool cancleFlag = false;bool breakFlag = false;while (!cancleFlag){breakFlag = false;for (int ii = 0; ii < 9; ii++){for (int jj = 0; jj < 9; jj++){arrayList[ii, jj] = 0;}}//for (int gongCount = 1; gongCount <= 9; gongCount++){if (breakFlag){break;}//添加本宮已選的數int startRow = 0;int startCol = 0;if (gongCount <= 3){startRow = 1;startCol = (gongCount - 1) * 3 + 1;}else if (gongCount > 3 && gongCount <= 6){startRow = 4;startCol = (gongCount - 3 - 1) * 3 + 1;}else{startRow = 7;startCol = (gongCount - 6 - 1) * 3 + 1;}int randomNum = 0;for (int rowIdx = startRow; rowIdx < startRow + 3; rowIdx++){if (breakFlag){break;}for (int colIdx = startCol; colIdx < startCol + 3; colIdx++){//initTempArray();initCheckList(rowIdx, colIdx, gongCount);randomNum = GetRandomNum(checkList);if (randomNum == 0){//ArrayToString();breakFlag = true;break;}else if (randomNum > 0 && rowIdx == 9 && colIdx == 9){cancleFlag = true;}arrayList[rowIdx - 1, colIdx - 1] = randomNum;//checkList.Add(arrayList[0, 0]);}}ArrayToString();}}//System.Console.WriteLine("good.");Logger.LogWriter("\n" + "答案");}catch (Exception ex){Logger.LogWriter(ex);}}計算隨機數函數:
/// <summary>/// 取得1-9之間的隨機數,且不包含在checklist中/// </summary>/// <param name="checkList"></param>/// <returns></returns>int GetRandomNum(ArrayList checkList){int random = 0;bool flag = true;while(flag){Random r = new Random();random = r.Next(1,10);if (!checkList.Contains(random)){flag=false;}//如果包含9個數字則算錯了,需要重新計算if (checkList.Contains(1)&& checkList.Contains(2) && checkList.Contains(3) && checkList.Contains(4) && checkList.Contains(5) && checkList.Contains(6) && checkList.Contains(7) && checkList.Contains(8) && checkList.Contains(9)){random = 0;flag = false;//System.Console.Write("not good.\n");Logger.LogWriter("\n重新計算.....");}}return random;}運行結果:
??????????? 我將結果輸出到了CSV文件(此處代碼沒有貼,這不是重點),這樣就可以直接打印了~~再也不用到處找題目了(我家娃娃說:我太難了~~)
???????????????
?
?
未完待續....
????????? 后來我完善了題目難度選擇,題目數量設置,保存文件路徑等功能,這樣就可以自行設置題目難度,數量以及設置保存路徑了。
???????? 待完善:1. 沒有做異步處理,開始計算界面會假死,體驗不好。
???????????????????????? 2. CSV文件沒有格式設置,打開后需自行設置一下單元格邊框及列寬和行高(建議列寬6,行高33)
? 好了,以后再也不用看別人眼色了~~
重要:程序下載地址:https://download.csdn.net/download/happyxjbf/16689751(已更新)
?
更新:2021-4-23 1. 更新了界面異步處理,現在不會假死了~~
??????????????????????????? 2. 可以顯示實時進度了,計算到了第幾題
?????????????????????????????
??????????????????????????
?
簡碼筆記,讓你的代碼更加簡約精煉。
轉載請注明出處。
總結
以上是生活随笔為你收集整理的九宫格数独模型设计(随机生成题目)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 可以学计算机再学美术,想学习板绘?教你如
- 下一篇: oracle查参数,各种oracle参数