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

news2024/11/15 15:54:44

一、游戏回顾

        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博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1435976.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java实现用户画像活动推荐系统 JAVA+Vue+SpringBoot+MySQL

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 兴趣标签模块2.3 活动档案模块2.4 活动报名模块2.5 活动留言模块 三、系统设计3.1 用例设计3.2 业务流程设计3.3 数据流程设计3.4 E-R图设计 四、系统展示五、核心代码5.1 查询兴趣标签5.2 查询活动推荐…

升级GPT4保姆级教程

前言: 2024-01-26开通了GPT4之后至今已经使用了两周,体验下来是真的强,各种GPTs使用起来也很丝滑,不需要自己额外调试。之前看版本计划,2024年会发布GPT5,如果你还没有用上GPT4的话快快来升级体验一下吧&a…

C语言之自定义类型:联合和枚举

目录 1. 联合体类型的声明2. 联合体的特点3. 联合体大小的计算联合的一个练习 4. 枚举类型的声明5. 枚举类型的优点6. 枚举类型的使用 1. 联合体类型的声明 像结构体一样,联合体也是由一个或者多个成员构成,这些成员可以不同的类型 但是编译器只为最大…

机器学习系列4-特征工程

机器学习系列4-特征工程 学习内容来自:谷歌ai学习 https://developers.google.cn/machine-learning/crash-course/framing/check-your-understanding?hlzh-cn 本文作为学习记录自己归纳整理的思维导图 这里写目录标题 机器学习系列4-特征工程一级目录二级目录三…

Mac利用brew安装mysql并设置初始密码

前言 之前一直是在windows上开发后段程序,所以只在windows上装mysql。(我记得linux只需要适应yum之类的命令即可) 另外, linux的移步 linux安装mysql (详细步骤,初次初始化,sql小例子,可视化操作客户端推荐) 好家伙,我佛了,写完当天网上发…

集群clickhouse使用和clickhouse索引的使用

ClickHouse支持多种索引类型,包括普通索引、范围索引、哈希索引、倒排索引等。使用索引可以加快查询速度和提高查询效率。下面是ClickHouse索引的一些使用方法: 1 普通索引 可以使用普通索引来加速查询特定的列,例如: CREATE TA…

MES生产制造管理:汽车零部件生产MES解决方案

某某汽车部件科技有限公司是一家铝合金零部件研发、压铸和精加工为一体的高新技术企业,拥有先进压铸、机加、检测等设备,并配套自动化生产线。为解决发动机支架等产品的全程生产质量追溯和实现机台设备联网,梅施科技提供了车间级的MES解决方案,如图所示: 梅施科技采…

Axios设置token到请求头的三种方式

1、为什么要携带token? 用户登录时,后端会返回一个token,并且保存到浏览器的localstorage中,可以根据localstorage中的token判断用户是否登录,登录后才有权限访问相关的页面,所以当发送请求时,都要携带to…

每日一题——LeetCode1408.数组中的字符串匹配

方法一 暴力枚举&#xff1a; 对每个单词循环判断是否是其他单词的子字符串 var stringMatching function(words) {const ret [];for (let i 0; i < words.length; i) {for (let j 0; j < words.length; j) {if (i ! j && words[j].search(words[i]) ! -1)…

探索Gin框架:Golang Gin框架请求参数的获取

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站https://www.captainbed.cn/kitie。 前言 我们在专栏的前面几篇文章内讲解了Gin框架的路由配置&#xff0c;服务启动等内容。 专栏地址&…

TS项目实战二:网页计算器

使用ts实现网页计算器工具&#xff0c;实现计算器相关功能&#xff0c;使用tsify进行项目编译&#xff0c;引入Browserify实现web界面中直接使用模块加载服务。   源码下载&#xff1a;点击下载 讲解视频 TS实战项目四&#xff1a;计算器项目创建 TS实战项目五&#xff1a;B…

Unity3D判断屏幕中某个坐标点的位置是否在指定UI区域内

系列文章目录 unity工具 文章目录 系列文章目录前言一、使用rect.Contains()判断1-1、转换坐标1-2、代码如下&#xff1a;1-3、注意事项1-3、测试效果如下 二、使用坐标计算在不在区域内2-1、方法如下&#xff1a;2-2、注意事项 三、使用RectTransformUtility.ScreenPointToLo…

[每日一题] 02.06 - ABC

ABC lis list(map(int,input().split())) ABC list(input()) lis.sort() dic {A:lis[0],B:lis[1],C:lis[2]} res print(dic) for i in ABC:print(dic[i],end )我感觉没问题&#xff0c;但提交就是出问题了&#xff0c;应该不是最后多了个空格&#xff08;试过去除还是错…

股票投资指南!石家庄开通股票账户佣金最低是多少?怎么开低佣金账户?

股票投资指南可以帮助您更好地了解股票投资的基本知识和技巧&#xff0c;以便您可以做出明智的投资决策。以下是一些股票投资的基本指南&#xff1a; 了解股票市场&#xff1a;学习股票市场的基本概念和运作方式&#xff0c;包括股票交易所、股票指数和股票价格等。 定义投资目…

技术是你的安身立命之本

技术是你的安身立命之本 技术是你的安身立命之本,这句话是我父亲说的,我也一直把这句话奉为圭臬。这句话让我受用至今。 我父亲是一个两面派人士,一面是农民,一直在耕种着五亩薄田,没有像别的人家一样把田租赁出去,另一面是银行职员,勤勤恳恳在小县城的网点干了一辈子…

【AI】告别繁琐阅读,阿里通义智文阅读助手带您轻松畅游知识海洋!

哈喽&#xff0c;大家好&#xff0c;我是木头左&#xff0c;致力于程序服务生活&#xff01; 一、阿里通义智文阅读助手简介 阿里通义智文阅读助手是一款基于人工智能技术的阅读辅助工具&#xff0c;可以帮助用户更高效地阅读和理解各种类型的文档&#xff0c;如PPT、图片和PD…

【多模态MLLMs+图像编辑】MGIE:苹果开源基于指令和大语言模型的图片编辑神器(24.02.03开源)

项目主页&#xff1a;https://mllm-ie.github.io/ 论文 :基于指令和多模态大语言模型图片编辑 2309.Guiding Instruction-based Image Editing via Multimodal Large Language Models &#xff08;加州大学圣巴拉分校苹果&#xff09; 代码&#xff1a;https://github.com/appl…

LeetCode-第2769题-找出最大的可达成数字

1.题目描述 给你两个整数 num 和 t 。 如果整数 x 可以在执行下述操作不超过 t 次的情况下变为与 num 相等&#xff0c;则称其为 可达成数字 &#xff1a; 每次操作将 x 的值增加或减少 1 &#xff0c;同时可以选择将 num 的值增加或减少 1 。 2.样例描述 3.思路描述 当 x…

第五讲 二维费用的背包问题

【题目来源】AcWing 8. 二维费用的背包问题 【题意分析】 本题在前面背包问题的基础上&#xff0c;增加了一个维度——质量&#xff0c;背包拥有了容积、承重两个限制&#xff0c;物品也有了体积、质量两种属性。 【参考资料】第一讲 0/1背包问题 与0/1背包类似&#xff0c;加…

PDF文件格式(一):交叉引用流

在PDF-1.5版本之前&#xff0c;对象的交叉引用信息是存储在交叉引用表(cross-reference table)中的。在PDF-1.5版本之后&#xff0c;引进了交叉引用流(cross-reference stream)对象&#xff0c;可以用它来存储对象的交叉引用信息&#xff0c;就像交叉引用表的功能一样。 采用交…