数组与2048小游戏

在上一篇博客中我主要写了数组一些最基本最简单的知识,现在又过了几天,对数组又有了一些新的想法。

数组这个东西,虽然定义的方法就那么几种,虽然属性就一个,但可谓“短小精悍”。各类排序问题中,数组的效率很高,这几天算是“小有成就”了,因为做出来了一个可以玩的游戏——2048。用到了数组,也发现了数组真的是给我们提供了很大的方便。

现在我就来记录一下自己做出2048的艰辛过程,以及对数组和写程序的一些感悟。
做2048的第一步,就是画图和界面。这里面要注意一点,在重写窗体的paint方法的时候要调用一下父类的paint方法。
第二步,添加事件和动作监听器,一点开始就要随机产生两张图片——2或者4,这两张图片要随机放在我们画好的4X4的格子里。一点重新开始要清除原有的记录,再重新产生两张图片。这要定义一个存储图片的数组,依次按下标值放好。这样随机产生图片的时候就可以用随机数组下标来实现。
第三步,要移动方块。这个问题当时是让我头疼的,因为我的算法真的很差。终于体会到同行的小伙伴说过的一句话,大体意思是,我说java谁都可以学,那我们读这么好的学校就没有什么优越性了,然后她说,还是有区别的,没有学过的和学过的相比,学过的会赢在算法和数据结构上。好吧。。。我真是完全当了一个反例了,有学过数据结构,没有学过算法,但是呢,当时没好好学,学的仅有的一点点也早就不记得了。好吧,零基础菜鸟只能一点一点慢慢来了。(好像跑题了- -!)移动方块的算法想不到确实觉得难,想到了其实不用多少代码。算法的大体意思就是,当我按向上键的时候,跟列是没关系的,只有行是在不断减小,我现在先遍历所有的空格,找到不为空的那个位置,再找这一列位于这个位置上方的位置,看是否为空,为空就将图片赋值给空的,再不停往上找,往上赋值,一直到找到格子的边界。其他方向也是类似。数组存储了所有的位置,给数组没有图片时附上初值为-1,图片为2时为0,4为1等等以此类推。这样就可以用数组来定位行和列,和图片的属性。好方便有木有。

代码在此:
if(e.getKeyCode()==KeyEvent.VK_UP){
//外层循环,j表示列,上下移动的时候列没有关系,只与行有关
for(int j= 0;j<=3;j++){
for(int i=0;i<=3;i++){
if(array[i][j] != -1){
for(int x=0;x<i;x++){
if(array[x][j]==-1){
array[x][j]=array[i][j];
array[i][j]=-1;

break;
}
}
}
}

}


第四步,要将相同的方块相加,同时还要产生另一个随机的2或者4。我当时因为忘记一点,所以刚开始写了遍历每一行每一列,只要比如说按上键,那就比较同一列上相等的,然后把横坐标值大的数组值等于-1,小的加1。这样马上就有问题了,只要同一列上有相同的就那么做,也不管中间是不是有数挡着,然后我就开始纠结,要看两个相邻的情况,还有隔一个空,隔两个空,中间隔其他数是不能动。最后睡了一觉起来发现自己真是太傻了,我已经移动了,要能加一定是相邻的,真是想好多。这个问题就轻松解决了。我这个活生生血淋淋的教训告诉大家,当你想不通一个事情的时候要学会转移注意力,有时候太专注了就是在钻牛角尖了。然后又在空白的地方随机产生了一个图片放在随机空白处。这个就不多说。

离成功已经很接近了,最后一步,调试。调试的时候产生了问题,第一个,如果同一行里有三张图片,前两张是一样的 ,例如2和2,第三张是4,我按右键之后,原本应该是前两张相加变成4,第三张往前移一位。可是呢,前两张能加,第三张却不往前移,后来我发现了,是因为我之前在相加之后将后面一个位置的数组设成了-1,即没有图片。好了,解决办法就是,再将前面ctrl+c一遍,在相加之后ctrl+v。至少实现了功能,虽然很麻烦,也好low,--!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值