上一篇博文,我们实现了初步的左滑,那我们这一篇就把上下右滑的代码给写了,再加一个输赢的判断条件(其实原版2048也就只有输)。
2.右滑(紧接上一篇博文)
由于原理跟左滑一模一样我在这里就直接贴代码了。
private void moveToRight() {
//右滑
for (int i = 0; i < 4; i++) {
for (int j = 3; j >= 0; j--) {
int n = 0;//若0后面全为0则下面的while会死循环,设置n表示顶多一行只有4个0
while (tvNum[i][j] == 0 && n < 4) {
//若检测到哪一位为0则把这一位放到最右边那一列
n++;
for (int k = j; (k - 1) >= 0; k--) {
//简单的冒泡,把0浮上来
int temp = 0;
temp = tvNum[i][k];
tvNum[i][k] = tvNum[i][k - 1];
tvNum[i][k - 1] = temp;
}
}
}
}
for (int i = 0; i < 4; i++) {
//相同数相加
for (int j = 3; (j - 1) >= 0; j--) {
if (tvNum[i][j] == tvNum[i][j - 1] && tvNum[i][j] != 0) {
//两数相同且不为0
tvNum[i][j] *= 2;
tvNum[i][j - 1] = 0;
for (int k = j - 1; (k - 1) >= 0; k--) {
//把第二个数置0冒泡法移到最后
int temp = 0;
temp = tvNum[i][k];
tvNum[i][k] = tvNum[i][k - 1];
tvNum[i][k - 1] = temp;
}
}
}
}
boolean ifEmpty = false;
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 4; j++) {
if (tvNum[i][j] == 0) {
ifEmpty = true;
}
}
}
if (ifEmpty) {
int randomXY;
randomXY = (int) Math.round(Math.random() * 15);
while (tvNum[randomXY / 4][randomXY % 4] != 0) {
randomXY = (int) Math.round(Math.random() * 15);
}
tvNum[randomXY / 4][randomXY % 4] = ((int) Math.round(Math.random() + 1)) * 2;
}
for (int i = 0; i < 4; i++) {
//把更新之后的tvNum在游戏界面上显示出来
for (int j = 0; j < 4; j++) {
if (tvNum[i][j] == 0) {
//0则不显示数值
textViews[4 * i + j].setText("");
} else {
textViews[4 * i + j].setText(tvNum[i][j] + "");
}
}
}
}
3.上滑
上下滑动跟左右滑动有一些区别,主要在于矩阵的遍历方式。左右滑动矩阵是横向遍历,那么我们的上下滑动就应该是纵向遍历。而且由于2048游戏的特性,矩阵必定为方阵,所以不需要担心由于Java的二维数组可以不等长而引起的数组越界。下面就是上滑的代码:
private void moveToTop() {
//上滑
for (int j = 0; j < 4; j++) {
for (int i = 0; i < 4; i++) {