软件设计之基于Java的连连看小游戏——所有功能的实现

Posted xioayantongxue

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了软件设计之基于Java的连连看小游戏——所有功能的实现相关的知识,希望对你有一定的参考价值。

新年快乐!
期末接二连三的考试实在太忙了忘记连连看没有更新完,今天想要学习生信时才发现。所以这次直接把连连看所有功能全部放上。

 

在传统的连连看的基础上,我增加了上传头像的功能,即可以自行上传图片作为游戏中要消除的图片,算是设计的一个亮点。

先把游戏截图放上。

技术图片

(主界面)

技术图片

(点击上传头像后的对话框)

技术图片

(游戏界面)

技术图片技术图片

 

 

 (菜单栏)

技术图片

 

 

 

 代码(最终版,在一、二的基础上做了改进):

  Shown类包含三个界面,frame1为主界面,frame2为游戏界面,frame3为游戏规则。其中简单的事件处理以内部类的形式直接完成,消除及判断功能在Function类中实现,倒计时判断及时间提示功能在Time类中,游戏帮助功能在NewMap类中,包括游戏结束的判断及无解时自动洗牌功能的实现。

(1)Shown类:

技术图片
  1 public class Shown extends Thread{                
  2     static JFrame frame1=new JFrame("工大连连看");
  3     static JFrame frame2=new JFrame("工大连连看");
  4     static JFrame frame3=new JFrame("游戏规则");
  5     //8*12
  6     static JButton[][] imgbutton= new JButton[10][14];//第三维的0号元素储存button,第1号元素为rand值
  7     static ImageIcon[][] img=new ImageIcon[10][14];//用数组方便后面判断
  8     static ArrayList<String> logo=new ArrayList<String>(Arrays.asList("E:\\学习\\Sophomore\\软件设计\\picture\\c++.jpg","E:\\学习\\Sophomore\\软件设计\\picture\\c.jpg","E:\\学习\\Sophomore\\软件设计\\picture\\java.jpg","E:\\学习\\Sophomore\\软件设计\\picture\\eclipse.jpg","E:\\学习\\Sophomore\\软件设计\\picture\\go.jpg","E:\\学习\\Sophomore\\软件设计\\picture\\codeblocks.jpg","E:\\学习\\Sophomore\\软件设计\\picture\\js.jpg","E:\\学习\\Sophomore\\软件设计\\picture\\liteide.jpg","E:\\学习\\Sophomore\\软件设计\\picture\\php.jpg","E:\\学习\\Sophomore\\软件设计\\picture\\python.jpg","E:\\学习\\Sophomore\\软件设计\\picture\\sql.jpg","E:\\学习\\Sophomore\\软件设计\\picture\\vs.jpg"));
  9     static int pic_num=12;//所有的图片数量
 10     static int new_num=0;//已使用新地图次数
 11     public static int help_num=0;//已使用的帮助次数
 12     
 13     static void frame1(){
 14                 
 15         frame1.setLocation(220, 75);//设置窗口出现的位置
 16         JButton pic=new JButton("上传头像");
 17         JButton begin_index=new JButton("开始冒险");
 18         JButton rul=new JButton("游戏规则");
 19         frame1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);  
 20                 
 21         //设置窗口图标
 22         Toolkit tool=frame1.getToolkit();
 23         Image image1=tool.getImage("E:\\学习\\Sophomore\\软件设计\\picture\\hit.jpg");
 24         frame1.setIconImage(image1);
 25 
 26         //添加按钮
 27         begin_index.setBackground(Color.yellow);pic.setBackground(Color.white);rul.setBackground(Color.white);//按钮颜色设置
 28         begin_index.setFont(new Font("Dialog",1,20));pic.setFont(new Font("Dialog",1,20));rul.setFont(new Font("Dialog",1,20));//文字大小设置
 29         pic.setFocusPainted(false);    begin_index.setFocusPainted(false);rul.setFocusPainted(false);//去除文字周围虚线框
 30         JPanel panel=new JPanel();
 31         panel.setBackground(null);//panel背景透明
 32         panel.setOpaque(false);
 33         panel.add(pic);
 34         panel.add(begin_index);
 35         panel.add(rul);
 36         pic.setBounds(200, 350, 120, 20);
 37         begin_index.setBounds(400, 350, 150, 40);
 38         rul.setBounds(600, 350, 120, 20);
 39         panel.setBounds(-20, 350, 800, 500);
 40         frame1.add(panel);
 41         
 42         //设置背景图片
 43         frame1.setLayout(null);//只有null才会显示图片
 44         ImageIcon img=new ImageIcon("E:\\学习\\Sophomore\\软件设计\\picture\\frame.jpg");
 45         JLabel imglabel=new JLabel(img);
 46         frame1.add(imglabel);
 47         imglabel.setBounds(0,0,800,450);
 48         
 49         //设置按钮
 50         begin_index.addActionListener(new ActionListener() {//注册事件监听器,点击button时执行方法frame2
 51             public void actionPerformed(ActionEvent event) {
 52                 frame2();
 53             }
 54         });
 55         
 56         pic.addActionListener(new ActionListener() {
 57             public void actionPerformed(ActionEvent event) {
 58                 JFileChooser jfc=new JFileChooser("C:\\");  //打开时的默认路径
 59                 jfc.setFileSelectionMode(JFileChooser.FILES_ONLY);  //只能打开文件
 60                 jfc.addChoosableFileFilter(new FileNameExtensionFilter("jpg","png"));//只能选择JPG或PNG
 61                 jfc.showDialog(jfc, "选择");  
 62                 jfc.setMultiSelectionEnabled(false);//不能同时选择多个图片
 63                 File file=jfc.getSelectedFile();  
 64                 if(file!=null) 
 65                     pic_num++;
 66                 logo.add(file.getAbsolutePath());
 67                 } 
 68         });
 69 
 70         rul.addActionListener(new ActionListener() {
 71             public void actionPerformed(ActionEvent event) {
 72                 frame3();
 73             }
 74         });
 75         
 76         frame1.setSize(810,490);
 77         frame1.setVisible(true);
 78     }
 79     static JPanel p;
 80 
 81     public static void frame2() {
 82         
 83         //获取当前时间        
 84          Calendar now = Calendar.getInstance();
 85          int year=now.get(Calendar.YEAR);
 86          int month=now.get(Calendar.MONTH)+1;
 87          int date=now.get(Calendar.DATE);
 88          int hour=now.get(Calendar.HOUR);
 89          int min=now.get(Calendar.MINUTE)+2;//游戏时间为2分钟
 90          int second=now.get(Calendar.SECOND);
 91         
 92         frame1.setVisible(false);//frame1消失
 93         frame2.setLocation(100, 15);
 94         JPanel panel1=new JPanel();//gridlayout
 95         JPanel panel2=new JPanel();//borderlayout
 96         frame2.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);  
 97         JLabel jl=new JLabel("剩余洗牌次数:3");
 98         JLabel jl2=new JLabel("剩余帮助次数:3");
 99                 
100         //设置窗口图标
101         Toolkit tool=frame1.getToolkit();
102         Image image1=tool.getImage("E:\\学习\\Sophomore\\软件设计\\picture\\hit.jpg");
103         frame2.setIconImage(image1);
104         
105         //布局
106         GridLayout gridlayout=new GridLayout(10,14,0,0);
107         panel1.setLayout(gridlayout);
108         //borderlayout中添加gridlayout
109         panel2.setLayout(new BorderLayout());
110         frame2.add(panel2);
111         panel2.add(panel1,BorderLayout.CENTER);
112         //frame上为panel2(border),panel2的中间为panel1(grid)
113         
114         //菜单栏
115         JMenuBar menuBar = new JMenuBar();
116         frame2.setJMenuBar(menuBar);
117         JMenu color=new JMenu("背景颜色");
118         JMenu ruler= new JMenu("游戏规则");
119         JMenu help=new JMenu("游戏帮助");
120         //JMenu ex=new JMenu("");
121         menuBar.add(ruler);
122         menuBar.add(color);
123         menuBar.add(help);
124         JMenuItem moren = new JMenuItem("默认");
125         JMenuItem red = new JMenuItem("红色");
126         JMenuItem blue = new JMenuItem("蓝色");
127         JMenuItem green = new JMenuItem("绿色");
128         JMenuItem yellow = new JMenuItem("黄色");
129         JMenuItem ru = new JMenuItem("游戏规则");
130         JMenuItem nm = new JMenuItem("重新洗牌");
131         JMenuItem find=new JMenuItem("查找帮助");
132         
133         help.add(find);
134         help.add(nm);
135         ruler.add(ru);
136         color.add(red);
137         color.add(blue);
138         color.add(green);
139         color.add(yellow);
140         color.add(moren);//#e1edef
141 
142         find.addActionListener(new ActionListener() {
143             @Override
144             public void actionPerformed(ActionEvent e) {
145                 if(help_num<3) {//使用次数小于等于三时可以新地图
146                     help_num++;
147                     jl2.setText("  剩余查找次数:"+(3-Shown.help_num)+"   ");
148                     NewMap.help();
149                 }else {
150                      JOptionPane.showMessageDialog( null, "帮助查找次数已经用完了哦,靠人不如靠自己,加油!");
151                 }
152             }
153         });
154         
155         nm.addActionListener(new ActionListener() {
156             @Override
157             public void actionPerformed(ActionEvent e) {
158                 if(new_num<3) {//使用次数小于等于三时可以新地图
159                     new_num++;
160                     jl.setText("  剩余洗牌次数:"+(3-Shown.new_num)+"  ");
161                     NewMap.newmap();
162                 }else {
163                      JOptionPane.showMessageDialog( null, "洗牌次数已经用完了哦,睁大眼睛继续找吧,fighting!");
164                 }
165             }
166         });
167         
168         moren.addActionListener(new ActionListener() {
169             @Override
170             public void actionPerformed(ActionEvent e) {
171                 for(int i=0;i<10;i++) {
172                     for(int j=0;j<14;j++) {
173                         imgbutton[i][j].setBackground(Color.decode("#e1edef"));
174                     }
175                 }
176             }
177         });
178         red.addActionListener(new ActionListener() {
179                 @Override
180                 public void actionPerformed(ActionEvent e) {
181                     for(int i=0;i<10;i++) {
182                         for(int j=0;j<14;j++) {
183                             imgbutton[i][j].setBackground(Color.red);
184                         }
185                     }
186                 }
187             });
188         blue.addActionListener(new ActionListener() {
189             @Override
190             public void actionPerformed(ActionEvent e) {
191                 for(int i=0;i<10;i++) {
192                     for(int j=0;j<14;j++) {
193                         imgbutton[i][j].setBackground(Color.blue);
194                     }
195                 }
196             }
197         });
198         green.addActionListener(new ActionListener() {
199             @Override
200             public void actionPerformed(ActionEvent e) {
201                 for(int i=0;i<10;i++) {
202                     for(int j=0;j<14;j++) {
203                         imgbutton[i][j].setBackground(Color.green);
204                     }
205                 }
206             }
207         });
208         yellow.addActionListener(new ActionListener() {
209             @Override
210             public void actionPerformed(ActionEvent e) {
211                 for(int i=0;i<10;i++) {
212                     for(int j=0;j<14;j++) {
213                         imgbutton[i][j].setBackground(Color.yellow);
214                     }
215                 }
216             }
217         });
218         ru.addActionListener(new ActionListener() {
219             @Override
220             public void actionPerformed(ActionEvent e) {
221                 frame3();
222             }
223         });
224         
225         //添加按钮及设置菜单背景
226         JPanel panel_button=new JPanel();
227         
228         Time t=new Time();
229         
230         t.timer(year+"-0"+month+"-0"+date+" "+hour+":"+min+":"+second);//yyyy-MM-dd hh:mm:ss
231         
232         //t.timer("2020-01-02 "+hour+":"+min+":"+second);//yyyy-MM-dd HH:mm:ss
233         
234         panel_button.add(jl);
235         panel_button.add(Time.jl0);
236         panel_button.add(jl2);
237         
238         panel_button.setOpaque(true);
239         panel_button.setBackground(Color.decode("#dbe4f5"));
240         panel2.add(panel_button,BorderLayout.NORTH);
241         
242         //添加图形及游戏背景
243         //10行14列的button按矩阵排列,周围button不可点击无img无边框
244 
245         int[] ran=new int[96];
246         List list = new ArrayList();
247         for(int m=0;m<48;m++) {
248             Random r=new Random();
249             int ra=r.nextInt(pic_num);
250             ran[m]=ra;
251             ran[m+48]=ra;
252         }
253          for(int p = 0;p < ran.length;p++){           
254              list.add(ran[p]);
255              } 
256          Collections.shuffle(list);//list打乱顺序
257          for(int i = 0; i < list.size();i++) {//乱序ran[]
258              ran[i]=(int) list.get(i);
259            }
260       
261         Border emptyBorder = BorderFactory.createEmptyBorder(0,0,0,0); 
262         
263         for(int j=0;j<14;j++) {
264             img[0][j]=null;//第0行的img为空
265             img[9][j]=null;//9行的img为空
266         }
267         
268         for (int i=0;i<10;i++) {
269                 img[i][0]=null;
270                 img[i][13]=null;//每一行第一个和最后一个图片为空
271         }
272         int r=0;
273         for(int i=1;i<=8;i++) {
274             for(int j=1;j<=12;j++) {
275                 img[i][j]=new ImageIcon(logo.get(ran[r]));
276                 img[i][j].setImage(img[i][j].getImage().getScaledInstance(60, 56,Image.SCALE_DEFAULT));
277                 r++;
278             }
279         }
280 
281         for(int i=0;i<10;i++) {//0-9行    
282             for(int j=0;j<14;j++) {//0-13列
283                 imgbutton[i][j]=new JButton(img[i][j]);
284                 imgbutton[i][j].setOpaque(true);
285                 imgbutton[i][j].setBackground(Color.decode("#e1edef"));
286                 panel1.add(imgbutton[i][j]);//代表第i行第j列的图形
287                 
288             }
289         
290         }
291     
292         for(int j=0;j<14;j++) {//周围button消除边框和点击功能
293             imgbutton[0][j].setEnabled(false);
294             imgbutton[9][j].setEnabled(false);
295             imgbutton[0][j].setBorder(emptyBorder);
296             imgbutton[9][j].setBorder(emptyBorder);
297         }
298         for(int i=1;i<9;i++) {
299             imgbutton[i][0].setEnabled(false);
300             imgbutton[i][13].setEnabled(false);
301             imgbutton[i][0].setBorder(emptyBorder);
302             imgbutton[i][13].setBorder(emptyBorder);
303         }
304         
305         //添加事件监听器
306         try{
307             for(int i=1;i<9;i++) {
308             for(int j=1;j<13;j++) {
309                 final int m=i;
310                 final int n=j;
311                 imgbutton[i][j].addActionListener(new ActionListener() {
312                     //如果此时栈为空,则入栈;如果栈不为空,则flag判断                
313                     public void actionPerformed(ActionEvent event) {
314                         
315                         imgbutton[m][n].setBackground(Color.red);//点击时变色
316                         
317                         if(Function.stack.empty()) {//如果此时栈为空,点击的button入栈
318                             int[] arr= {m,n};//把点击的button的i j作为数组入栈
319                             Function.stack.push(arr);//数组入栈
320                         }else {
321                             
322                             Function.flag(Function.stack,m,n);//执行flag()函数
323                             
324                             imgbutton[m][n].setBackground(Color.decode("#e1edef"));
325                             imgbutton[Function.num[0]][Function.num[1]].setBackground(Color.decode("#e1edef"));//尝试了很多种表示坐标的方法都执行都出错。只有用Num不报错
326                             //当点击完成一对图形时恢复原色
327                         }    
328                         //frame2.setVisible(false);//检测事件监听器    
329                     }
330                 });
331             }
332          }
333         }catch(Exception e) {
334             System.err.print(e);
335         }
336         frame2.setSize(1000,650);
337         frame2.setVisible(true);
338     }
339     
340     static void frame3() {//游戏规则
341         //frame1.setVisible(false);//frame1消失
342         frame3.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);  
343         
344         //设置窗口图标
345         Toolkit tool=frame3.getToolkit();
346         Image image1=tool.getImage("E:\\学习\\Sophomore\\软件设计\\picture\\hit.jpg");
347         frame3.setIconImage(image1);
348                 
349         frame3.setLayout(new BorderLayout());
350         frame3.setLocation(250, 75);//设置窗口出现的位置
351         JButton begin_index=new JButton("继续游戏");
352         begin_index.setFocusPainted(false);
353         frame3.setBackground(Color.decode("#e1edef"));
354         
355         //文字
356         JPanel center =new JPanel();
357         ImageIcon img=new ImageIcon("E:\\学习\\Sophomore\\软件设计\\picture\\wenzi.jpg");
358         img.setImage(img.getImage().getScaledInstance(790, 350,Image.SCALE_DEFAULT));        
359         JLabel imglabel=new JLabel(img);
360         center.add(imglabel);
361         frame3.add(center,BorderLayout.CENTER);
362         
363         //设置开始按钮
364         JPanel south=new JPanel();
365         south.setBackground(Color.decode("#ffc6c6"));
366         center.setBackground(Color.decode("#ffc6c6"));
367         south.add(begin_index);
368         frame3.add(south,BorderLayout.SOUTH);
369         begin_index.setBounds(0,0,50,20);//大小设置
370         begin_index.setBackground(Color.white);//按钮颜色设置
371         begin_index.setFont(new Font("Dialog",1,20));//文字大小设置
372         begin_index.addActionListener(new ActionListener() {//注册事件监听器,点击button时执行方法frame2
373             public void actionPerformed(ActionEvent event) {
374                 frame3.setVisible(false);
375             }
376         });
377         
378         frame3.setSize(800,490);
379         frame3.setVisible(true);
380     }
381         
382     static Shown shown1=new Shown();
383     public static void main(String[] args) {
384 
385         shown1.frame1();
386                 
387     }
388 }
Shown

(2)Function类:

技术图片
  1 public class Function {
  2     public static int num[]=new int[2];
  3     public static Stack<int[]> stack=new Stack<int[]>(); //点击的button的序号入栈
  4     //private Graphics2D g;
  5     
  6     //建立一个数字矩阵表示棋盘,1表示可行,0表示不可行
  7     static int[][] chess=new int[10][14];
  8         
  9     //当栈内不为空时执行flag函数
 10     //先判断是否一致,若一致则road判断路径是否符合要求,再执行link()连线
 11     //ij 为栈内已经存在的button的坐标,m,n为刚刚点击的button的坐标
 12     //使用for循环寻找两个img的
 13     public static void flag(Stack<int[]> stack,int m,int n) {
 14         
 15         num=stack.peek();//peek栈顶元素(未取出)
 16         int i=num[0];int j=num[1];
 17 
 18         //初始化矩阵
 19         for(int x=0;x<14;x++) {
 20             chess[0][x]=1;
 21             chess[9][x]=1;
 22         }
 23         for(int y=1;y<9;y++) {
 24             chess[y][0]=1;
 25             chess[y][13]=1;
 26         }
 27         for(int[] a:chess) {
 28             for(int b:a)
 29                 b=0;
 30         }
 31         
 32         if(i==m&&j==n) {//如果重复点击同一个图片则清空栈,重新开始一对
 33             stack.clear();
 34             Shown.imgbutton[m][n].setBackground(Color.decode("#e1edef"));
 35         }else {
 36             if((Shown.img[i][j].getDescription()==Shown.img[m][n].getDescription())&&road(m,n,i,j)) {//尝试了很多个函数
 37                 //如果两个图片相同且路径满足要求
 38                     
 39                 chess[i][j]=1;
 40                 chess[m][n]=1;//矩阵中相关元素改为1
 41                 
 42                 NewMap.over();//游戏结束对话框
 43                 
 44                 //NewMap.test();
 45                                 
 46                 //把button上的图片改为空白
 47                 ImageIcon img=new ImageIcon("E:\\学习\\Sophomore\\软件设计\\picture\\good.jpg");
 48                 img.setImage(img.getImage().getScaledInstance(70, 70,Image.SCALE_DEFAULT));
 49                                 
 50                 Shown.imgbutton[m][n].setIcon(img);
 51                 Shown.imgbutton[i][j].setIcon(img);
 52                 Border emptyBorder = BorderFactory.createEmptyBorder(0,0,0,0); 
 53                 Shown.imgbutton[m][n].setBorder(emptyBorder);
 54                 Shown.imgbutton[i][j].setBorder(emptyBorder);
 55                 stack.clear();//完成后清空栈        
 56             }else {
 57                 stack.clear();//如果不相等则出栈,重新开始一组比较
 58             }
 59         }
 60     }
 61             
 62     static boolean road0(int x1,int y1,int x2,int y2) {//没有拐点
 63         //相邻时
 64         if((Math.abs(x1-x2)==1&&y1==y2)||(Math.abs(y2-y1)==1&&x1==x2)) {
 65             return true;
 66         }
 67         
 68         if((y1==y2)) {//当在同一列且不相邻时
 69             int temp=0;  
 70             for(int i=(x1>x2?x2:x1)+1;i<(x1>x2?x1:x2);i++) {
 71                 if(chess[i][y1]==1) {
 72                     temp++;
 73                 }else {
 74                     break;
 75                 }
 76             }
 77             if(temp==(x1>x2?x1:x2)-(x1>x2?x2:x1)-1) {
 78                 return true;
 79             
 80             }
 81         }
 82         
 83         if((x1==x2)) {//当在同一行且不相邻时
 84             int temp=0;
 85             for(int i=(y1>y2?y2:y1)+1;i<(y1>y2?y1:y2);i++) {
 86                 if(chess[x1][i]==1) {
 87                     temp++;
 88                 }else {
 89                     break;
 90                 }
 91             }
 92             if(temp==(y1>y2?y1:y2)-(y1>y2?y2:y1)-1) {
 93                 return true;
 94             }
 95         }
 96         return false;
 97     }
 98     
 99    // static int point1_x;
100    // static int point1_y;//一个拐点时的拐点坐标
101     static boolean road1(int x1,int y1,int x2,int y2) {
102         //一个拐点
103         //一个拐点时为矩形的两个对角
104         if(chess[x1][y2]==1) {       
105         if(road0(x1,y2,x1,y1)&&road0(x1,y2,x2,y2)) {
106             return true;
107         }}
108         if(chess[x2][y1]==1) {
109         if(road0(x2,y1,x1,y1)&&road0(x2,y1,x2,y2)) {//(x2,y1)为拐点
110             return true;
111         }}
112         return false;
113     }
114     
115    // static int point2_x1;
116    // static int point2_y1;
117    // static int point2_x2;
118    // static int point2_y2;
119     static boolean road2(int x1,int y1,int x2,int y2) {//两个拐点时
120         //当在同一行且同一列且在外侧时
121         if((x1==x2)&&(x1==1||x1==8)){
122             return true;
123         }
124         if((y1==y2)&&(y1==1||y1==12)) {//同一列且在外侧
125             return true;
126         }
127         //不同行同列
128         for(int i=0;i<14;i++) {
129             if(chess[x1][i]==1) {
130             if(road0(x1,i,x1,y1)&&road1(x1,i,x2,y2)) {
131                 return true;
132             }}
133         }
134         for(int i=0;i<10;i++) {
135             if(chess[i][y1]==1) {
136             if(road0(i,y1,x1,y1)&&road1(i,y1,x2,y2)) {
137                 return true;
138             }}
139         }
140 
141         return false;
142     }
143     
144     static boolean road(int x1,int y1,int x2,int y2) {//判断路径是否正确,正确的话传给flag执行        
145         //有一个成立则返回true
146         return (road0(x1,y1,x2,y2)||road2(x1,y1,x2,y2)||road2(x1,y1,x2,y2));
147             
148     }
149 }
Function

(3)Time类:

技术图片
 1 public class Time {
 2     JFrame frame;
 3     public static JLabel jl0;
 4     ScheduledThreadPoolExecutor scheduled;//周期执行线程池
 5     
 6      Date String2Date(String dateStr) {
 7         SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
 8         try {
 9             Date date = simpleDateFormat.parse(dateStr);
10             return date;
11         } catch (ParseException e) {
12             jl0.setText("时间格式传入错误" + dateStr);
13             throw new IllegalArgumentException("时间格式传入错误" + dateStr);
14         }
15      }
16      
17     public void timer(String dateStr) {
18         //System.out.println(String2Date(dateStr));
19         Date end = String2Date(dateStr);
20         scheduled.scheduleAtFixedRate(new Runnable() {
21             @Override
22             public void run() {
23                 long time = (end.getTime() -1 - System.currentTimeMillis()) / 1000;
24                 if (time <= 0) {
25                     //System.out.println(dateStr);
26                     JOptionPane.showMessageDialog( null, "阿偶,超时啦。游戏结束!");
27                     System.exit(0);
28                     return;
29                 }
30                 long hour = time / 3600;
31                 long minute = (time - hour * 3600) / 60;
32                 long seconds = time - hour * 3600 - minute * 60;
33                 long djs=minute*60+seconds;
34                 StringBuilder stringBuilder = new StringBuilder();
35                 stringBuilder.append("   倒计时:").append(djs).append("秒").append("   ");
36                 jl0.setText(stringBuilder.toString());
37                 //System.out.println(time);
38             }
39 
40         }, 0, 1, TimeUnit.SECONDS);
41     }
42 
43     public Time() {
44         scheduled = new ScheduledThreadPoolExecutor(2);
45         init();
46     }
47 
48     void init() {
49         jl0 = new JLabel();
50         Font font = new Font("宋体", Font.PLAIN, 20);//创建1个字体实例
51         jl0.setFont(font);//设置JLabel的字体
52     }
53 
54 }
55 
56 /*
57 int n=JOptionPane.showConfirmDialog(null, "阿偶,时间到了。再来一局吧!", "游戏结束", JOptionPane.YES_NO_OPTION);
58 if(n==0) {//是
59      //Shown.frame2.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
60     //Shown.shown1=null;
61      //Shown.frame2.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//退出程序
62     //System.exit(0);
63     Shown.shown1=null;
64         Shown.frame2.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
65 
66         Shown shown=new Shown();
67     shown.frame1();
68 }
69 if(n==1) {//否
70      System.exit(0);
71      Shown.frame2.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//退出程序
72      Shown.frame2.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
73 }*/
Time

(4)NewMap类:

技术图片
  1 public class NewMap {
  2     
  3     static void newmap() {//newmap
  4         int exit=0;
  5         for(int i=0;i<10;i++) {//剩余数量
  6             for(int j=0;j<14;j++) {
  7                 if(Function.chess[i][j]==0) 
  8                     exit++;
  9             }
 10         }
 11         int[] ran=new int[96];//数组储存图片代码
 12         List list = new ArrayList();//乱序
 13         for(int m=0;m<exit/2;m++) {//在数组中成对出现
 14             Random r=new Random();
 15             int ra=r.nextInt(Shown.pic_num);
 16             ran[m]=ra;
 17             ran[m+exit/2]=ra;
 18         }
 19          for(int p = 0;p < exit;p++){           
 20              list.add(ran[p]);
 21              } 
 22          Collections.shuffle(list);//list打乱顺序
 23          for(int i = 0; i < list.size();i++) {//得到乱序ran[]
 24              ran[i]=(int) list.get(i);
 25            }
 26          int n=0;
 27          for(int i=0;i<10;i++) {//重新布局
 28                 for(int j=0;j<14;j++) {
 29                     if(Function.chess[i][j]==0) {//如果还有图片
 30                         Shown.img[i][j]=new ImageIcon(Shown.logo.get(ran[n]));
 31                         Shown.img[i][j].setImage(Shown.img[i][j].getImage().getScaledInstance(60, 56,Image.SCALE_DEFAULT));
 32                         Shown.imgbutton[i][j].setIcon(Shown.img[i][j]);
 33                         n++;
 34                     }
 35                 }
 36          }
 37     }
 38     
 39     static boolean test() {//检测有没有解,无解的话重新开始
 40         int temp=0;
 41         int num=0;
 42         for(int i=2;i<11;i++) {
 43             for(int j=2;j<9;j++) {
 44                 if(Function.chess[i][j]==0) {//不是空
 45                     for(int m=2;m<11;m++) {
 46                         for(int n=2;n<9;n++) {
 47                             if(Function.road(m,n,i,j)) {//检测是否有解
 48                                 break;
 49                             }
 50                         }
 51                     }
 52                 }else {
 53                 temp++;//无解
 54                 }
 55             }
 56         }
 57         for(int i=2;i<13;i++) {
 58             for(int j=2;j<9;j++) {
 59                 if(Function.chess[i][j]==0) {
 60                     num++;
 61                 }
 62             }
 63         }
 64         if(num==temp) {//全部无解
 65             NewMap.newmap();
 66             return false;
 67         }
 68         return true;
 69     }
 70     
 71     static void over() {//检测游戏是否结束
 72         int temp=0;
 73         for(int i=0;i<14;i++) {
 74             for(int j=0;j<10;j++) {
 75                 if(Function.chess[j][i]==1)
 76                     temp++;
 77             }
 78         }
 79         if(temp==140) {//所有button都没有图片的时候
 80             JOptionPane.showMessageDialog( null, "Wow,不愧是你!恭喜胜利通关,休息一下眼睛吧!"); 
 81             Shown.frame2.setVisible(false);
 82         }
 83     }
 84     
 85     static void help() {//help
 86         tag:for(int i=1;i<9;i++) {
 87         for(int j=1;j<13;j++) {
 88                 if(Function.chess[i][j]==0) {//如果还没有被消掉
 89                     for(int m=1;m<9;m++) {
 90                     for(int n=1;n<13;n++) {
 91                         if(Function.chess[m][n]==0&&Function.road(i,j,m,n)&&(i!=m||j!=n)&&Shown.img[i][j].getDescription()==Shown.img[m][n].getDescription()) {
 92                             Shown.imgbutton[i][j].setBackground(Color.green);
 93                             Shown.imgbutton[m][n].setBackground(Color.green);
 94                             break tag;//找到解后直接跳出所有循环
 95                         }
 96                     }
 97                     
 98                 }
 99             }
100         }
101     }
102  }
103 }
NewMap

 

以上是关于软件设计之基于Java的连连看小游戏——所有功能的实现的主要内容,如果未能解决你的问题,请参考以下文章

基于java的连连看游戏设计

基于安卓手机连连看游戏设计

Android Studio实现连连看小游戏,比比看谁过关最快~

Android Studio实现连连看小游戏,比比看谁过关最快~

基于JAVA平台游戏之小坦克

Qt连连看非核心功能实现