JAVA实现连连看

博客介绍了图片消消乐的实现要点,关键在于上下左右预留格子,每次初始化和消去一对图片时要自动找可消去的图片,否则洗牌。详细阐述了寻找两个指定点之间路径的算法,包括基本顺序和更快速但实现麻烦的方法,最后表明用Java实现了第一种算法,代码可下载。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

界面很简单,关键在于上下左右预留一行(列)格子。

每次初始化和每消去一对的时候,都要自动找到一对可以消去的图片,否则就自动对局面进行洗牌。使用炸弹的时候消去的就是找到的这对。

寻找两个指定点之间的路径的算法比较复杂,基本的顺序是不转弯,转一次,转两次。前两个比较简单,最后一个要分上下左右四种情况分别找路径。简单说一下往下找的算法:

设起点坐标(sx,sy),终点坐标(ex,ey);

1。首先把原先存放的路径全部清空;
2。判断(sx,sy+1)是否为通路(无图片),如果有图片,此路不通,算法结束。
3。把(sx,sy+1)添加到路径;
4。如果(ex,sy+1)为通路且(sx,sy+1)到(ex,sy+1)为通路且(ex,sy+1)到(ex,ey)为通路
5。        路径找到,算法结束。
6。否则,sy++,返回第二步。

事实上有更快速的方法,但是实现起来麻烦。方法是先寻找四个点:
(sx,symax):从起点出发,能向下达到的最远点
(sx,symin):从起点出发,能向上达到的最远点
(ex,eymax):从终点出发,能向下达到的最远点
(ex,eymin):从终点出发,能向上达到的最远点
然后找出symin->symax和eymin->symax的公共部分,
如果公共部分存在,且存在y处于该公共部分,且(sx,y)到(ex,y)为通路,则路径找到。
否则,向上和向下都没有通路。

我用JAVA实现了第一种算法,界面如上图。

版权声明:所有的图片都是从网络上找到的,本人不拥有版权。本软件允许无限次拷贝、分发、传播,前提是保证本软件代码和全部文件的完整性和真实性,并且仅限于研究学习之用。因使用非本人直接分发的拷贝造成的一切损失,本人概不负责。

 

Note:源代码可以在我的资源下载中得到。请有需要的朋友自行下载。

http://download.youkuaiyun.com/user/Nicholas_Lin

java连连看代码 import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.ArrayList; import javax.swing.*; public class Game extends JFrame{ private int num[][]; //实现数组 private JButton gamebutton[][]; //游戏Button组 private Container cont; //内容面板 private JLabel timelabel; //时间标签 private JButton play; //开始游戏按钮 private JButton exit; //退出按钮 private JButton replay; //重新开始按钮 private JButton back; //返回主界面按钮 private JComboBox choice;//游戏等级 private JButton chongle; //游戏按钮重列 private JPanel gamepanel; //游戏按钮面板 private JPanel panel; //开始游戏面板 private int time=0; //时间记录 private Time T; //记时线程 private Thread t=new Thread(T); //记时线程 private int shu=1; //记录获取游戏按钮事件的个数 private int x=0,y=0,a=0,b=0;//按钮的坐标 private JButton button1=null,button2=null;//点击了的按钮 private boolean can;//能否消除 private int lvx,lvy; //游戏等级数组标列数 private int framex,framey; //框架大小 private int again=1;//记录重列次数 public Game(){ itincomponent(); } private void itincomponent(){ //置面板属性 if(cont!=null) cont.removeAll(); this.setSize(500, 500); this.setLocationRelativeTo(null); //获取内容面板 cont=this.getContentPane(); //开始和退出按钮 panel=new JPanel(); play=new JButton("开始游戏"); choice=new JComboBox(); choice.addItem("低级"); choice.addItem("中级"); choice.addItem("高级"); choice.setSelectedItem("低级"); exit=new JButton("退出游戏"); panel.add(choice); panel.add(play); panel.add(exit); cont.add(panel,"South"); exit.addActionListener(new Exit());//结束事件监听 play.addActionListener(new Play());//开始事件监听 this.setResizable(false); this.setVisible(true); this.setDefaultCloseOperation(EXIT_ON_CLOSE); } ////获得新的面板 private void p(){ //置面板属性 this.setSize(framex, framey); this.setLocationRelativeTo(null); //获取内容面板 cont=this.getContentPane(); //开始和退出按钮 panel=new JPanel(); exit=new JButton("退出游戏"); replay=new JButton("重新开始"); back=new JButton("返回主界面"); chongle=new JButton("重列"); panel.add(chongle); panel.add(replay); panel.add(exit); panel.add(back); cont.add(panel,"South"); exit.addActionListener(new Exit());//结束事件监听 replay.addActionListener(new Playbutton());//重新开始事件监听 back.addActionListener(new Back());//返回主界面事件监听 chongle.addActionListener(new Chongle());//重列事件监听 //时间面板 timelabel=new JLabel("游戏时间:"+time+"s",JLabel.CENTER); cont.add(timelabel,"North"); //生成游戏操作面板 gamepanel=new JPanel(); gamepanel.setLayout(new GridLayout(lvx,lvy,3,3)); //置为表格布局 for (int i = 0; i < lvx; i++) { for (int j = 0; j <lvy; j++) { if(gamebutton[i][j].isVisible()){ gamebutton[i][j].setIcon(new ImageIcon(num[i][j]+".jpg")); } gamepanel.add(gamebutton[i][j]); gamebutton[i][j].addActionListener(new Gamebutton()); } } cont.add(gamepanel, "Center"); this.setResizable(false); this.setVisible(true); this.setDefaultCloseOperation(EXIT_ON_CLOSE); }
评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值