用Java实现2048游戏(带动态):
写完java聊天室的ui后,感觉自己很膨胀,偶然中又看到了2048这个游戏,然后心血来潮,我觉得我也可以!
然后花了一天半的时间完成了具有动态效果的 Java2048。要资源可私戳。
先看效果图 :(右边是正在移动的)
主体框架:
程序分为游戏功能实现和UI实现两个部分,游戏功能的实现很简单,不需要多叙述,重点谈一下UI的实现。
整个棋盘背景,是一个JPanel;它里面放置了n*n个block(就是那些可移动的方块);block类继承了JPanel,并且自带一个JLabel,用于显示方块表示的数字。虽然效果上block是可以移动的,但其实,他们本体是固定的,只不过每次移动完成之后,更新了一下每个block的属性,让其显示为对应位置的方块。
block的动态效果是通过添加新的可移动临时block来实现的。实现动态的最大的问题在于怎么做到动态的刷新棋盘,使得它的每一帧的效果可以体现出来(这个和Swing里ui的刷新机制有关,具体情况自行百度)。如果没有下面代码中的多线程,得到的结果是,只会显示对最后的一帧画面,中间的并不会动态的直接更新画面。
其实具体的实现方法还有其他更好的 ,但这一种相对更简单。
这里放一下实现动态的完整代码,moveMsg msg 是传入的待移动的方块的信息。
void flash(moveMsg msg) {
int Xp=p.getWidth();
int xp=(Xp-delta*(size+1))/size;
for(int i=0;i<msg.cnt;++i) {
int x,y,x0,y0;
block t0=blocks[msg.x[i]][msg.y[i]];
block t=new block(t0.level,size);
t.setBounds(t0.getBounds());
p.add(t,0);
x0=t.getX();y0=t.getY();
if(msg.dir[i]==0) {x=0;y=-1*msg.length[i]*xp;}
else if(msg.dir[i]==1) {x=0;y=msg.length[i]*xp;}
else if(msg.dir[i]==2) {y=0;x=-1*msg.length[i]*xp;}
else {y=0;x=msg.length[i]*xp;}
//这里开了一个多线程,是代码的核心。
new Thread(new Runnable(){
@Override
public void run() {
try {
for(int i = 0;i <=32; i++) {
if(i==32) {
state=0;
t.setVisible(false);
t0.setVisible(true);//这些代码还可以优化
dataShow();
}else if(i==0) {
state=1;
t0.refresh(0);
}else {
Thread.sleep(21-speed);
t.setLocation(x0+x*i/30,y0+y*i/30);
}
}
} catch (Exception e) {}
}
}).start();
}
}