1. 程式人生 > >基於第二次數獨遊戲,新增GUI介面

基於第二次數獨遊戲,新增GUI介面

 

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知識點進行了具體學習,如控制元件的設定學習,方法的實現等。希望下一次的作業能掌握更多的知識點,加強自身的學習。