Java实现拼图小游戏(6)—— 移动图片(键盘监听实操练习)

简介: 当我们实现向上移动图片的时候,其实就是把空图片的下面一张图片往上移动,然后将空图片的下面那张图片设置为空图片,最后再调整初始位置为现在空图片所在位置即可,注意做完这些以后还要再加载图片,否则显示不出来

一、前言


在美化完界面以后,我们就要给拼图小游戏注入灵魂了!那就是要实现移动图片的效果,这里我们使用键盘的上下左右键来实现移动图片的效果,也就是我们上一次说到的键盘监听效果,如果对于键盘监听效果还是不明白的小伙伴可以点击查看文章回顾一下【Java中的键盘监听机制(含实例)】


二、步骤


1.让我们的类继承KeyListener接口


public class GameJFrame extends JFrame implements KeyListener


2.改写initData方法


我们曾经提到过,对于存放图片我们要使用二维数组来存放,并且有一个非常简洁的写法,由于我们一共要添加15张图片,还有一张图片是空白的,也就是编号为0的图片,所以当我们遇到为0的图片时,要把其对应的二维数组的坐标提取出来,方便与其上下左右的图片进行交换,来达到移动图片的效果,遇到编号不为0的图片那就放入二维数组即可


这里给出判断的部分代码


  if(tempArr[i] == 0){
    x = i / 4;
      y = i % 4;
  }
  else{
    data[i/4][i%4] = tempArr[i];
   }


3.实现向上移动


这里我们要重新接口内的方法,但是由于游戏需要,我们只需要重写松开键盘时触发的代码块即可,剩下的就不需要重写了,可以空着

当我们实现向上移动图片的时候,其实就是把空图片的下面一张图片往上移动,然后将空图片的下面那张图片设置为空图片,最后再调整初始位置为现在空图片所在位置即可,注意做完这些以后还要再加载图片,否则显示不出来


2505553e47054350b2a2c0a002516944.png


像这张图片就是将右下角的空图片上移,并把右下角设置为空图片,最后将右下角的坐标设置为初始坐标


      //将下面的图片上移
            data[x][y] = data[x+1][y];
            //将下面的图片设为空白图片(编号为0)
            data[x+1][y] = 0;
            //将初始图片位置设置为空白图片位置
            x++;
            //加载图片
            initImage();


4.实现向下移动


同理,将上面的图片往下移


  //将上面的图片上移
  data[x][y] = data[x-1][y];
    //将上面的图片设为空白图片(编号为0)
    data[x-1][y] = 0;
    //将初始图片设置为空白图片对应位置
    x--;
    //加载图片
  initImage();


5.实现向左移动


  //将右面的图片左移
  data[x][y] = data[x][y+1];
  //将右面的图片设为空白图片(编号为0)
  data[x][y+1] = 0;
  //将初始图片设置为空白图片对应位置
  y++;
  //加载图片
  initImage();


6.实现向右移动


  //将左面的图片右移
    data[x][y] = data[x][y-1];
    //将左面的图片设为空白图片(编号为0)
    data[x][y-1] = 0;
    //将初始图片设置为空白图片对应位置
    y--;
    //加载图片
    initImage();


7.改写initImage方法


在上文中我们提到,先加载的图片会出现在上方,所以当我们移动图片并重写加载的时候,我们需要将原先的图片清除才可以展现出移动后的图片,否则会出现覆盖,无法看到正确效果,在加载完图片以后也要再刷新一次,以保证其效果能够正确展示


清除图片(写在方法体第一行)


this.getContentPane().removeAll();


刷新界面(写在方法体最后一行)


this.getContentPane().repaint();


8.为JFrame添加键盘监听


this.addKeyListener(this);


三、优化代码


当我们遇到边界的时候,无法执行操作,那么这时候就需要重新让用户去操作,这里的判断条件在于每个上下左右操作的最后一行代码,让变量不要超过数组定义的长度即可


例如:

方法体内最后语句是:x++,由于数组最大长度是3,所以当x等于3时无法执行该语句,就要返回,让用户重新操作


if(x == 3){
  return;
}


四、完整代码


    @Override
    public void keyReleased(KeyEvent e){
        int code = e.getKeyCode();
        //向左移动
        if(code == 37){
            System.out.println("向左移动");
            if(y == 3){
                return;
            }
            //将右面的图片左移
            data[x][y] = data[x][y+1];
            //将右面的图片设为空白图片(编号为0)
            data[x][y+1] = 0;
            //将初始图片设置为空白图片对应位置
            y++;
            //加载图片
            initImage();
        }
        //向上移动
        else if(code == 38){
            System.out.println("向上移动");
            if(x == 3){
                return;
            }
            //将下面的图片上移
            data[x][y] = data[x+1][y];
            //将下面的图片设为空白图片(编号为0)
            data[x+1][y] = 0;
            //将初始图片位置设置为空白图片位置
            x++;
            //加载图片
            initImage();
        }
        //向右移动
        else if(code == 39){
            System.out.println("向右移动");
            if(y == 0){
                return;
            }
            //将左面的图片右移
            data[x][y] = data[x][y-1];
            //将左面的图片设为空白图片(编号为0)
            data[x][y-1] = 0;
            //将初始图片设置为空白图片对应位置
            y--;
            //加载图片
            initImage();
        }
        //向下移动
        else if(code == 40){
            System.out.println("向下移动");
            if(x == 0){
                return;
            }
            //将上面的图片下移
            data[x][y] = data[x-1][y];
            //将上面的图片设为空白图片(编号为0)
            data[x-1][y] = 0;
            //将初始图片设置为空白图片对应位置
            x--;
            //加载图片
            initImage();
        }
    }


五、结语


如果不知道上下左右对应编号,可以通过文章开头的连接去查看方法,找到编号,这里主要是移动的思路比较难,搞清楚思路后写代码其实会很方便,如果有任何问题欢迎留言评论

目录
打赏
0
0
0
0
1
分享
相关文章
Java 基础类从入门到精通实操指南
这份指南专注于**Java 17+**的新特性和基础类库的现代化用法,涵盖开发环境配置、数据类型增强(如文本块)、字符串与集合处理进阶、异常改进(如密封类)、IO操作及实战案例。通过具体代码示例,如CSV数据分析工具,帮助开发者掌握高效编程技巧。同时提供性能优化建议和常用第三方库推荐,适合从入门到精通的Java学习者。资源链接:[点此下载](https://pan.quark.cn/s/14fcf913bae6)。
103 34
最新技术栈下 Java 面试高频技术点实操指南详解
本指南结合最新Java技术趋势,涵盖微服务(Spring Cloud Alibaba)、响应式编程(Spring WebFlux)、容器化部署(Docker+Kubernetes)、函数式编程、性能优化及测试等核心领域。通过具体实现步骤与示例代码,深入讲解服务注册发现、配置中心、熔断限流、响应式数据库访问、JVM调优等内容。适合备战Java面试,提升实操能力,助力技术进阶。资源链接:[https://pan.quark.cn/s/14fcf913bae6](https://pan.quark.cn/s/14fcf913bae6)
88 25
JBoltAI 框架完整实操案例 在 Java 生态中快速构建大模型应用全流程实战指南
本案例基于JBoltAI框架,展示如何快速构建Java生态中的大模型应用——智能客服系统。系统面向电商平台,具备自动回答常见问题、意图识别、多轮对话理解及复杂问题转接人工等功能。采用Spring Boot+JBoltAI架构,集成向量数据库与大模型(如文心一言或通义千问)。内容涵盖需求分析、环境搭建、代码实现(知识库管理、核心服务、REST API)、前端界面开发及部署测试全流程,助你高效掌握大模型应用开发。
101 5
|
12天前
|
2025 版 Java 零基础入门到精通实操指南
这篇文章为零基础学习者提供了Java入门的全面指南。首先介绍了Java的特点和用途,然后详细讲解了环境搭建步骤(JDK安装、环境变量配置和IDE选择),并以"Hello World"程序为例演示了开发流程。文章还系统性地讲解了Java核心语法,包括变量与数据类型、运算符、控制流语句、数组和方法等基础知识,以及面向对象编程和异常处理的概念。通过代码示例帮助读者理解和实践,最后建议掌握基础后可进一步学习Java高级特性和框架。文中还提供了代码获取方式和关注入口,适合Java初学者系统学习。
345 2
Java 基础篇必背综合知识点最新技术与实操应用全面总结指南
本总结梳理了Java 17+的核心知识点与新技术,涵盖基础概念(模块化系统、GraalVM)、数据类型(文本块、模式匹配)、流程控制(增强switch)、面向对象(Record类、密封类)、常用类库(Stream API、HttpClient)、实战案例(文件处理)、构建工具(Maven、Gradle)、测试框架(JUnit 5)、开发工具(IDE、Git)及云原生开发(Spring Boot 3、Docker)。通过理论结合实操,帮助开发者掌握Java最新特性并应用于项目中。代码示例丰富,建议配合实践加深理解。
55 3
|
16天前
|
Java 17 + 特性与现代开发技术实操应用详解
本指南聚焦Java 17+最新技术,涵盖模块化开发、Record类、模式匹配、文本块、Stream API增强、虚拟线程等核心特性,结合Spring Boot 3与Micronaut框架实战。通过实操案例解析现代Java开发技术栈,包括高性能并发编程、GraalVM原生编译及开发工具链配置。同时梳理面试高频考点,助力掌握Java新特性和实际应用,适合学习与项目实践。代码示例丰富,附带完整资源下载链接。
232 0
java 最新技术驱动的智能教育在线实验室设备管理与实验资源优化实操指南
这是一份基于最新技术的智能教育在线实验室设备管理与实验资源优化的实操指南,涵盖系统搭建、核心功能实现及优化策略。采用Flink实时处理、Kafka消息队列、Elasticsearch搜索分析和Redis缓存等技术栈,结合强化学习动态优化资源调度。指南详细描述了开发环境准备、基础组件部署、数据采集与处理、模型训练、API服务集成及性能调优步骤,支持高并发设备接入与低延迟处理,满足教育机构数字化转型需求。代码已提供下载链接,助力快速构建智能化实验室管理系统。
81 44
Redis 实操要点:Java 最新技术栈的实战解析
本文介绍了基于Spring Boot 3、Redis 7和Lettuce客户端的Redis高级应用实践。内容包括:1)现代Java项目集成Redis的配置方法;2)使用Redisson实现分布式可重入锁与公平锁;3)缓存模式解决方案,包括布隆过滤器防穿透和随机过期时间防雪崩;4)Redis数据结构的高级应用,如HyperLogLog统计UV和GeoHash处理地理位置。文章提供了详细的代码示例,涵盖Redis在分布式系统中的核心应用场景,特别适合需要处理高并发、分布式锁等问题的开发场景。
105 38
Java 最新技术实操:从基础到进阶的详细指南
本文介绍了Java 17及后续版本的核心技术实操,涵盖新特性、集合框架、异常处理和多线程编程等内容。主要包括:密封类(Sealed Classes)的继承层级控制、模式匹配(Pattern Matching)简化类型判断、文本块(Text Blocks)处理多行字符串;集合框架中的工厂方法和Stream API高级操作;异常处理的最佳实践如自动资源管理(ARM)和自定义异常;多线程编程中的CompletableFuture异步编程和ReentrantLock显式锁使用。
68 7
|
18天前
|
Java最新技术(JDK 11+) 及以上 Java 最新技术之集合框架实操应用详解
本示例基于Java最新技术(JDK 11+),涵盖集合框架的核心功能,结合Java 8+特性(如Stream API、Lambda表达式)与并发编程最佳实践。内容包括:List操作(初始化、Lambda过滤、Stream处理)、Map操作(流式过滤、ConcurrentHashMap原子操作、并行流)、Set操作(TreeSet排序、CopyOnWriteArraySet并发安全)、Queue/Deque操作(优先队列、双端队列)以及高级聚合操作(集合转换、分组统计、平均值计算)。 [代码下载](https://pan.quark.cn/s/14fcf913bae6)
31 4
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等

登录插画

登录以查看您的控制台资源

管理云资源
状态一览
快捷访问