在上一篇博客中我主要写了数组一些最基本最简单的知识,现在又过了几天,对数组又有了一些新的想法。
数组这个东西,虽然定义的方法就那么几种,虽然属性就一个,但可谓“短小精悍”。各类排序问题中,数组的效率很高,这几天算是“小有成就”了,因为做出来了一个可以玩的游戏——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,--!
分享到:
相关推荐
用java的二维数组实现五子棋小游戏,适合初学者学习二维数组
通过c++数组实现的趣味小游戏,完美增加学习兴趣
JAVA 用二维数组编写的一个扫雷游戏,绝对可以用!界面简洁美观!
unity制作的一个纯数组,文字rpg小游戏
基于二维数组的简易贪吃蛇游戏c++源码(课程作业).zip基于二维数组的简易贪吃蛇游戏c++源码(课程作业).zip基于二维数组的简易贪吃蛇游戏c++源码(课程作业).zip基于二维数组的简易贪吃蛇游戏c++源码(课程作业).zip基于...
在开发版上,用C语言写了一个现在比较火的小游戏2048,首先我设定我的游戏是4*4的,然后可以记录历史最高分,程序开始运行时,先初始化4*4的游戏棋盘,然后随机在棋盘上的空白位置放置2或者4,然后调用屏幕触碰事件...
课程作业基于二维数组的简易贪吃蛇游戏c++源码(带exe可执行程序).zip课程作业基于二维数组的简易贪吃蛇游戏c++源码(带exe可执行程序).zip课程作业基于二维数组的简易贪吃蛇游戏c++源码(带exe可执行程序).zip课程作业...
c# 数组与集合(ArrayList)游戏开发高级使用举例 一、数组 定义:数组是相同数据类型的元素按一定顺序排列的集合。 优点:数组在存储数据的时候是连续存储的,因此可以快速而容易地从头到尾遍历元素,可以快速的...
主要为大家详细介绍了C语言结构数组实现贪吃蛇小游戏,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
GO语言开发2048小游戏
文件主要包括:2048.c、Save2048.bin。主要实现功能有:随机生成数、关卡选择、分数、游戏结束、回退十步、存取档序列化和反序列化等。数据结构采用C语言结构体、动态数组、环形数组等思想进行设计。文件存储及读取...
将一个数组随机打乱后显示,这里是一个存储25位数从1到25的一维数组,随机打乱后显示每行显示5个,依次找到1-25的时间说明专注力强弱。
# Matlab数组矩阵在实际中的运用,对开发小游戏的作用 Matlab是一种高级的数值计算语言和交互式环境,它的数组和矩阵功能非常强大,可以进行各种数据处理和分析。在游戏开发中,Matlab的数组和矩阵功能也可以发挥...
利用c语言实现的2048小游戏。可以用来当做结课项目,毕业设计,就是比较简单,代码注释写的很详细,保证各位可以看懂。 程序的主要使用的相关数据类型:2维数组,枚举,指针
利用VC++6.0实现了迷宫问题,构成迷宫图形的数组由主函数中的二维数组决定,其他的操作可以按照界面提示进行
改程序时关于数组游戏的,就是输入的几个整数后,这些整数会连成一个最大的整数
在已知雷的位置以及不时雷得位置,判断二维数组中各个位置的雷得情况
使用数组维护俄罗斯方块,j2me小游戏. 还有一些不完美的地方.自己使用时候可能会发现
java游戏开发 小游戏 经典游戏 游戏源码 课程设计 java游戏开发 小游戏 经典游戏 游戏源码 课程设计 java游戏开发 小游戏 经典游戏 游戏源码 课程设计 java游戏开发 小游戏 经典游戏 游戏源码 课程设计 java游戏开发...