问题描述:
2048游戏是一个4*4的矩阵,用户可以按上下左右4个方向键让所有的方块向同一个方向运动,两个相同数字撞在一起之后合并成为他们的和。
合并规则
:相邻会碰撞的两个数字合并且一个位置只会触发一次合并,且优先合并移动方向顶部的位置
比如
- 【2 2 2 2】行向右合并后为【0 0 4 4】
- 【0 2 2 2】行向右合并后为【0 0 2 4】
输入格式:
输入第一行是用户按下的方向键,w
代表上,s
代表下,a
代表左,d
代表右
接下来是一个4*4的矩阵,空格分割,0代表该位置没有数字
输出格式:
输出用户按下该方向键后的矩阵数值,忽略随机产生数字。
思路:
使用List
把每行或每列的非0数存储起来,然后把相同的项进行合并,合并后再填充回对应的行或列,然后把该行其他元素填充为0。
完整代码:
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class Main{
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int[][] x = new int[4][4];
for(int j = 0; j < 4; j++) {
for(int i = 0; i < 4; i++) {
x[i][j] = sc.nextInt();
}
}
String a = sc.next();
find(x , a);
for(int j = 0; j < 4; j++) {
for (int i = 0; i < 4; i++) {
System.out.print(x[i][j] + " ");
}
System.out.println();
}
}
public static void find(int[][] x, String a) {
switch (a) {
case "w":
for (int i = 0;i < x.length;i++) {
List<Integer> list = new ArrayList<>();
for (int j = 0;j < x[i].length;j++) {
if (x[i][j] != 0)
list.add(x[i][j]);
}
for (int j = 0;j < list.size()-1; j++) {
if (list.get(j) == list.get(j + 1)) {
int num = list.get(j) * 2;
list.remove(j);
list.remove(j);
list.add(j , num);
}
}
for (int j = 0;j < list.size();j++) {
x[i][j] = list.get(j);
}
for (int j = list.size();j < x[i].length;j++) {
x[i][j] = 0;
}
}
break;
case "s":
for (int i = 0;i < x.length;i++) {
List<Integer> list = new ArrayList<>();
for (int j = 0;j < x[i].length;j++) {
if (x[i][j] != 0)
list.add(x[i][j]);
}
for (int j = list.size()-1;j > 0; j--) {
if (list.get(j) == list.get(j - 1)) {
int num = list.get(j) * 2;
list.remove(j - 1);
list.remove(j - 1);
if (j == list.size())
list.add(num);
else
list.add(j-1 , num);
}
}
int j = x[i].length - 1;
for (int k = list.size() - 1;k >= 0; k--) {
x[i][j] = list.get(k);
j--;
}
while (j >= 0) {
x[i][j] = 0;
j--;
}
}
break;
case "a":
for (int j = 0;j < x[0].length; j++) {
List<Integer> list = new ArrayList<>();
for (int i = 0; i < x.length; i++) {
if (x[i][j] != 0)
list.add(x[i][j]);
}
for (int i = 0;i < list.size()-1;i++) {
if (list.get(i) == list.get(i + 1)) {
int num = list.get(i) * 2;
list.remove(i);
list.remove(i);
list.add(i , num);
}
}
for (int i = 0;i < list.size();i++) {
x[i][j] = list.get(i);
}
for (int i = list.size();i < x.length;i++) {
x[i][j] = 0;
}
}
break;
case "d":
for (int j = 0;j < x[0].length; j++) {
List<Integer> list = new ArrayList<>();
for (int i = 0;i < x.length; i++) {
if (x[i][j] != 0)
list.add(x[i][j]);
}
for (int i = list.size() - 1; i > 0; i--) {
if (list.get(i) == list.get(i - 1)) {
int num = list.get(i) * 2;
list.remove(i - 1);
list.remove(i - 1);
if (i == list.size()) {
list.add(num);
}else {
list.add(i-1 , num);
}
}
}
int i = x.length - 1;
for (int k = list.size() - 1;k >= 0;k++) {
x[i][j] = list.get(k);
}
while (i >= 0) {
x[i][j] = 0;
}
}
break;
}
}
}