300行代码实现2048(java)
声明:1.本文章为原创文章,转载注明出处,蟹蟹~
2.初学java,水平有限,还有很多不足和应当修正的地方,欢迎评论指点
本人在开始写之前在网上看过很多版本的2048,但令我印象深刻的不多,很多都动不动600多行,有的甚至上千,当然啦,有的写得还是非常详细的,功能也比我的多,比如计分,还有历史最高分等等...本文暂时没有写那些,只是仅仅实现了这个游戏,失败或获胜之后可以选择再玩一次和关闭。
不修改代码的情况下(自己写的游戏想赢太简单),我没有赢过,所以就晒张失败截图???
先来张图看看大致结构:
2048李飘1
我借鉴了网上的一篇文章(https://blog.csdn.net/m_szqyx/article/details/75495318),但不是简单的ctrlc+ctrlV,数据处理(核心)和按键监听完全不一样,UI方面借鉴了他的大体框架,但他完全用图片来显示,我为了简单一点就直接把整型放在标签上了....自认为原创率百分之70以上吧。
数据处理方面,我发现其实这四个操作相同点其实很多,但几乎所有的文章都是代码重复率比较高的上下左右四个数据处理函数,那么在数据处理方面写这四个方法是不是有捷径可寻呢??当然有啦
上图:
操作转化这图是否只观?思路大致为:将上下左右四个数据处理通过transpose 和reverse 两个方法转化为向左移动,让后left也可以分解为coverup和merge两个方法。
具体这四个新加的方法的效果如下:
转换函数说明 转换函数说明2这里就不具体给出这四个函数了,接下来看看怎么用这四个函数简化上和左的操作,至于下和右是同理,是差不多的。
public static void up() {
transpose();
coverup();
merge();
coverup();
transpose();
}
public static void left() {
coverup();
merge();
coverup();
}
UI界面方面:
//构造函数 public Frame() {
//初始化窗体大小位置等 initBasic();
//初始化空块 initEmptyBlocks();
//初始化两个初始值 到block_Data数组中,并设置block_Label中对应块的图像 initData();
//键盘监听,获取方向键执行操作
this.addKeyListener(new KeyAdapter(){ public void keyPressed(KeyEvent event) {} });
//可视化 setVisible(true);
}
除了将上下左右进行转换之外的细节:
1.JFrame中纵横坐标是和数组是相反的。
mytips:在最开始的加入标签的时候就将其进行转换
2.在无法朝某个方向移动时不生成新的数。
mytips:移动前将数据传到一个数组与移动后的数组对比来判断有无变化
3.标签jlabel无法接受整型,
mytips:用 标签名.setText(整型变量+""); 进行转换
4.数组中的0不显示在frame窗口上
mytips:0元素单独用:标签名.setText(" ");表示
5.每进行一次操作都都要使整型数组中的数据与标签数组对应
mytips:写一个updata,把整型数组传给标签数组
6.游戏结束时如何play again
mytips:失败时的效果如文章的第一张图片,游戏成功同理,只是那一句话不同,具体实现如下:
失败时:
int result = JOptionPane.showConfirmDialog(null, "竟然输了,再来一局?", "游戏结果", JOptionPane.YES_NO_OPTION);
if(result == 0) {
Frame.reSetBlocks(); Frame.initData();
}
else {System.exit(0);}
最后,打开链接获取源代码
http://note.youdao.com/noteshare?id=de211010710217c2ede102236b775bf5&sub=83D0B1E308E04F6583873DCEAC9E0FE8