1. 扫雷游戏的构思: 设计为初级,中级,高级三个级别。
因此不妨设置为如下规格: 9x9 16x15和30x16 (行,列)规格不同地雷的数量也不同,分别为 10,40 ,99
2.在这个过程遇到了按钮大小调整调用这些函数:
1 btn.setBounds(x,y,width,height);//设置大小并定位
2 或者
3 btn.setSize(width,height);//设置大小
4 btn.setLocation(x,y);//定位
5
6 父容器的layout要设置为null】
/*1。按钮之间的设置问题,如何解决?
调用函数:
public void setMargin(Insets m)设置按钮边框和标签之间的空白。将该空白设置为 null 会造成按钮使用默认空白。按钮的默认 Border 对象将使用该值来创建适当的空白。不过,如果在按钮上设置非默认边框,则由 Border 对象负责创建适当的空白(否则此属性将被忽略)。
参数:
m - 边框和标签之间的间隔
制作到这默认框架已经搭建好了,并附上劣质代码来加以显示:
代码如下:
竹类:
1 package Scan_boobs;
2
3 public class Main {
4 static public void main(String args[] )
5 {
6 new window_scan();
7 }
8 }
框架类:
1 /*扫雷默认为9x9的方格
2 * */
3 package Scan_boobs;
4 import java.awt.*;
5 import javax.swing.*;
6
7 import java.awt.BorderLayout;
8 import java.awt.FlowLayout ;
9 import java.awt.Container ;
10 import java.awt.Font;
11 import java.awt.Insets;
12 import java.awt.event.ActionEvent;
13 import java.awt.event.ActionListener;
14
15 import javax.swing.JPanel ;
16 public class window_scan extends JFrame implements ActionListener
17 {
18
19 private static final long serialVersionUID = 1L;
20 private final int row =9;
21 private final int cow =9;
22 JFrame wind ;
23 JMenuBar myMenubar; //菜单条
24 JMenu Menu []; //菜单
25 JMenuItem [] Submenu ; //子菜单
26 JButton mybutton; //开始按钮
27 JButton [] grid_button ; //扫雷里面的按钮
28 Container mycontainer;
29 /*
30 * 添加到容器中的组件放在一个列表中。列表的顺序
31 * 将定义组件在容器内的正向堆栈顺序。如果将组件
32 * 添加到容器中时未指定索引,则该索引将被添加到列表尾部
33 * (此后它位于堆栈顺序的底部)。
34 * */
35 JPanel jpanel,jpanel1,jpanel2,jpamel3; /*JPanel 是一般轻量级容器。*/
36 /*
37 * 设置三个等级,初级,中级,高级
38 */
39 window_scan()
40 {
41 setTitle("扫雷");
42 setVisible(true); //设置窗口是否可见
43 setResizable(false); //大小不可更改
44 setBounds(400,100,400,500); //初始的位置(400,100),大小(400,500)
45 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
46 //初始
47 mycontainer=getContentPane(); //这个获取目前的
48 init();
49 }
50 void init() {
51
52 Submenu = new JMenuItem [3];
53 Submenu[0]=new JMenuItem("初级");
54 Submenu[1]=new JMenuItem("中级");
55 Submenu[2]=new JMenuItem("高级");
56 Menu = new JMenu [2];
57 Menu[0]= new JMenu("设置");
58 for(int i=0;i<3;i++)
59 {
60 Submenu[i].addActionListener(this); //监听
61 Menu[0].add(Submenu[i]);
62 }
63 mybutton=new JButton("开始"); //开始按钮
64 mybutton.addActionListener(this);
65 Menu[1]= new JMenu("帮助");
66 Menu[1].addActionListener(this);
67 myMenubar =new JMenuBar();
68 //setJMenuBar(myMenubar); //设置此窗体的菜单栏
69 jpanel= new JPanel();
70 jpanel.add(myMenubar);
71 myMenubar.add(Menu[0]);
72 myMenubar.add(Menu[1]);
73 jpanel1 = new JPanel();
74 jpanel1.setLayout(new BorderLayout()); //设置布局
75 jpanel1.add(jpanel,BorderLayout.NORTH);
76 jpanel1.add(mybutton,BorderLayout.CENTER);
77 //设置雷区域
78 jpanel2 = new JPanel();
79 jpanel2.setLayout(new GridLayout(row,cow,0,0)); //网格布局
80 grid_button = new JButton [row*cow];
81 for(int i=0; i<row*cow ; i++)
82 {
83 grid_button[i] = new JButton("");
84 grid_button[i].setMargin(new Insets(0, 0, 0, 0));
85 /*
86 *象是容器边界的表示形式。它指定容器必须在
87 *其各个边缘留出的空间。这个空间可以是边界、
88 *空白空间或标题。
89 * */
90 grid_button[i].setFont(new Font(null,Font.BOLD,25));//设置此容器的字体
91 grid_button[i].addActionListener(this); //行为监视容器
92 grid_button[i].addMouseListener(new MyMouseEvent());
93 jpanel2.add(grid_button[i]);
94 }
95 mycontainer.add(jpanel1,BorderLayout.NORTH);
96 mycontainer.add(jpanel2,BorderLayout.CENTER);
97
98 }
99 @Override
100 public void actionPerformed(ActionEvent e) {
101 // TODO Auto-generated method stub
102
103 }
104 }
105
消息映射类:
代码:
1 package Scan_boobs;
2
3 import java.awt.event.MouseEvent;
4 import java.awt.event.MouseListener;
5
6 public class MyMouseEvent implements MouseListener {
7
8 @Override
9 public void mouseClicked(MouseEvent e) {
10 // TODO Auto-generated method stub
11
12 }
13
14 @Override
15 public void mouseEntered(MouseEvent e) {
16 // TODO Auto-generated method stub
17
18 }
19
20 @Override
21 public void mouseExited(MouseEvent e) {
22 // TODO Auto-generated method stub
23
24 }
25
26 @Override
27 public void mousePressed(MouseEvent e) {
28 // TODO Auto-generated method stub
29
30 }
31
32 @Override
33 public void mouseReleased(MouseEvent e) {
34 // TODO Auto-generated method stub
35
36 }
37
38 }
下面开始导入算法部分:
(1)算法一: 布雷的思路:
(2 )算法二: 挖雷的思路:
设置为5中状态: 0,1,2,3,4;
抽象出来就是,打开一个格子,如果里边的数字是0(周围没有雷)的话,就打开周围的8个格子,并继续搜索打开的8个格子中是否有0,如果有就重复...直到打开一片为0的区域(如果存在的话)。
学习知识点:
注意一点: java中 1无法等同与true
Math.random():产生一个[0,1)之间的随机数。
暂且做到这个地方:
代码:
1 package Scan_boobs;
2
3 public class Main
4 {
5 static public void main(String args[] )
6 {
7 new window_scan();
8 }
9 }
1 /*扫雷默认为9x9的方格
2 * */
3 package Scan_boobs;
4 import java.awt.*;
5 import javax.swing.*;
6
7 import java.awt.BorderLayout;
8 import java.awt.FlowLayout ;
9 import java.awt.Container ;
10 import java.awt.Font;
11 import java.awt.Insets;
12 import java.awt.event.ActionEvent;
13 import java.awt.event.ActionListener;
14 import javax.swing.JPanel ;
15 public class window_scan extends JFrame implements ActionListener
16 {
17
18 private static final long serialVersionUID = 1L;
19 public static int row =9;
20 public static int cow =9;
21 JFrame wind ;
22 JMenuBar myMenubar; //菜单条
23 JMenu Menu []; //菜单
24 JMenuItem [] Submenu ; //子菜单
25 JButton mybutton; //开始按钮
26 public static JButton [] grid_button ; //扫雷里面的按钮
27 Container mycontainer;
28 public static int [][] array; //相应格子的状态
29 public static int [] boombs; //炸弹的位置
30 public static int boombs_number ; //炸弹的数量
31
32 /*
33 * 添加到容器中的组件放在一个列表中。列表的顺序
34 * 将定义组件在容器内的正向堆栈顺序。如果将组件
35 * 添加到容器中时未指定索引,则该索引将被添加到列表尾部
36 * (此后它位于堆栈顺序的底部)。
37 * */
38
39 JPanel jpanel,jpanel1,jpanel2,jpamel3; /*JPanel 是一般轻量级容器。*/
40
41 /*
42 * 设置三个等级,初级,中级,高级
43 */
44
45 window_scan()
46 {
47 setTitle("扫雷");
48 setVisible(true); //设置窗口是否可见
49 setResizable(false); //大小不可更改
50 setBounds(400,100,400,500); //初始的位置(400,100),大小(400,500)
51 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
52 //初始
53 mycontainer=getContentPane(); //这个获取目前的
54 wind_init();
55 }
56
57 void wind_init() {
58
59 Submenu = new JMenuItem [3];
60 Submenu[0]=new JMenuItem("初级");
61 Submenu[1]=new JMenuItem("中级");
62 Submenu[2]=new JMenuItem("高级");
63 Menu = new JMenu [2];
64 Menu[0]= new JMenu("设置");
65 for(int i=0;i<3;i++)
66 {
67 Submenu[i].addActionListener(this); //监听
68 Menu[0].add(Submenu[i]);
69 }
70 mybutton=new JButton("开始"); //开始按钮
71 mybutton.addActionListener(this);
72 Menu[1]= new JMenu("帮助");
73 Menu[1].addActionListener(this);
74 myMenubar =new JMenuBar();
75 //setJMenuBar(myMenubar); //设置此窗体的菜单栏
76 jpanel= new JPanel();
77 jpanel.add(myMenubar);
78 myMenubar.add(Menu[0]);
79 myMenubar.add(Menu[1]);
80 jpanel1 = new JPanel();
81 jpanel1.setLayout(new BorderLayout()); //设置布局
82 jpanel1.add(jpanel,BorderLayout.NORTH);
83 jpanel1.add(mybutton,BorderLayout.CENTER);
84 grid_button(9,9,0); //初始炸弹设置为〇
85 mycontainer.add(jpanel1,BorderLayout.NORTH);
86 }
87
88 @Override
89 public void actionPerformed(ActionEvent e) {
90 // TODO Auto-generated method stub
91 if(e.getActionCommand()=="初级")
92 {
93 row=cow=9;
94 array = new int [row][cow] ; //设置数组大小
95 //撤销原先的按钮分布使其失效
96 this.remove(jpanel2);
97 grid_button(row,cow,10);
98 this.pack();
99 //初始化状态
100 this.init(row,cow);
101 }
102 else if(e.getActionCommand()=="中级")
103 {
104 row=16;
105 cow=15;
106 array =new int [row][cow];
107 this.remove(jpanel2);
108 grid_button(row,cow,40);
109 this.pack();
110 //初始化状态
111 this.init(row,cow);
112 }
113 else if(e.getActionCommand()=="高级")
114 {
115 row=30;
116 cow=16;
117 array=new int [row+2][cow+2];
118 this.remove(jpanel2);
119 grid_button(row,cow,40);
120 this.pack();
121 //初始化状态
122 this.init(row,cow);
123 }
124 if(e.getSource()==mybutton) //点击了开始按钮
125 {
126
127
128 this.init(row,cow);
129 //设置炸弹随机安放---->这里需要考虑的是产生不同数字
130
131 boolean [] check_position= new boolean [row*cow+3];
132 for(int i=0; i<boombs_number; i++)
133 {
134 while(true)
135 {
136 int temp_val=(int)(Math.random()*(row*cow)); //[0,1]*(row*cow);
137 if(check_position[temp_val]==false)
138 {
139 check_position[temp_val]=true;
140 boombs[i]=temp_val;
141 break;
142 }
143 }
144 }
145 //安装炸弹,哇咔咔,果然想想都很有趣...........
146 //首先转化为x,y的坐标
147 int x,y;
148 for(int i=0;i<boombs_number; i++){
149 x=boombs[i]/row;
150 y=boombs[i]%row;
151 array[x][y]=50; //将这个定义为炸弹的状态
152 }
153 // for(int i=0;i<row+2;i++){
154 // for(int j=0;j<cow+2;j++){
155 // if(i==0||j==0||i==row+1||j==cow+1){
156 // array[i][j]=0;
157 // }
158 // }
159 // }
160
161 //参考别人的代码,实在是有点想不到这个算法怎么弄,思密达
162 for(int i=1;i<=row;i++)
163 {
164 for(int j=1;j<=cow;j++)
165 {
166 if(array[i][j]!=50)
167 {
168 for(int l=j-1;l<=j+1;l++)
169 {
170 if(array[i-1][l]==50) array[i][j]++;
171 if(array[i+1][l]==50) array[i][j]++;
172 }
173 if(array[i][j-1]==50) array[i][j]++;
174 if(array[i][j+1]==50) array[i][j]++;
175 }
176 }
177 }
178 }
179 for(int i=0;i<cow*row;i++){
180 if(grid_button[i].getText()!="★")
181 {
182 int x=i/cow+1;
183 int y=i%cow+1;
184 if(e.getSource()==grid_button[i]&&array[x][y]==100){
185 grid_button[i].setText("★");
186 grid_button[i].setEnabled(false);
187 array[x][y]=10;
188 for(int k=0;k<cow*row;k++){
189 int m1=k/cow+1;
190 int n1=k%cow+1;
191 if(array[m1][n1]!=10&&grid_button[k].getText()=="★"){
192 grid_button[k].setText("*o*");
193 }
194 }
195 for(int j=0;j<cow*row;j++){
196 int m=j/cow+1;
197 int n=j%cow+1;
198 if(array[m][n]==100){
199 grid_button[j].setText("★");
200 grid_button[j].setEnabled(false);
201 }
202 grid_button[j].setEnabled(false);
203 array[m][n]=10;
204 }
205 }
206 else if(e.getSource()==grid_button[i]){
207 if(array[x][y]==0){
208 wa_lei(array,grid_button,e,i,x,y);
209 array[x][y]=10;
210 grid_button[i].setEnabled(false);
211 }
212 if(array[x][y]!=0&&array[x][y]!=10){
213 grid_button[i].setText(array[x][y]+"");
214 grid_button[i].setEnabled(false);
215 array[x][y]=10;
216 }
217 }
218 }else if(grid_button[i].getText()=="★"){
219 }
220 }
221 }
222 /*************布置按钮方法**************************/
223 public void grid_button(int row ,int cow ,int boombs_number)
224 {
225 //设置雷区域
226 jpanel2 = new JPanel();
227 jpanel2.setLayout(new GridLayout(row,cow,0,0)); //网格布局
228 grid_button = new JButton [row*cow];
229 boombs =new int [boombs_number];
230 for(int i=0; i<row*cow ; i++)
231 {
232 grid_button[i] = new JButton(" "); //有点空格将按钮弄大些
233 grid_button[i].setMargin(new Insets(0, 0, 0, 0));
234 /*
235 *象是容器边界的表示形式。它指定容器必须在
236 *其各个边缘留出的空间。这个空间可以是边界、
237 *空白空间或标题。
238 * */
239 grid_button[i].setFont(new Font(null,Font.BOLD,25));//设置此容器的字体
240 grid_button[i].addActionListener(this); //行为监视容器
241 grid_button[i].addMouseListener(new MyMouseEvent());
242 // grid_button[i].setText("");
243 // grid_button[i].setEnabled(true);
244 jpanel2.add(grid_button[i]);
245 }
246 mycontainer.add(jpanel2,BorderLayout.CENTER);
247 }
248 /***************初始化状态****************/
249 public void init(int row,int cow)
250 {
251 for(int i=0;i<row+2;i++){
252 for(int j=0;j<cow+2;j++){
253 array[i][j]=0;
254 }
255 }
256 for(int i=0;i<cow*row;i++){
257 grid_button[i].setText("");
258 grid_button[i].setEnabled(true);
259 }
260 }
261 public void wa_lei(int[][] a,JButton[] btns,ActionEvent e,int i,int x,int y){
262 int p=1;
263 if(a[x][y]==0){
264 a[x][y]=10;
265 btns[i].setEnabled(false); //33
266 for(int l=y-1;l<=y+1;l++){
267 int m=x-1-1;
268 int n=l-1;
269 p=1;
270 System.out.println(a[1][2]);
271 if(n>-1&&n<cow&&m>-1&&m<row)
272 {
273 for(int q=0;q<row&&p==1;q++){//cow-->row;
274 if(((n+cow*q)>=(m*cow))&&((n+cow*q)<(m+1)*cow)){
275 if(a[x-1][l]!=0&&a[x-1][l]!=10){
276 btns[n+cow*q].setText(a[x-1][l]+"");
277 a[x-1][l]=10;
278 btns[n+cow*q].setEnabled(false);
279 }
280 else if(a[x-1][l]==0){
281 //a[x-1][l]=10;
282 btns[n+cow*q].setEnabled(false);
283 wa_lei(a,btns,e,n+cow*q,x-1,l); ////55////
284 a[x-1][l]=10;
285 btns[n+cow*q].setEnabled(false);
286 }
287 p=0;
288
289 }
290 }
291 }
292 p=1;
293 m=x;
294 if(n>-1&&n<cow&&m>-1&&m<cow)
295 {
296 for(int q=0;q<row&&p==1;q++){
297 if(((n+cow*q)>=(m*cow))&&((n+cow*q)<(m+1)*cow)){
298 if(a[x+1][l]!=0&&a[x+1][l]!=10){
299 btns[n+cow*q].setText(a[x+1][l]+"");
300 a[x+1][l]=10;
301 btns[n+cow*q].setEnabled(false);
302 }
303 else if(a[x+1][l]==0){
304
305 wa_lei(a,btns,e,n+cow*q,x+1,l);///55////
306 a[x+1][l]=10;
307 btns[n+cow*q].setEnabled(false);
308 }
309 p=0;
310 }
311 }
312
313 }
314 }
315 int m=x-1;
316 int n=y-1-1;
317 p=1;
318 if(n>-1&&n<cow&&m>-1&&m<cow)
319 {
320 for(int q=0;q<row&&p==1;q++){
321 if(((n+cow*q)>=(m*cow))&&((n+cow*q)<(m+1)*cow)){
322 if(a[x][y-1]!=0&&a[x][y-1]!=10){
323 btns[n+cow*q].setText(a[x][y-1]+"");
324 a[x][y-1]=10;
325 btns[n+cow*q].setEnabled(false);
326 }
327 else if(a[x][y-1]==0){
328
329
330 wa_lei(a,btns,e,n+cow*q,x,y-1);
331
332 a[x][y-1]=10;
333 btns[n+cow*q].setEnabled(false);
334 }
335 p=0;
336 }
337 }
338 }
339 p=1;
340 m=x-1;
341 n=y+1-1;
342 if(n>-1&&n<cow&&m>-1&&m<cow)
343 {
344 for(int q=0;q<row&&p==1;q++){
345 if(((n+cow*q)>=(m*cow))&&((n+cow*q)<(m+1)*cow)){
346 if(a[x][y+1]!=0&&a[x][y+1]!=10){
347 btns[n+cow*q].setText(a[x][y+1]+"");
348 a[x][y+1]=10;
349 btns[n+cow*q].setEnabled(false);
350 }
351 else if(a[x][y+1]==0){
352 wa_lei(a,btns,e,n+cow*q,x,y+1);
353 a[x][y+1]=10;
354 btns[n+cow*q].setEnabled(false);
355 }
356 p=0;
357 }
358 }
359 }
360 }
361
362 }
363
364 }
1 package Scan_boobs;
2
3 import java.awt.event.MouseEvent;
4 import java.awt.event.MouseListener;
5
6 public class MyMouseEvent implements MouseListener {
7 @Override
8 public void mouseClicked(MouseEvent e) {
9 // TODO Auto-generated method stub
10 for(int i=0;i<window_scan.cow*window_scan.row;i++){
11 int x1=i/window_scan.cow+1;
12 int y1=i%window_scan.cow+1;
13 if(e.getSource()==window_scan.grid_button[i]&&window_scan.grid_button[i].getText()!="★"&&window_scan.array[x1][y1]!=10)
14 {
15 if(e.getButton()==MouseEvent.BUTTON3){
16 window_scan.grid_button[i].setText("★");
17 window_scan.boombs_number--;
18 if(window_scan.boombs_number==0){
19 int flag=0;
20 for(int j=0;j<window_scan.cow*window_scan.row;j++){
21 int x=j/window_scan.cow;
22 int y=j%window_scan.cow;
23 if(window_scan.array[x][y]==100&&window_scan.grid_button[j].getText()=="★"){
24 flag++;
25 }
26 }
27 }
28 }
29 }
30
31 else
32 if(e.getSource()==window_scan.grid_button[i]&&window_scan.grid_button[i].getText()=="★"&&window_scan.array[x1][y1]!=-1){
33 if(e.getButton()==MouseEvent.BUTTON3){
34 window_scan.grid_button[i].setText("");
35 window_scan.boombs_number++;
36 window_scan.grid_button[i].setEnabled(true);
37 }
38 }
39 }
40
41 }
42
43 @Override
44 public void mouseEntered(MouseEvent e) {
45 // TODO Auto-generated method stub
46
47 }
48
49 @Override
50 public void mouseExited(MouseEvent e) {
51 // TODO Auto-generated method stub
52
53 }
54
55 @Override
56 public void mousePressed(MouseEvent e) {
57 // TODO Auto-generated method stub
58
59 }
60
61 @Override
62 public void mouseReleased(MouseEvent e) {
63 // TODO Auto-generated method stub
64
65 }
66
67 }