本文實例為大家分享了java版數獨遊戲界面實現的具體代碼,供大家參考,具體內容如下
實現效果圖:
這裡寫圖片描述
主函數用於啟動程序:
package hlc.shudu.app;import hlc.shudu.src.ShuduHelper;import hlc.shudu.ui.ShuduMainFrame;public class AppStart { public static void main(String[] args) { ShuduMainFrame mainFrame = new ShuduMainFrame(); mainFrame.setVisible(true); }}主窗體類(包含消息區,時間區,遊戲區):
package hlc.shudu.ui;import java.awt.BorderLayout;import java.awt.Color;import java.awt.Font;import java.awt.GridLayout;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.sql.Time;import java.text.SimpleDateFormat;import javax.swing.Icon;import javax.swing.ImageIcon;import javax.swing.JButton;import javax.swing.JFrame;import javax.swing.JLabel;import javax.swing.JPanel;import javax.swing.JTextField;import javax.swing.Timer;import javax.swing.border.TitledBorder;/* * 數獨主窗體*/public class ShuduMainFrame extends JFrame { public static int pass = 1; // 關卡public static JLabel lbPass; // 顯示關卡的lable public static long usedTime = 0; // 玩家用時private ShuduCanvers panelCanvers; // 主遊戲區public static Timer userTimeAction; /* * 默認構造函數*/ public ShuduMainFrame() { // 初始化方法init(); // 添加組件addComponent(); // 添加主遊戲區addCanvers(); } /* * 添加主遊戲區*/ private void addCanvers() { panelCanvers = new ShuduCanvers(); panelCanvers.setBorder(new TitledBorder("遊戲區")); // 將主遊戲區添加到窗體中this.add(panelCanvers, BorderLayout.CENTER); } /* * 添加組件區*/ private void addComponent() { JPanel panelComponent = new JPanel(); // 添加消息區addPanelMsg(panelComponent); // 添加時間區addPanelTime(panelComponent); // 將組件添加到窗體頂部this.add(panelComponent, BorderLayout.NORTH); } private void addPanelTime(JPanel panelComponent) { JPanel panelTime = new JPanel(); panelTime.setBorder(new TitledBorder("時間")); panelTime.setLayout(new GridLayout(2, 1)); final JLabel lbSysTime = new JLabel(); final JLabel lbUserTime = new JLabel(); panelTime.add(lbSysTime, BorderLayout.NORTH); panelTime.add(lbUserTime, BorderLayout.SOUTH); // 設置系統時間定時器Timer sysTimeAction = new Timer(500, new ActionListener() { @Override public void actionPerformed(ActionEvent e) { long timeMillis = System.currentTimeMillis(); SimpleDateFormat df = new SimpleDateFormat( "yyyy-MM-dd HH:mm:ss"); lbSysTime.setText(" 系統時間: " + df.format(timeMillis)); } }); sysTimeAction.start(); userTimeAction = new Timer(1000, new ActionListener() { @Override public void actionPerformed(ActionEvent e) { lbUserTime.setText(" 您已用時: " + (++usedTime)+ " sec."); } }); userTimeAction.start(); panelComponent.add(panelTime, BorderLayout.EAST); } /* * 添加消息區*/ private void addPanelMsg(JPanel panelComponent) { // panelComponent.setBorder(new TitledBorder("消息區")); panelComponent.setLayout(new GridLayout(1, 3)); Font font14 = new Font("", 4, 14); Font font28 = new Font("", 2, 28); JPanel panelMsg = new JPanel(); panelMsg.setBorder(new TitledBorder("消息區")); JLabel lbPass1 = new JLabel("關卡:第"); lbPass1.setFont(font14); panelMsg.add(lbPass1); // 顯示關卡數lbPass = new JLabel("" + pass); lbPass.setForeground(Color.RED); lbPass.setFont(font28); panelMsg.add(lbPass); JLabel lbPass2 = new JLabel("關/總共10關"); lbPass2.setFont(font14); panelMsg.add(lbPass2); panelComponent.add(panelMsg, BorderLayout.CENTER); } /* * 界面初始化*/ private void init() { ImageIcon image = new ImageIcon("icon/icon.png"); this.setIconImage(image.getImage()); // 設置窗口初始大小this.setSize(515, 600); // 設置窗口初始位置this.setLocation(500, 50); // 設置窗口標題this.setTitle("數獨遊戲(By:侯龍超)"); // 設置窗體不允許改變大小this.setResizable(false); // 設置默認關閉操作this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); }}遊戲區畫布:
package hlc.shudu.ui;import hlc.shudu.src.ShuduHelper;import java.awt.BorderLayout;import java.awt.Color;import java.awt.Dialog.ModalExclusionType;import java.awt.event.InputEvent;import java.awt.event.MouseEvent;import java.awt.event.MouseListener;import javax.swing.JDialog;import javax.swing.JOptionPane;import javax.swing.JPanel;import javax.swing.border.Border;import javax.swing.border.TitledBorder;public class ShuduCanvers extends JPanel implements MouseListener { ShuduCell[][] cells; // 得到數獨數組int[][] maps = new int[9][9]; private SelectNumFrame selectNum; /* * 默認構造函數*/ public ShuduCanvers() { ShuduMainFrame.usedTime = 0; maps = ShuduHelper.getMap(); // 加載數獨區this.setLayout(null); cells = new ShuduCell[9][9]; for (int i = 0; i < 9; i++) { for (int j = 0; j < 9; j++) { // this.remove(cells[i][j]); // 創建單元格cells[i][j] = new ShuduCell(); // 設置位置cells[i][j].setLocation(20 + i * 50 + (i / 3) * 5, 20 + j * 50 + (j / 3) * 5); if (passRole(ShuduMainFrame.pass)) { cells[i][j].setText("" + maps[i][j]); // 設置背景顏色cells[i][j].setBackground(getColor(maps[i][j])); cells[i][j].setEnabled(false); cells[i][j].setForeground(Color.gray); } else { cells[i][j].addMouseListener(this); } this.add(cells[i][j]); } } checkFinish(); // reLoadCanvers(); } /* * 檢查是否完成*/ private void checkFinish() { for (int i = 0; i < 9; i++) { for (int j = 0; j < 9; j++) { if (!check(i, j)) { return; } } } // 停止用戶用時計時器ShuduMainFrame.userTimeAction.stop(); // 清除所有cell監聽clearAllListener(); // 闖關數加一ShuduMainFrame.pass += 1; if (ShuduMainFrame.pass > 10) { int o = JOptionPane .showConfirmDialog(this, "您已經通關了,是否重頭開始?", "", 0); if (o == 1) { System.exit(0); } else { ShuduMainFrame.pass = 1; } } else { JOptionPane.showMessageDialog(this, "恭喜你通過本關!用時:" + ShuduMainFrame.usedTime + "秒/n即將進入下一關!"); } // 更新關卡提示ShuduMainFrame.lbPass.setText("" + ShuduMainFrame.pass); // 開始新的關卡reLoadCanvers(); // 打開用戶用時計時器ShuduMainFrame.userTimeAction.start(); } /* * 檢查指定坐標處的單元格*/ private boolean check(int i, int j) { if (cells[i][j].getText().isEmpty()) { return false; } for (int k = 0; k < 9; k++) { if (cells[i][j].getText().trim().equals(cells[i][k].getText().trim()) && j!=k) { return false; } if (cells[i][j].getText().trim().equals(cells[k][j].getText().trim()) && i != k) { return false; } int ii = (i / 3) * 3 + k / 3; int jj = (j / 3) * 3 + k % 3; if (cells[i][j].getText().trim().equals(cells[ii][jj].getText().trim()) &&!(i == ii && j == jj)) { return false; } } return true; } /* * 重新加載數獨區*/ public void reLoadCanvers() { ShuduMainFrame.usedTime = 0; maps = ShuduHelper.getMap(); for (int i = 0; i < 9; i++) { for (int j = 0; j < 9; j++) { this.remove(cells[i][j]); // 創建單元格cells[i][j] = new ShuduCell(); // 設置位置cells[i][j].setLocation(20 + i * 50 + (i / 3) * 5, 20 + j * 50 + (j / 3) * 5); if (passRole(ShuduMainFrame.pass)) { cells[i][j].setText("" + maps[i][j]); // 設置背景顏色cells[i][j].setBackground(getColor(maps[i][j])); cells[i][j].setEnabled(false); cells[i][j].setForeground(Color.gray); } else { cells[i][j].addMouseListener(this); } this.add(cells[i][j]); } } this.repaint(); checkFinish(); } /* * 根據關卡隨機產生該位置是否顯示數字*/ private boolean passRole(int pass) { // TODO Auto-generated method stub return Math.random() * 11 > pass; } /* * 根據數字獲得顏色*/ private Color getColor(int i) { Color color = Color.pink; switch (i) { case 1: color = new Color(255, 255, 204); break; case 2: color = new Color(204, 255, 255); break; case 3: color = new Color(255, 204, 204); break; case 4: color = new Color(255, 204, 153); break; case 5: color = new Color(204, 255, 153); break; case 6: color = new Color(204, 204, 204); break; case 7: color = new Color(255, 204, 204); break; case 8: color = new Color(255, 255, 255); break; case 9: color = new Color(153, 255, 153); break; default: break; } return color; } @Override public void mouseClicked(MouseEvent e) { // TODO Auto-generated method stub } @Override public void mousePressed(MouseEvent e) { int modes = e.getModifiers(); if ((modes & InputEvent.BUTTON3_MASK) != 0) {// 點擊鼠標右鍵// 清空點擊單元格上的內容((ShuduCell) e.getSource()).setText(""); } else if ((modes & InputEvent.BUTTON1_MASK) != 0) {// 點擊鼠標左鍵// 如果選擇數字窗口存在則銷毀if (selectNum != null) { selectNum.dispose(); } // 新建一個選擇窗口selectNum = new SelectNumFrame(); // 設置成模態窗口selectNum.setModal(true); // 設置選擇窗口在顯示器上的位置selectNum.setLocation(e.getLocationOnScreen().x, e.getLocationOnScreen().y); // 將點擊的單元格傳遞給數字選擇窗口selectNum.setCell((ShuduCell) e.getSource()); // 顯示數字選擇窗口selectNum.setVisible(true); } checkFinish(); } /* * 清除所有cell的點擊監聽*/ private void clearAllListener() { for (int i = 0; i < 9; i++) { for (int j = 0; j < 9; j++) { cells[i][j].removeMouseListener(this); } } } @Override public void mouseReleased(MouseEvent e) { // TODO Auto-generated method stub } @Override public void mouseEntered(MouseEvent e) { // TODO Auto-generated method stub } @Override public void mouseExited(MouseEvent e) { // TODO Auto-generated method stub }}數獨單元格:
package hlc.shudu.ui;import java.awt.Color;import java.awt.Font;import javax.swing.JButton;public class ShuduCell extends JButton { public ShuduCell(){ this.setSize(50,50); Font font = new Font("",2,24); this.setFont(font); this.setBackground(new Color(255,153,102)); this.setForeground(Color.BLUE); }}數字選擇框:
package hlc.shudu.ui;import java.awt.Color;import java.awt.Window;import java.awt.event.InputEvent;import java.awt.event.MouseEvent;import java.awt.event.MouseListener;import javax.swing.JButton;import javax.swing.JDialog;import javax.swing.JFrame;public class SelectNumFrame extends JDialog implements MouseListener { private ShuduCell cell; public void setCell(ShuduCell cell) { this.cell = cell; } public SelectNumFrame(){ //隱藏界面上面的工具欄this.setUndecorated(true); this.setSize(150, 150); this.setBackground(new Color(255,204,153, 123)); this.setLayout(null); addNum(); } //添加數字1~9 private void addNum() { for (int i = 0; i < 3; i++) { for (int j = 0; j < 3; j++) { JButton btn = new JButton(); btn.setSize(50, 50); btn.setLocation(i*50,j*50); btn.setText(""+(j*3+i+1)); btn.addMouseListener(this); this.add(btn); } } } @Override public void mouseClicked(MouseEvent e) { // TODO Auto-generated method stub } @Override public void mousePressed(MouseEvent e) { int modes = e.getModifiers(); if ((modes & InputEvent.BUTTON1_MASK) != 0) { JButton btn = (JButton) e.getSource(); cell.setText(btn.getText()); } this.dispose(); } @Override public void mouseReleased(MouseEvent e) { // TODO Auto-generated method stub } @Override public void mouseEntered(MouseEvent e) { // TODO Auto-generated method stub } @Override public void mouseExited(MouseEvent e) { // TODO Auto-generated method stub }}完整程序包可在GitHub上下載:https://github.com/houlongchao/shudu.git
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。