基於第二次數獨遊戲,新增GUI介面
阿新 • • 發佈:2018-11-11
package shudoGUI; import java.awt.Button; import java.awt.Color; import java.awt.FlowLayout; import java.awt.Font; import java.awt.GridLayout; import java.awt.Point; import java.awt.TextField; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.event.MouseMotionAdapter; import java.awt.event.TextEvent; import java.awt.event.TextListener; import java.util.Random; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; public class Sudoku extends JFrame { final private TextField[][] txtGame; static String level="簡單"; static int num=20;//空白格數量 static int guan=5;//關卡數量 static int add=5;//沒關過後增加的空白格數量 public static void main(String[] args) { JButton j1=new JButton("簡單"); JButton j2=new JButton("中等"); JButton j3=new JButton("較難"); j1.setSize(100,30); j2.setSize(100,30); j3.setSize(100,30); j1.addMouseListener(new MouseAdapter() { @Override public void mouseClicked(MouseEvent e) { Sudoku.level="簡單"; Sudoku.num=20; Sudoku shudu = new Sudoku(); } }); j2.addMouseListener(new MouseAdapter() { @Override public void mouseClicked(MouseEvent e) { Sudoku.level="中等"; Sudoku.num=30; Sudoku shudu = new Sudoku(); } }); j3.addMouseListener(new MouseAdapter() { @Override public void mouseClicked(MouseEvent e) { Sudoku.level="較難"; Sudoku.num=60; Sudoku shudu = new Sudoku(); } }); //// JFrame j=new JFrame(); j.setLayout(new GridLayout(1, 3)); j.add(j1); j.add(j2); j.add(j3); j.setSize(200, 100); j.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); j.setVisible(true); j.setTitle("選擇難度"); } public Sudoku() {// 對JFrame進行佈局初始以及監聽設定 txtGame = new TextField[9][9];// 建立81個TextField物件 DoShudu shudu = new DoShudu(); int[][] cells = DoShudu.newshudu();// 獲取數獨陣列 final JPanel jpl = new JPanel();// 建立JPanel物件 final int spaceNum = num;// spaceNum表示需要設定空白TextField的數量 jpl.setLayout(new GridLayout(9, 9));// JPanel佈局 final int[][] cellAn = new int[9][9];// 數獨陣列的答案 System.arraycopy(cells, 0, cellAn, 0, cells.length);// 答案從建立的數獨陣列中Copy for (int i = 0; i < 9; i++) {// 把答案從Console打印出來 for (int j = 0; j < 9; j++) { System.out.print(" "+cellAn[i][j]); } System.out.println(); } // 列印結束 this.setDefaultCloseOperation(this.EXIT_ON_CLOSE); this.setSize(300, 300); this.setResizable(false); this.setTitle("數獨 難度:"+Sudoku.level); for (int i = 0; i < 9; i++) { for (int j = 0; j < 9; j++) { txtGame[i][j] = new TextField(); // 設定TextField背景顏色 if ((i < 3 && j < 3) || (i < 6 && i >= 3 && j >= 3 && j < 6) || (i < 9 && i >= 6 && j >= 6 && j < 9)) { txtGame[i][j].setBackground(Color.ORANGE); } if ((i < 6 && i >= 3 && j < 3) || (i < 3 && j >= 6 && j < 9) || (i < 9 && i >= 6 && j >= 3 && j < 6)) { txtGame[i][j].setBackground(Color.GREEN); } if ((i < 9 && i >= 6 && j < 3) || (i < 3 && j >= 3 && j < 6) || (i < 6 && i >= 3 && j < 9 && j >= 6)) { txtGame[i][j].setBackground(Color.PINK); } txtGame[i][j].setFont(new Font("Dialog", Font.CENTER_BASELINE, 20));// 設定字型大小 txtGame[i][j].setText(Integer.toString(cells[i][j])); txtGame[i][j].setEnabled(false); txtGame[i][j].setVisible(true); jpl.add(txtGame[i][j]); jpl.setVisible(true); } } final int[][] tempArray = new int[spaceNum][2]; final JFrame jfm = new JFrame("選擇數字"); // 取消JFrame title jfm.setUndecorated(true); // 增加JFrame拖拽功能 final Point origin = new Point(); jfm.addMouseListener(new MouseAdapter() { public void mousePressed(MouseEvent e) { origin.x = e.getX(); origin.y = e.getY(); } }); jfm.addMouseMotionListener(new MouseMotionAdapter() { public void mouseDragged(MouseEvent e) { Point p = jfm.getLocation(); jfm.setLocation(p.x + e.getX() - origin.x, p.y + e.getY() - origin.y); } }); // 設定JFrame為半透明 final JPanel jpnl = new JPanel(new GridLayout(3, 3)); jfm.setLayout(null); jfm.setSize(190, 200); jfm.setResizable(false); jpnl.setBounds(0, 0, 190, 120); jfm.setResizable(false); for (int i = 0; i < spaceNum; i++) {// 依據需要空白的TextField數量,隨機對TextField設定為空 final int ranD1 = new Random().nextInt(9); final int ranD2 = new Random().nextInt(9); tempArray[i][0] = ranD1; tempArray[i][1] = ranD2; txtGame[ranD1][ranD2].setText(""); if ((ranD1 < 3 && ranD2 < 3) || (ranD1 < 6 && ranD1 >= 3 && ranD2 >= 3 && ranD2 < 6) || (ranD1 < 9 && i >= 6 && ranD2 >= 6 && ranD2 < 9)) { txtGame[ranD1][ranD2].setBackground(Color.ORANGE); } if ((ranD1 < 6 && ranD1 >= 3 && ranD2 < 3) || (ranD1 < 3 && ranD2 >= 6 && ranD2 < 9) || (ranD1 < 9 && ranD1 >= 6 && ranD2 >= 3 && ranD2 < 6)) { txtGame[ranD1][ranD2].setBackground(Color.GREEN); } if ((ranD1 < 9 && ranD1 >= 6 && ranD2 < 3) || (ranD1 < 3 && ranD2 >= 3 && ranD2 < 6) || (ranD1 < 6 && ranD1 >= 3 && ranD2 < 9 && ranD2 >= 6)) { txtGame[ranD1][ranD2].setBackground(Color.PINK); } txtGame[ranD1][ranD2].addMouseListener(new MouseAdapter() { public void mouseClicked(MouseEvent mouseevent) { jfm.getContentPane().removeAll();// 移出了所有的元件 jpnl.removeAll(); for (int f = 0; f < 9; f++) { final Button btn = new Button((f + 1) + ""); btn.setForeground(Color.RED); btn.setBackground(Color.WHITE); btn .setFont(new Font("Dialog", Font.CENTER_BASELINE, 30)); btn.addMouseListener(new MouseAdapter() { @Override public void mouseClicked(MouseEvent e) { // TODO Auto-generated method stub txtGame[ranD1][ranD2].setText(btn.getLabel() + txtGame[ranD1][ranD2].getText()); } }); jpnl.add(btn); } Button btnDel = new Button(" 清 空 "); btnDel.setForeground(Color.WHITE); btnDel.setBackground(Color.RED); btnDel .setFont(new Font("Dialog", Font.CENTER_BASELINE, 30)); btnDel.setBounds(0, 120, 190, 50); btnDel.addMouseListener(new MouseAdapter() { @Override public void mouseClicked(MouseEvent e) { // TODO Auto-generated method stub txtGame[ranD1][ranD2].setText(""); } }); jfm.add(jpnl); jfm.add(btnDel); jfm.setVisible(true); } }); txtGame[ranD1][ranD2].addTextListener(new TextListener() {// 對空白的TextField新增監聽,數值發生變化後進行答案對比,如果全部答對在Console列印“good” @Override public void textValueChanged(TextEvent e) { TextField tmp = (TextField) e.getSource(); int count = 0; for (int u = 0; u < spaceNum; u++) { if ((txtGame[tempArray[u][0]][tempArray[u][1]] .getText()) .equals(Integer .toString(cellAn[tempArray[u][0]][tempArray[u][1]]))) { count++; } } if (count == spaceNum) { jpl.removeAll(); FlowLayout blt = new FlowLayout(); jpl.setLayout(blt); if(num<=3){ jpl.add(new JLabel("恭喜你過關")); Button btn = new Button("進入下一關"); btn.addMouseListener(new MouseAdapter() { @Override public void mouseClicked(MouseEvent e) { // TODO Auto-generated method stub Sudoku.this.dispose(); jfm.dispose(); num=num+add; new Sudoku(); } }); jpl.add(btn); } else{ jpl.add(new JLabel("恭喜 你已經完成此關卡!")); } jpl.updateUI(); System.out.println("good"); } } }); txtGame[ranD1][ranD2].setEnabled(true); } this.add(jpl); this.setVisible(true); } }
程式實現介面如下:
程式分析:本次作業基於上一次的數獨作業,改正了數獨生成個數0<N<1000000,並且程式碼已上傳至conding,地址https://git.coding.net/dhlg_201810775002/shudu.git。
程式實現的功能:能生成正確的GUI介面,不同顏色位於空白處,並且可以選擇相應的難易程度,開始玩數獨遊戲,當所有空白處填寫正確後,會出現提示“恭喜你已完成此關卡”。
學習心得:第一次做GUI介面,查了很多資料和從網上百度經驗,花費的時間較多。並將上一次作業沒有實現的功能進行了改進,對GUI知識點進行了具體學習,如控制元件的設定學習,方法的實現等。希望下一次的作業能掌握更多的知識點,加強自身的學習。