一.环境
java swing库
二.项目结构
三.运行效果
四.各类作用
1.Cube类(71行代码)
实体类 Cube(即2048中的每个小方块) 含3个属性 num(小方块的数字), btn(该小方块对应的控件),isAdded(在进行一次移动操作过程中,该方块是否是相加而成,即代表后面的元素,在一次操作中不能再进行合并)
2.MyMouseListener类(57行代码)
鼠标监听器
监听菜单栏点击操作(新游戏,关于,退出)
3.MyKeyListener类(81行)
键盘监听器
监听键盘操作WASD,或者上下左右,对应Game2048类内的各种操作方法(例game.up()...)
4.Game2048类(主类 508行代码)
包含初始化界面功能。初始化初始两个方块功能。在进行有效移动后,新增加方块功能。定义上下左右的移动方法。添加方块颜色功能。清除方块的isAdded信息功能(在一次键盘操作执行后,需要清除isAdded信息)。根据游戏是否在继续,执行退出时,是否出现选择框来退出 功能。计算分数功能。游戏等级升级功能。
五.Game2048类上下左右移动逻辑思路
以向上操作为例
根据输入键盘的值,确定调用该类的哪个函数(up,down,left,right)
/**
* 向上移动
*/
public boolean up() {
boolean isAllMoved = false;
for (int x = 1; x < row; x++) {
for (int i = 0; i < column; i++) {
if (move(Game2048.MOVE_UP, x, i))
isAllMoved = true;
}
}
return isAllMoved;
}
从第二行的元素开始,分别调用move()函数。isAllMoved是判断是否在执行上下左右移动过程中,有元素进行移动(受move函数中的isMoved变量影响),如果没有则不新生成新方块。
move()函数的部分功能(关于up的,其他操作类似)为:
/**
* 移动
*
* @param move_way
* 移动方向
* @param x
* 横坐标
* @param y
* 纵坐标
*/
private boolean move(int move_way, int x, int y) {
boolean isMoved = false;
switch (move_way) {
...
case Game2048.MOVE_UP: {
for (; x > 0; x--) {
if (swap(getView(x - 1, y), getView(x, y)))
isMoved = true;
}
}
break;
}
return isMoved;
}
如果操作是向上操作,则从该元素开始,向上依次进行上下相邻两元素调用swap函数()的操作(可概括为相邻Cube方块之间的合并或交换操作)。isMoved指的是(该元素是否有移动受swap()函数中的isSwaped影响)
swap()函数:
private boolean swap(Cube next, Cube now) {
boolean isSwaped = false;
if (now.getNum() != 0 && next.getNum() == 0) {
next.setText(now.getNum());
now.setText(0);
next.setIsAdded(now.isAdded());
now.setIsAdded(false);
isSwaped = true;
} else if (!now.isAdded() && !next.isAdded() && next.getNum() == now.getNum() && now.getNum() != 0) {
next.setText(now.getNum() * 2);
now.setText(0);
next.setIsAdded(true);
now.setIsAdded(false);
isSwaped = true;
}
return isSwaped;
}
Cube next指的是要移向的位置,now指的是现在方块所在的位置。有三种情况:
1.现在的位置是有数字的,移向的位置是没有数字的,则直接移过去。移动后Cube next的isAdded属性(是否是相加而成的),根据Cube now的属性,原来是相加而成的移动后,现在也是如此。原本的Cube 变为空的(num为0,isAdded属性为false)
2.如果现在的位置的元素和移向位置的元素的值相等且这两个方块都不是相加得来的,即可以进行合并操作,则合并并且设置原本的方块Cube 为空
3.均不属于上述两种情况 比如 1.next now 其中一方,是由相加而成的。 2.两个方块内的数值不一样,不能合并。
isSwaped属性表示是否进行了交换(1.2)两种情况都进行了交换。
六.源码
有需要源码的同学,请留言