一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|JavaScript|易語言|

服務器之家 - 編程語言 - JAVA教程 - java版數獨游戲界面實現(二)

java版數獨游戲界面實現(二)

2021-03-07 12:12I-Awakening JAVA教程

這篇文章主要為大家詳細介紹了java版數獨游戲界面實現,具有一定的參考價值,感興趣的小伙伴們可以參考一下

本文實例為大家分享了java數獨游戲界面實現的具體代碼,供大家參考,具體內容如下

實現效果圖:

這里寫圖片描述

主函數用于啟動程序:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
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);
 
  }
}

主窗體類(包含消息區,時間區,游戲區):

 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
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);
  }
}

游戲區畫布:

 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
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
 
  }
 
}

數獨單元格:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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);
 }
}

數字選擇框:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
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

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。

原文鏈接:http://blog.csdn.net/da_keng/article/details/47779141

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 国产精品第四页 | 欧美在线看片a免费观看 | 日本三级欧美三级人妇英文 | 三级网站午夜三级 | 猛操美女 | aaa级黄色片 | 我与肥熟老妇的性事 | 出a级黑粗大硬长爽猛视频 吃胸膜奶视频456 | 操国产美女 | 欧美一卡2卡三卡4卡5卡免费观看 | 亚洲日韩精品欧美一区二区 | 我不卡影院手机在线观看 | 操美女b | 啊好大好粗 | 国产美女亚洲精品久久久久久 | 4438全国最大成人网视频 | 午夜伦伦电影理论片费看 | 色综合天天综合网看在线影院 | 99久久精品国产综合一区 | 欧美艳星kagneyiynn高清 | 四虎成人免费视频 | 每天都要睡男人(nph) | 精品久久久久久久久免费影院 | 2015小明台湾永久区域免费 | 日本三级斤| 国产精品日本亚洲777 | 九九九好热在线 | 亚洲无限观看 | 国产视频久久久 | 国产综合视频 | 亚洲精品97福利在线 | 被老外玩爽的中国美女视频 | 亚洲国产区中文在线观看 | 久久国产精品二区99 | 亚洲天堂男人的天堂 | 亚洲精品97福利在线 | 色姑娘导航 | 成年男女免费视频观看性 | 好大好爽好涨太深了小喜 | 午夜想想爱 | fc2免费人成为视频 eeuss18影院www国产 |