【经典例子】Java实现2048小游戏(附带源码)

一、游戏回顾

        2048游戏是一款数字益智游戏,目标是通过合并相同数字的方块来达到2048这个目标。游戏在一个4x4的方格上进行,每个方格上都有一个数字(初始时为2或4)。玩家可以通过滑动方向键(上、下、左、右)来移动所有的方块,当两个相同数字的方块在移动过程中碰到一起时,它们会合并成一个数字的方块,数字为它们的和。每次滑动后,系统会在空白的方格上随机生成一个新的数字方块。游戏的目标是通过不断合并方块,最终得到一个数字为2048的方块。

游戏的规则相当简单,但是要想达到2048并不容易。玩家需要仔细计划每一次移动,以避免方块填满整个方格而无法继续合并。游戏通常要求一定的逻辑思维和策略,以及对数字的运算能力。

除了原始的2048游戏,后续还出现了许多变种和改进版本,添加了新的元素和玩法,增加了游戏的难度和挑战性。

【预期效果】

二、实现分析

1、方块移动

按下按钮,计算边界,移动方块,重新绘画方块。

同时注意,遇到需要合并的,例如,同样的数字2和2模块碰到一起,需要合并。

    public void keyPressed(int newDirection) {
        this.direction = newDirection;
        switch (direction) {
            case DIRECTION_UP:
                directionX = 0;
                directionY = -1;
                break;
            case DIRECTION_DOWN:
                directionX = 0;
                directionY = 1;
                break;
            case DIRECTION_LEFT:
                directionX = -1;
                directionY = 0;
                break;
            case DIRECTION_RIGHT:
                directionX = 1;
                directionY = 0;
                break;
        }
        updateOrder();
    }

【合并方法】 

   @Override
    public void draw(Graphics g) throws CloneNotSupportedException {
        updateOrder();
        updateState();
        switch (state) {
            case STATE_UNKOWN:
            case STATE_MERGE:
                break;
            case STATE_MOVING:
            case STATE_FREE:
                move();// 移动
                break;
        }
        // 画内容
        drawContent(g);
    }

 2、状态更新

扫描变化后的矩阵,判断是否需要更新。

    /**
     * 获得状态
     *
     * @return
     */
    public int updateState() {
        if (moveCount != 0) {
            state = STATE_MOVING;
        } else if (moveCount == 0) {
            state = STATE_UNKOWN;
        }
        if (direction != DIRECTION_NONE && getNextBlock() == null) {
            state = STATE_FREE;
        }
        Block b = (Block) getNextBlock();
        //合并态判断
        if (direction != DIRECTION_NONE && b != null && b.level == level && (b.state != STATE_FREE)) {
            this.live = false;
            b.level++;
            b.state = STATE_MERGE;
            setThisBlock(null);
            BlockLoader.score += b.level * 10;
            if (BlockLoader.score >= BlockLoader.bestScore) {
                BlockLoader.bestScore = BlockLoader.score;
            }
            if (b.getNextBlock() != null && b.getNextBlock().live && b.getNextBlock().state == STATE_FREE) {
            } else {
                b.direction = DIRECTION_NONE;
                b.directionX = 0;
                b.directionY = 0;
            }
        }
        return state;
    }

三、源码获取

【经典例子】Java实现2048小游戏(附带源码)-CSDN博客

你可能感兴趣的:(JAVA基础,java,后端)