Java实现2048矩阵操作

问题描述:

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;
        }
    }

}

附加GitHub链接

发布了16 篇原创文章 · 获赞 22 · 访问量 3786

猜你喜欢

转载自blog.csdn.net/qq_36008321/article/details/104551116
今日推荐