您好,登錄后才能下訂單哦!
本文實(shí)例為大家分享了java數(shù)獨(dú)游戲的具體代碼,供大家參考,具體內(nèi)容如下
打算把javaFx需要的組件裝好以后直接用javaFx的,但似乎eclipse的版本不對(duì),安裝了也不能用...
數(shù)獨(dú)代碼是在之前寒假受命寫的,學(xué)了一個(gè)月java的成果,現(xiàn)在看來有些不足但畢竟是第一個(gè)程序,就直接放上來,數(shù)獨(dú)終盤的實(shí)現(xiàn)直接用了暴力,時(shí)間復(fù)雜度有點(diǎn)高,懶得改了直接放代碼
終盤實(shí)現(xiàn):
import java.util.Random; public class SudokuPuzzleGenerator { private Random random = new Random(); private static final int MAX_CALL_RANDOM_ARRAY_TIMES = 220; private int currentTimes = 0; public int[][] generatePuzzleMatrix() { int[][] randomMatrix = new int[9][9]; for (int row = 0; row < 9; row++) { if (row == 0) { currentTimes = 0; randomMatrix[row] = buildRandomArray(); } else { int[] tempRandomArray = buildRandomArray(); for (int col = 0; col < 9; col++) { if (currentTimes < MAX_CALL_RANDOM_ARRAY_TIMES) { if (!isCandidateNmbFound(randomMatrix, tempRandomArray, row, col)) { resetValuesInRowToZero(randomMatrix,row); row -= 1; col = 8; tempRandomArray = buildRandomArray(); } } else { row = -1; col = 8; resetValuesToZeros(randomMatrix); currentTimes = 0; } } } } return randomMatrix; } private void resetValuesInRowToZero(int[][] matrix, int row) { for (int j = 0; j < 9; j++) { matrix[row][j] = 0; } } private void resetValuesToZeros(int[][] matrix) { for (int row = 0; row < 9; row++) { for (int col = 0; col < 9; col++) { matrix[row][col] = 0; } } } private boolean isCandidateNmbFound(int[][] randomMatrix, int[] randomArray, int row, int col) { for (int i = 0; i < 9; i++) { randomMatrix[row][col] = randomArray[i]; if (noConflict(randomMatrix, row, col)) { return true; } } return false; } private boolean noConflict(int[][] candidateMatrix, int row, int col) { return noConflictInRow(candidateMatrix, row, col)&&noConflictInColumn(candidateMatrix, row, col) && noConflictInBlock(candidateMatrix, row, col); } private boolean noConflictInRow(int[][] candidateMatrix, int row, int col) { int currentValue = candidateMatrix[row][col]; for (int colNum = 0; colNum < col; colNum++) { if (currentValue == candidateMatrix[row][colNum]) { return false; } } return true; } private boolean noConflictInColumn(int[][] candidateMatrix, int row, int col) { int currentValue = candidateMatrix[row][col]; for (int rowNum = 0; rowNum < row; rowNum++) { if (currentValue == candidateMatrix[rowNum][col]) { return false; } } return true; } private boolean noConflictInBlock(int[][] candidateMatrix, int row, int col) { int baseRow = row / 3 * 3; int baseCol = col / 3 * 3; for (int rowNum = 0; rowNum < 8; rowNum++) { if (candidateMatrix[baseRow + rowNum / 3][baseCol + rowNum % 3] == 0) { continue; } for (int colNum = rowNum + 1; colNum < 9; colNum++) { if (candidateMatrix[baseRow + rowNum / 3][baseCol + rowNum % 3] == candidateMatrix[baseRow + colNum / 3][baseCol + colNum % 3]) { return false; } } } return true; } private int[] buildRandomArray() { currentTimes++; int[] array = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9 }; int randomInt = 0; for (int i = 0; i < 20; i++) { randomInt = random.nextInt(8) + 1; int temp = array[0]; array[0] = array[randomInt]; array[randomInt] = temp; } return array; } public int getCurrentTimes() { return currentTimes; } public void setCurrentTimes(int currentTimes) { this.currentTimes = currentTimes; } }
界面及判斷:
用swing寫的
import javax.swing.*; import java.awt.*; import java.awt.event.*; import java.util.Random; public class ShuD extends JFrame{ private static final long serialVersionUID = 5952689219411916553L; //序列化字段 private static JTextField a[][] = new JTextField[9][9]; //存儲(chǔ)文本框中的數(shù)字 static int ans[][] = new int[9][9]; //存儲(chǔ)輸入后的兩位數(shù)組 SudokuPuzzleGenerator example = new SudokuPuzzleGenerator(); public int right[][] = example.generatePuzzleMatrix(); public int rightans[][]; private int[][] Wk(int a[][]){ //挖空 Random r = new Random(); int a1, a2; a1 = r.nextInt(9); a2 = r.nextInt(9); for(int i = 0; i < 100; i++) { a[a1][a2] = 0; a1 = r.nextInt(9); a2 = r.nextInt(9); } return a; } public ShuD(){ Container c = getContentPane(); c.setLayout(new BorderLayout(2, 1)); //邊框布局 JMenuItem jmiOk = new JMenuItem("提交"); //定義菜單 JMenuItem jmiExplain = new JMenuItem("詳情"); JMenuItem jmiMessage = new JMenuItem("信息"); JPanel panel = new JPanel(); //定義一個(gè)容器 panel.add(jmiOk); //將菜單在容器內(nèi)顯示 panel.add(jmiExplain); panel.add(jmiMessage); JPanel p1 = new JPanel(new GridLayout(9, 9, 5, 5)); //定義9行9列的網(wǎng)格布局 add(panel,BorderLayout.NORTH); //將菜單放置在北面 add(p1,BorderLayout.CENTER); //將數(shù)字放置在正中間 rightans = Wk(right); for(int k = 0;k<9; k ++) { for(int n=0;n<9;n++) { if(rightans[k][n] != 0) { a[k][n] = new JTextField("" + rightans[k][n]); a[k][n].setHorizontalAlignment(JTextField.CENTER);//將數(shù)字水平居中 a[k][n].setEditable(false); //只可顯示不可修改 p1.add(a[k][n]); //添加文本框 } else { a[k][n] = new JTextField(); a[k][n].setHorizontalAlignment(JTextField.CENTER); p1.add(a[k][n]); } } } add(p1); //將數(shù)字面板顯示在容器里 jmiOk.addActionListener(new ActionListener(){//匿名創(chuàng)建事件監(jiān)聽器 public void actionPerformed(ActionEvent e) { if(gettext() == 1) { if(judge() == true) { JOptionPane.showMessageDialog(null, "Your answer is right!","Result",JOptionPane.INFORMATION_MESSAGE); } else { JOptionPane.showMessageDialog(null, "Your answer is wrong!","Result",JOptionPane.INFORMATION_MESSAGE); } } } }); explainListenerClass listener2 = new explainListenerClass(); jmiExplain.addActionListener(listener2); messageListenerClass listener3 = new messageListenerClass(); jmiMessage.addActionListener(listener3); } static int gettext() //獲取文本框的文字 { int i,j; for(i = 0; i < 9; i++) { for(j = 0; j < 9 ; j ++) { ans[i][j] = 0; } } for(int k = 0;k < 9; k++) { for(int n = 0;n < 9; n++) { try //異常處理 { ans[k][n] = Integer.parseInt(a[k][n].getText()); //將答案類型轉(zhuǎn)換之后傳給ans } catch(NumberFormatException nfe) { JOptionPane.showMessageDialog(null,"數(shù)據(jù)中包括非數(shù)字,請重新輸入"); return 0; } } } return 1; } public static boolean judge() //判斷輸入的答案是否正確 { int i,j,k; int [][]answer = ans; for(i = 0; i < 9; i ++) { if(judge9(answer[i]) == false) //判斷每列是否有重復(fù)數(shù)字 return false; } for(j = 0; j < 9; j ++) //判斷每行是否有重復(fù)數(shù)字 { int[] newAnswerColumn = new int[9]; for(i = 0; i < 9; i ++) { newAnswerColumn[i] = answer[i][j]; } if(judge9(newAnswerColumn) == false) return false; } for(i = 0; i < 3; i ++) //判斷每個(gè)小九宮格內(nèi)是否有重復(fù)數(shù)字 { for(j = 0; j < 3; j ++) { k = 0; int[] newAnswer = new int[9]; for(int m = i * 3; m < i * 3 + 3; m ++) { for(int n = j * 3; n < j * 3 + 3; n ++) { newAnswer[k] = answer[m][n]; k++; } } if(judge9(newAnswer) == false) { return false; } } } return true; } public static boolean judge9(int[] answer) { int i,j; for(i = 0; i < 9; i ++) { for(j = 0; j < 9; j ++) { if(i == j) continue; if(answer[i] == answer[j]) //如果有重復(fù)的數(shù)字,返回false { return false; } } } return true; //沒有重復(fù)數(shù)字,返回true } public static void main(String[] args) { JFrame frame = new ShuD(); frame.setTitle("SuDoku"); frame.setSize(600,900); frame.setLocationRelativeTo(null); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true); } } class explainListenerClass implements ActionListener{ //事件監(jiān)聽器 public void actionPerformed(ActionEvent e){ JOptionPane.showMessageDialog(null, "填入數(shù)字保證每行每列及每個(gè)小的九宮格內(nèi)數(shù)字無重復(fù)","Explain",JOptionPane.INFORMATION_MESSAGE); } } class messageListenerClass implements ActionListener{ public void actionPerformed(ActionEvent e){ JOptionPane.showMessageDialog(null, "made by wyx","Message",JOptionPane.INFORMATION_MESSAGE); } }
以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持億速云。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。