返回

鸿蒙 2048 小游戏:在 HarmonyOS 中消磨时间

闲谈

无论您是在乘坐公共汽车还是在漫长的午餐时间,2048 是一款适合所有人的有趣且令人上瘾的游戏。现在,使用鸿蒙 JavaUI,您可以在 HarmonyOS 设备上享受这款经典益智游戏了。

在本文中,我们将逐步指导您在鸿蒙 JavaUI 中实现 2048 小游戏。我们将涵盖从自定义卡片视图到游戏逻辑和手势处理的所有内容。

自定义数字卡片视图

首先,我们需要创建一个自定义的数字卡片视图。此视图将处理卡片的文本、数字颜色和背景。

public class CardView extends View {

    private int number;
    private int numberColor;
    private int backgroundColor;

    public CardView(Context context) {
        super(context);
    }

    // 设置卡片数字
    public void setNumber(int number) {
        this.number = number;
    }

    // 设置卡片数字颜色
    public void setNumberColor(int numberColor) {
        this.numberColor = numberColor;
    }

    // 设置卡片背景色
    public void setBackgroundColor(int backgroundColor) {
        this.backgroundColor = backgroundColor;
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);

        // 绘制卡片背景
        Paint backgroundPaint = new Paint();
        backgroundPaint.setColor(backgroundColor);
        canvas.drawRect(0, 0, getWidth(), getHeight(), backgroundPaint);

        // 绘制卡片数字
        Paint numberPaint = new Paint();
        numberPaint.setColor(numberColor);
        numberPaint.setTextSize(getWidth() / 2);
        canvas.drawText(String.valueOf(number), getWidth() / 2, getHeight() / 2, numberPaint);
    }
}

自定义游戏视图

接下来,我们将创建一个自定义游戏视图。此视图将处理所有与游戏相关的逻辑,包括手势处理。

public class GameView extends View {

    private List<List<CardView>> cards;
    private int score;

    public GameView(Context context) {
        super(context);
    }

    // 初始化游戏
    public void initialize() {
        cards = new ArrayList<>();
        for (int i = 0; i < 4; i++) {
            List<CardView> row = new ArrayList<>();
            for (int j = 0; j < 4; j++) {
                CardView card = new CardView(getContext());
                row.add(card);
            }
            cards.add(row);
        }

        addRandomCard();
        addRandomCard();
    }

    // 添加一个随机卡片
    public void addRandomCard() {
        Random random = new Random();
        int x = random.nextInt(4);
        int y = random.nextInt(4);

        while (cards.get(x).get(y).getNumber() != 0) {
            x = random.nextInt(4);
            y = random.nextInt(4);
        }

        cards.get(x).get(y).setNumber(2);
    }

    // 手势处理
    @Override
    public boolean onTouchEvent(MotionEvent event) {
        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                break;
            case MotionEvent.ACTION_MOVE:
                break;
            case MotionEvent.ACTION_UP:
                float deltaX = event.getX() - event.getX(0);
                float deltaY = event.getY() - event.getY(0);

                if (Math.abs(deltaX) > Math.abs(deltaY)) {
                    if (deltaX > 0) {
                        moveRight();
                    } else {
                        moveLeft();
                    }
                } else {
                    if (deltaY > 0) {
                        moveDown();
                    } else {
                        moveUp();
                    }
                }
                break;
        }
        return super.onTouchEvent(event);
    }

    // 向右移动卡片
    private void moveRight() {
        for (int i = 0; i < 4; i++) {
            for (int j = 3; j >= 0; j--) {
                if (cards.get(i).get(j).getNumber() != 0) {
                    int nextPosition = j + 1;
                    while (nextPosition < 4 && cards.get(i).get(nextPosition).getNumber() == 0) {
                        nextPosition++;
                    }

                    if (nextPosition < 4) {
                        cards.get(i).get(nextPosition).setNumber(cards.get(i).get(j).getNumber());
                        cards.get(i).get(j).setNumber(0);
                    }
                }
            }
        }
    }

    // 向左移动卡片
    private void moveLeft() {
        for (int i = 0; i < 4; i++) {
            for (int j = 0; j < 4; j++) {
                if (cards.get(i).get(j).getNumber() != 0) {
                    int nextPosition = j - 1;
                    while (nextPosition >= 0 && cards.get(i).get(nextPosition).getNumber() == 0) {
                        nextPosition--;
                    }

                    if (nextPosition >= 0) {
                        cards.get(i).get(nextPosition).setNumber(cards.get(i).get(j).getNumber());
                        cards.get(i).get(j).setNumber(0);
                    }
                }
            }
        }
    }

    // 向下移动卡片
    private void moveDown() {
        for (int j = 0; j < 4; j++) {
            for (int i = 3; i >= 0; i--) {
                if (cards.get(i).get(j).getNumber() != 0) {
                    int nextPosition = i + 1;
                    while (nextPosition < 4 && cards.get(nextPosition).get(j).getNumber() == 0) {
                        nextPosition++;
                    }

                    if (nextPosition < 4) {
                        cards.get(nextPosition).get(j).setNumber(cards.get(i).get(j).getNumber());
                        cards.get(i).get(j).setNumber(0);
                    }
                }
            }
        }
    }

    // 向上移动卡片
    private void moveUp() {
        for (int j = 0; j < 4; j++) {
            for (int i = 0; i < 4; i++) {
                if (cards.get(i).get(j).getNumber() != 0) {
                    int nextPosition = i - 1;
                    while (nextPosition >= 0 && cards.get(nextPosition).get(j).getNumber() == 0) {
                        nextPosition--;
                    }

                    if (nextPosition >= 0) {
                        cards.get(nextPosition).get(j).setNumber(cards.get(i).get(j).getNumber());
                        cards.get(i).get(j).setNumber(0);
                    }
                }
            }
        }
    }

    // 检查游戏是否结束
    public boolean isGameOver() {
        for (int i = 0; i < 4; i++) {
            for (int j = 0; j < 4; j++) {
                if (cards.get(i).get(j).getNumber() == 0) {
                    return false;
                }

                if (j < 3 && cards.get(i).get(j).getNumber() == cards.get(i).get(j + 1).getNumber()) {
                    return false;
                }

                if (i < 3 && cards.get(i).get(j).getNumber() == cards.get(i + 1).get(j).getNumber()) {
                    return false;
                }
            }
        }

        return true;
    }
}

主页面

最后,我们需要在主页面引用自定义的游戏视图。

public class MainActivity extends Activity {

    private GameView gameView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity