13.javase_动漫美女拼图实战

news2024/9/21 10:55:05

资料地址:https://cowtransfer.com/s/4573fe572f9c4a

项目效果:
在这里插入图片描述
练习编程逻辑思维,提高和锻炼自己能力。

一. 绘制游戏界面
1.1窗体绘制
第一个方法:initFrame(),用于窗体的基本设置
public void initFrame() {
this.setSize(960,565); //设置窗体宽和高
this.setTitle(“动漫拼图”); //设置窗体标题
this.setLocationRelativeTo(null);//设置窗体居中
this.setDefaultCloseOperation(3);//设置窗体关闭时退出应用程序
this.setAlwaysOnTop(true); //设置窗体位于其他窗口之上
this.setLayout(null); //取消窗体默认布局
}
第二个方法:setVisible(true),用于设置窗体可见
this.setVisible(true);//设置窗体可见

1.2窗体上组件绘制
一部分:绘制图片标题
//标题图片
JLabel titleLabel = new JLabel(new ImageIcon(“itheima-picture-puzzle\images\title.png”));
titleLabel.setBounds(354,27,232,57);
this.add(titleLabel);
二部分:创建面板绘制拼图成功图片
//定义二维数组,存储图片编号
int[][] datas = {{1,2,3,4}, {5,6,7,8},{9,10,11,12},{13,14,15,16}};
//创建面板
JPanel imagePanel = new JPanel();
imagePanel.setBounds(150,114,360,360);
imagePanel.setLayout(null);
//面板上绘制拼图成功图片
for (int i = 0; i < datas.length; i++) {
for (int j = 0; j < datas[i].length; j++) {
JLabel imageLabel = new JLabel(new ImageIcon(“itheima-picture-puzzle\images\”+datas[i][j]+“.png”));
imageLabel.setBounds(j90,i90,90,90);
imagePanel.add(imageLabel);
}
}
this.add(imagePanel);
三部分:创建面板绘制拼图成功图片
//动漫参照图[JLabel]
canzhaotu.png -> 574,114,122,121
//上下左右,求助,重置按钮添加[JButton]
{“shang.png”,“zuo.png”,“xia.png”,“you.png”,“qiuzhu.png”,“chongzhi.png”}
{{732,265,57,57},{650,347,57,57},{732,347,57,57},{813,347,57,57},{626,444,108,45},{786,444,108,45}}
//背景图[JLabel]
background.png->0,0,960,530

二. 图片打乱并记录0号图片的位置
Random r = new Random();
int x0;
int y0;
for(int i=0; i<datas.length;i++){
for(int j=0;j<datas[i];j++){
int x = r.nextInt(datas.length);
int y = r.nextInt(datas[i].length);
int tmp = datas[i][j];
datas[i][j] = datas[x][y];
datas[x][y] = tmp;
if(tmp==0){
x0 = x;
y0 = y
}
}
}

三. 给按钮注册事件
JButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
}
});
四. 移动业务实现
重新绘制图形
public void rePaintView() {
//移除容器上的组件
imagePanel.removeAll();
imagePanel = new JPanel();
imagePanel.setBounds(150, 114, 360, 360);
imagePanel.setLayout(null);
for (int i = 0; i < datas.length; i++) {
for (int j = 0; j < datas[i].length; j++) {
JLabel imageLabel = new JLabel(new ImageIcon(“itheima-picture-puzzle\images\” + datas[i][j] + “.png”));
imageLabel.setBounds(j * 90, i * 90, 90, 90);
imagePanel.add(imageLabel);
}
}
this.add(imagePanel);
//重新绘制
imagePanel.repaint();
}

 上移动规则:空白图片,和下方元素,进行交换
    边界处理:当x0=3,不能进行上移
	空白图片坐标: datas[x0][y0]
	空白图片下方元素坐标:datas[x0+1][y0]
	移动的规则:
	datas[x0][y0] = datas[x0+1][y0];
	datas[x0+1][y0] = 0;
	x0 = x0 + 1;
	编写重绘方法:rePaintView()
	调用重绘方法
 左移动规则:
	边界:y0=3
	datas[x0][y0] = datas[x0][y0+1];
	datas[x0][y0+1] = 0;
	y0 = y0 + 1;
下移动规则:
	边界:x0=0
	datas[x0][y0] = datas[x0-1][y0];
	datas[x0-1][y0] = 0;
	x0 = x0-1;
右移动规则:
	边界:y0=0
	datas[x0][y0] = datas[x0][y0-1];
	datas[x0][y0-1] = 0;
	y0 = y0 - 1;
	
判断移动是否成功:
    //定义成功数组
   int[][] winDatas = {
        {1, 2, 3, 4},
        {5, 6, 7, 8},
        {9, 10, 11, 12},
        {13, 14, 15, 0}
  };
  //判断二维数组中的元素是否相同
  public boolean isSuccess() {
    for (int i = 0; i < datas.length; i++) {
        for (int j = 0; j < datas[i].length; j++) {
            if(datas[i][j] != winDatas[i][j]) {
                return false;
            }
        }
    }
    return true;
  }

五. 求助业务实现
datas = new int[][] { {1,2,3,4},{5,6,7,8},{9,10,11,12}, {13,14,15,16}};
shangButton.setEnabled(false);
zuoButton.setEnabled(false);
xiaButton.setEnabled(false);
youButton.setEnabled(false);
rePaintView();

六. 重置业务实现

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

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

相关文章

每天一个面试题:悲观锁、乐观锁,对比Hashtable和concurrentHashMap

每天一个面试题&#xff1a;悲观锁、乐观锁Hashtable和concurrentHashMap总结开始全新的学习&#xff0c;沉淀才会有产出&#xff0c;一步一脚印&#xff01; 面试题系列搞起来&#xff0c;这个专栏并非单纯的八股文&#xff0c;我会在技术的基础上&#xff0c;Debug解析&#…

戴维南定理(Thevenin‘s theorem)

戴维南定理&#xff1a;含独立电源的线性电阻单口网络N&#xff0c;就端口特性而言&#xff0c;可以等效为一个电压源和电阻串联的单口网络。电压源的电压等于单口网络在负载开路时的电压uoc&#xff1b;电阻R0是单口网络内全部独立电源为零值时所得单口网络N0的等效电阻。 例子…

JavaScript基本语法

1.JavaScript词法结构 所谓词法结构是指一套基础性规则&#xff0c;用来描述如何使用这门语言来编写程序&#xff0c;包括如下几项&#xff1a; 字符集unicode 区分大小写 &#xff08;true和TRUE&#xff09; 忽略空白字符&#xff08;空格、制表符和换行符&#xff09…

UG鼠标和键盘操作

UG鼠标和键盘操作角色操作鼠标操作选择放大/缩小旋转平移确认适合窗口正视于X/Y/Z视图显示样式九宫图设置键盘操作ESCF8角色操作 角色包含了用户的自定义配置&#xff0c;包括内容、演示、快捷键、工具栏等&#xff0c;通过&#xff1a;菜单-首选项-用户界面-角色 进行导入导出…

【C语言程序设计】实验 8

目录 1. 整数排序 2. 二维数组按每行数据之和升序 3. 字符串排序 4. 二维数组各行元素之和 5. 二位整数数组交换两行 6. 插入排序 7. 10进制转2进制&#xff0c;8进制和16进制数&#xff08;数组&#xff09; 1. 整数排序 【问题描述】从键盘输入n(0<n<21)个整…

微服务同时接入多个Kafka

准备工作 自己搭建一个Kafka 从官方下载Kafka&#xff0c;选择对应Spring Boot 的版本&#xff0c;好在Kafka支持的版本范围比较广&#xff0c;当前最新版本是3.2.1,支持2.12-3.2.1 范围的版本&#xff0c;覆盖了Spring Boot 2.0x-Spring Boot 3.0.x。Apache Kafka 解压安装 …

CMake中target_compile_definitions的使用

CMake中的target_compile_definitions命令用于向target添加编译定义&#xff0c;其格式如下&#xff1a; target_compile_definitions(<target><INTERFACE|PUBLIC|PRIVATE> [items1...][<INTERFACE|PUBLIC|PRIVATE> [items2...] ...]) 指定在编译给定的<…

网络原理初识

网络原理初识 文章目录网络原理初识网络发展历程独立模式网络互联IP地址端口号网络协议OSI七层TCP/ IP协议封装与分用封装一.应用层二.传输层三.网络层四.数据链路层五.物理层分用六.物理层七.数据链路层八.网络层九.传输层十.应用层网络发展历程 独立模式 一开始电脑之间是相…

【InnoDB ClusterSet】快速部署

快速部署 InnoDB ClusterSet 文章目录快速部署 InnoDB ClusterSet前言前期准备架构设计部署过程1. 使用配置账号通过 MySQL Shell 连接到 InnoDB Cluster 任一成员2. 为主 InnoDB Cluster 实例设置变量3. 创建以当前集群作为主集群的 ClusterSet4. 为每个独立服务器实例添加配置…

382. 链表随机节点-哈希表法

382. 链表随机节点-哈希表法 给你一个单链表&#xff0c;随机选择链表的一个节点&#xff0c;并返回相应的节点值。每个节点 被选中的概率一样 。 实现 Solution 类&#xff1a; Solution(ListNode head) 使用整数数组初始化对象。 int getRandom() 从链表中随机选择一个节点…

Vue Element动态生成的表单如何用 el-form 校验

<el-form :model"dynamicValidateForm" ref"dynamicValidateForm" label-width"100px" class"demo-dynamic"><el-form-item prop"email" label"邮箱" :rules"[{ required: true, message: 请输入…

研究良久,终于发现了他代码写的快且bug少的原因

前言 读者诸君&#xff0c;今日我们适当放松一下&#xff0c;不钻研枯燥的知识和源码&#xff0c;分享一套高效的摸鱼绝活。 我有一位程序员朋友&#xff0c;当时在一个团队中开发Android应用&#xff0c;历经多次考核后发现&#xff1a; 在组内以及与iOS团队的对比中: 他的任…

java项目请求url存在特殊字符 400错误

java项目请求url特殊字符 400错误 1 现象 请求路径带特殊字符&#xff0c;就会400错误&#xff0c;这就泄露了服务器版本和报错信息&#xff0c;无疑是敏感信息泄露&#xff0c;实属安全漏洞。 补充项目环境&#xff1a;springmvc、tomcat 8.5.59 2 原因 经排查和报错信息…

STM32--ADC模数转换器

学习江科大自化协stm32教程记录的笔记 ADC模数转换器 ADC&#xff08;Analog-Digital Converter&#xff09;模拟-数字转换器 ADC可以将引脚上连续变化的模拟电压转换为内存中存储的数字变量&#xff0c;建立模拟电路到数字电路的桥梁 DAC是数字-模拟转换器&#xff0c;但是P…

AI 助你轻松剪视频 # AutoCut

如果你还在犯愁每次剪视频都要反复听才能下手&#xff0c;不妨试试AutoCut , AI 大神李沐开源的一个剪辑神器&#xff0c;使用 Python 开发&#xff0c;它可以通过字幕来剪切视频。AutoCut 对你的视频自动生成字幕。然后你选择需要保留的句子&#xff0c;AutoCut 将对你视频中对…

C语言:变量的深入理解

文章目录一.什么是变量C语言中为什么要有类型&#xff1f;C语言中的类型为什么有这么多种呢&#xff1f;定义变量的本质为什么需要定义变量定义变量的本质定义变量时的规则二.深刻理解signed/unsigned定义的变量1.运算时的符号位2.数据的存储情况3.unsigned定义时的小细节三.大…

Android 13 VTS HIDL interface 解析

Android 13 VTS Introduction Android 13已经发布&#xff0c;VTS testcase发生很多变化&#xff0c;在此博客中对其每个测试项目进行流程介绍。 这里先对VTS 做一个介绍&#xff1a; VTS是vendor test suite简称&#xff0c;意为供应商测试套件。目的是确保Vendor层实现的兼容…

Spring Boot自动装配原理

Spring Boot自动装配原理1.Spring Boot 入口2.SpringBootApplicationSpringBootConfigurationComponentScanEnableAutoConfiguration判断自动装配开关是否打开获取EnableAutoConfiguration注解中的 exclude 和 excludeName获取需要自动装配的所有配置类最后3.总结1.Spring Boot…

Github访问量过百万!阿里内部至尊级分布式事务手册,实至名归

分布式事务就是指事务的参与者、支持事务的服务器、资源服务器以及事务管理器分别位于不同的分布式系统的不同节点之上。简单的说&#xff0c;就是一次大的操作由不同的小操作组成&#xff0c;这些小的操作分布在不同的服务器上&#xff0c;且属于不同的应用&#xff0c;分布式…

[附源码]JAVA毕业设计养生药膳推荐系统(系统+LW)

[附源码]JAVA毕业设计养生药膳推荐系统&#xff08;系统LW&#xff09; 项目运行 环境项配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术…