Java日常 - 2048

用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();
		}
	}

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值