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


五、结语


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

相关文章
|
9月前
|
安全 Java API
Java Web 在线商城项目最新技术实操指南帮助开发者高效完成商城项目开发
本项目基于Spring Boot 3.2与Vue 3构建现代化在线商城,涵盖技术选型、核心功能实现、安全控制与容器化部署,助开发者掌握最新Java Web全栈开发实践。
790 1
|
10月前
|
安全 Java 数据库连接
2025 年最新 Java 学习路线图含实操指南助你高效入门 Java 编程掌握核心技能
2025年最新Java学习路线图,涵盖基础环境搭建、核心特性(如密封类、虚拟线程)、模块化开发、响应式编程、主流框架(Spring Boot 3、Spring Security 6)、数据库操作(JPA + Hibernate 6)及微服务实战,助你掌握企业级开发技能。
1158 3
|
10月前
|
前端开发 Java API
2025 年 Java 全栈从环境搭建到项目上线实操全流程指南:Java 全栈最新实操指南(2025 版)
本指南涵盖2025年Java全栈开发核心技术,从JDK 21环境搭建、Spring Boot 3.3实战、React前端集成到Docker容器化部署,结合最新特性与实操流程,助力构建高效企业级应用。
2991 1
|
10月前
|
Java API Maven
2025 Java 零基础到实战最新技术实操全攻略与学习指南
本教程涵盖Java从零基础到实战的全流程,基于2025年最新技术栈,包括JDK 21、IntelliJ IDEA 2025.1、Spring Boot 3.x、Maven 4及Docker容器化部署,帮助开发者快速掌握现代Java开发技能。
1772 1
|
10月前
|
消息中间件 Java Kafka
Java 事件驱动架构设计实战与 Kafka 生态系统组件实操全流程指南
本指南详解Java事件驱动架构与Kafka生态实操,涵盖环境搭建、事件模型定义、生产者与消费者实现、事件测试及高级特性,助你快速构建高可扩展分布式系统。
460 7
|
10月前
|
消息中间件 Java 数据库
Java 基于 DDD 分层架构实战从基础到精通最新实操全流程指南
本文详解基于Java的领域驱动设计(DDD)分层架构实战,结合Spring Boot 3.x、Spring Data JPA 3.x等最新技术栈,通过电商订单系统案例展示如何构建清晰、可维护的微服务架构。内容涵盖项目结构设计、各层实现细节及关键技术点,助力开发者掌握DDD在复杂业务系统中的应用。
1838 0
|
10月前
|
Java 测试技术 API
2025 年 Java 开发者必知的最新技术实操指南全览
本指南涵盖Java 21+核心实操,详解虚拟线程、Spring Boot 3.3+GraalVM、Jakarta EE 10+MicroProfile 6微服务开发,并提供现代Java开发最佳实践,助力开发者高效构建高性能应用。
1311 5
|
10月前
|
JavaScript 安全 前端开发
Java开发:最新技术驱动的病人挂号系统实操指南与全流程操作技巧汇总
本文介绍基于Spring Boot 3.x、Vue 3等最新技术构建现代化病人挂号系统,涵盖技术选型、核心功能实现与部署方案,助力开发者快速搭建高效、安全的医疗挂号平台。
448 3
|
10月前
|
Web App开发 Rust 前端开发
WebAssembly 与 Java 结合实操指南 基于最新工具链的跨语言开发实践教程
WebAssembly与Java集成实操指南 本文基于2024年最新工具链(GraalVM、TeaVM、Wasmtime),提供两种Java与Wasm结合的实践方案: Java调用Wasm模块:通过Rust编写高性能加密算法并编译为Wasm,在Java中利用Wasmtime运行时进行调用,实现6.7倍的性能提升。重点演示了Wasm内存模型操作和指针传递机制。 Java编译为Wasm:使用TeaVM将Java科学计算代码编译为Wasm模块,供浏览器前端直接调用。包含完整的Maven配置和前端调用示例,特别适合
794 5
|
9月前
|
Java API 数据库
2025 年最新 Java 实操学习路线,从入门到高级应用详细指南
2025年Java最新实操学习路线,涵盖从环境搭建到微服务、容器化部署的全流程实战内容,助你掌握Java 21核心特性、Spring Boot 3.2开发、云原生与微服务架构,提升企业级项目开发能力,适合从入门到高级应用的学习需求。
2699 0