JAVA小游戏 “拼图”
第一步是创建项目 项目名自拟
第二部创建个包名 来规范class
然后是创建类 创建一个代码类 和一个运行类
代码如下:
package heima;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.Random;
import javax.swing.ImageIcon;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.border.BevelBorder;
public class GameJFrame extends JFrame implements KeyListener,ActionListener{
//GameJFrame这个界面表示的就是 游戏的主界面
//以后跟游戏相关的所有逻辑都写在这个类中
//创建一个二维数组
//目的:用来管理数据
//加载图片的时候,会根据二维数组中的数据来进行加载
int[][] data =new int[4][4];
//记录空白方块在二维数组中的位置
int x=0;
int y=0;
//定义一个变量,记录当前展示图片的路径
String path = "D:\\学习资料\\Java\\拼图小游戏\\image\\animal\\animal1\\";
//定义一个二维数组 存储一个正确的数据
int[][] win= {
{1,2,3,4},
{5,6,7,8},
{9,10,11,12},
{13,14,15,16},
};
//定义变量来统计部署
int step = 0 ;
//创建项目下面的条目对象
JMenuItem replayItem =new JMenuItem("重新游戏");
JMenuItem reLoginItem =new JMenuItem("重新登录");
JMenuItem closeItem =new JMenuItem("关闭游戏");
JMenuItem accountItem =new JMenuItem("丁国俊的微信");
public GameJFrame () {
//初始化界面
intiJFrame();
//初始化菜单
initJMenuBar();
//初始化数据
initData();
//初始化图片(根据打乱之后的结果去加载图片)
initImage();
//设置窗体可见 放到最后
this.setVisible(true);
}
//初始化数据
private void initData() {
//1.定义一个一维数组
int[] tempArr= {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
//2.打乱数组中的数据顺序
//遍历数组中得到的每一个元素,拿到每一个元素跟随索引上的数据进行交换
Random r = new Random();
for(int i =0 ;i<tempArr.length;i++) {
//获取随机索引
int index = r.nextInt(tempArr.length);
//拿到遍历到每一个数据,跟随机索引上的数据进行交换
int temp =tempArr[index];
tempArr[i] = tempArr[index];
tempArr[index] =temp;
}
//4.给二维数组添加数据
//遍历一维数组tempArr得到每一个元素, 把每一个元素依次添加到二维数组当中
for(int i=0;i<tempArr.length;i++) {
if(tempArr[i]==0) {
x=i/4;
y=i%4;
}else {
data[i/4][i%4]=tempArr[i];
}
}
}
//初始化图片
//添加图片的时候,就需要按照二维数组中管理的数据添加图片
private void initImage() {
//清空原本已经出现的所有图片
this.getContentPane().removeAll();
if(victory()) {
//显示胜利图标
JLabel winJLabel = new JLabel(new ImageIcon("D:\\学习资料\\Java\\拼图小游戏\\image\\win.png"));
winJLabel.setBounds(203,283,197,73);
this.getContentPane().add(winJLabel);
}
JLabel stepCount = new JLabel ("步数"+step);
stepCount.setBounds(50,30,100,20);
this.getContentPane().add(stepCount);
//先加载的图片在上方 后加载的图片在下方
//外循环---把内循环重复执行了4次
for (int i = 0; i<4;i++) {
//内循环---表示一行添加了4张图片
for (int j = 0; j<4;j++) {
//获取当前要加载图片的序号
int num = data[i][j];
//创建一个JLabel的对象(管理容器)
JLabel jLabel =new JLabel(new ImageIcon(path+ num + ".jpg"));
//指定图片位置
jLabel.setBounds(105*j+83,105*i+134,105,105);
//给图片添加边框
jLabel.setBorder(new BevelBorder(BevelBorder.LOWERED));//设置边框凹下来
//把管理容器添加到界面中
this.getContentPane().add(jLabel);//取消默认的居中放置
}
}
JLabel background =new JLabel(new ImageIcon("D:\\学习资料\\Java\\拼图小游戏\\image\\background.png"));
background.setBounds(40,40,508,560);
//将背景图片添加到界面中
this.getContentPane().add(background);
//刷新一下界面
this.getContentPane().repaint();
}
public void intiJFrame() {
//GameJFrame这个界面表示的就是 游戏的主界面
//以后跟游戏相关的所有逻辑都写在这个类
//设置界面的宽高
this.setSize(603,680);
//设置界面的标题
this.setTitle("拼图单机版v1.8");
//设置界面置顶
this.setAlwaysOnTop(true);
//设置页面居中
this.setLocationRelativeTo(null);
//设置关闭模式
this.setDefaultCloseOperation(3);
//取消默认的居中放置 只有取消了才会按照xy的形式来添加组件
this.setLayout(null);
//给整个界面添加键盘监听事件
this.addKeyListener(this );
}
public void initJMenuBar(){
//初始化菜单
JMenuBar jMenuBar =new JMenuBar();
//常见菜单上的两个选项的对象(功能 关于我们 )
JMenu functionJMenu = new JMenu("功能");
JMenu aboutJMenu = new JMenu("关于我们");
//将每一个选项下面的条目放在选项当中
functionJMenu.add(replayItem);
functionJMenu.add(reLoginItem);
functionJMenu.add(closeItem);
aboutJMenu.add(accountItem);
//给条目绑定时间
replayItem.addActionListener(this);
reLoginItem.addActionListener(this);
closeItem.addActionListener(this);
accountItem.addActionListener(this);
//将菜单里的两个选项添加到菜单当中去
jMenuBar.add(functionJMenu);
jMenuBar.add(aboutJMenu);
//给整个界面设置菜单
this.setJMenuBar(jMenuBar);
}
@Override
public void keyTyped(KeyEvent e) {
// TODO Auto-generated method stub
}
@Override
//按下不松时会调用这个方法
public void keyPressed(KeyEvent e) {
// TODO Auto-generated method stub
int code = e.getKeyCode();
if(code==65) {
//把界面所有的图片删除
this.getContentPane().removeAll();
//加载第一张完整的图片
JLabel all =new JLabel(new ImageIcon(path +"all.jpg"));
all.setBounds(83,134,420,420);
this.getContentPane().add(all);
//加载背景图片
//添加背景图片
JLabel background =new JLabel(new ImageIcon("D:\\学习资料\\Java\\拼图小游戏\\image\\background.png"));
background.setBounds(40,40,508,560);
//将背景图片添加到界面中
//把背景图片添加到界面中
this.getContentPane().add(background);
//刷新界面
this.getContentPane().repaint();
}
}
@Override
public void keyReleased(KeyEvent e) {
// TODO Auto-generated method stub
//对 上,下,左,右进行判断
//左37 上38 右39 下40
int code =e.getKeyCode();
if(code ==37) {
System.out.println("向左移动");
if(y==3){
return;
}
data[x][y] =data[x][y+1];
data[x][y+1]=0;
y++;
//有一次移动,计步器自增一次
step++;
//调用方法按照最新的数字加载图片
initImage();
}else if(code ==38) {
System.out.println("向上移动");
//逻辑
//空白方框下方的数字往上移动
//x,y表示空白方块
//x+1,y表示空白方块下方的数字
//把空白方块下方的数字赋值给空白方块
if(x==3){
return;
}
data[x][y] =data[x+1][y];
data[x+1][y]=0;
x++;
//有一次移动,计步器自增一次
step++;
//调用方法按照最新的数字加载图片
initImage();
}else if(code ==39) {
System.out.println("向右移动");
if(y==0){
return;
}
data[x][y] =data[x][y-1];
data[x][y-1]=0;
y--;
//有一次移动,计步器自增一次
step++;
}else if(code ==40) {
System.out.println("向下移动");
if(x==0){
return;
}
data[x][y] =data[x-1][y];
data[x-1][y]=0;
x--;
//有一次移动,计步器自增一次
step++;
//调用方法按照最新的数字加载图片
initImage();
}else if(code ==65){
initImage();
}else if(code ==87) {
data =new int[][] {
{1,2,3,4},
{5,6,7,8},
{9,10,11,12},
{13,14,15,16}
};
initImage();
}
}
//判断data数组中的数据是否跟win数组中的i昂同
//如果全部相同返回true,否则返false
public boolean victory() {
for( int i=0;i<data.length;i++) {
//i:依次表示二维数组中的data里面的索引
//data[i]:依次表示每一个一维数组
for(int j=0;j<data[i].length;j++) {
if(data[i][j] !=win[i][j]) {
//只要有一个数据不一样则返回false
return false;
}
}
}
//循环结束表示数组遍历比较完毕 ,全部一样的话返回true
return false;
}
public void actionPerformed(ActionEvent e) {
//获取当前被点击的条目对象
Object obj =e.getSource();
//判断
if(obj ==replayItem) {
System.out.println("重新游戏");
//计步器清零
step = 0;
//再次打乱二维数组
initData();
//重新加载图片
initImage();
}else if(obj == reLoginItem) {
System.out.println("重新登录");
this.setVisible(false);
//打开登入界面
new LoginJFrame();
}else if(obj == closeItem) {
System.out.println("关闭游戏");
//直接关闭游戏
System.exit(0);
}else if(obj == accountItem) {
System.out.println("丁国俊的微信");
JDialog jDialog=new JDialog();
//创建一个管理图片的容器对象jDialog
JLabel jLabel = new JLabel(new ImageIcon("D:\\学习资料\\Java\\拼图小游戏\\image\\微信图片_20231119183326.jpg")) ;
//设置位置和宽高
jLabel.setBounds(0,0,258,258);
//把图片添加到弹框中
jDialog.getContentPane().add(jLabel);
//设置弹框大小
jDialog.setSize(344,344);
//让弹框置顶
jDialog.setAlwaysOnTop(true);
//让弹框剧中
jDialog.setLocationRelativeTo(null);
//弹框不关闭则无法操作下面的界面
jDialog.setModal(true);
//让弹框显示出来
jDialog.setVisible(true);
}
}
}
测试类如下:
package heima;
public class App {
public static void main(String[]args) {
//表示程序的启动入口
//如果我们想要开启一个界面,就创建谁的对象就可以了
new GameJFrame();//调用游戏主界面窗体
//new RegisterJFrame();//注册界面
//new LoginJFrame();//登入界面
}
}
运行结果如下:


相关文章:
JAVA小游戏 “拼图”
第一步是创建项目 项目名自拟 第二部创建个包名 来规范class 然后是创建类 创建一个代码类 和一个运行类 代码如下: package heima; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyEvent; import …...
Spring 配置
配置文件最主要的目的 : 解决硬编码的问题(代码写死) SpringBoot 的配置文件,有三种格式 1.properties 2.yaml 3.yml(是 yaml 的简写) SpringBoot 只支持三个文件 1.application.properties 2.application.yaml 3.application.yml yaml 和 yml 是一样的,学会一个就行…...
全新酷盒9.0源码:多功能工具箱软件的最新iapp解决方案
全能工具箱软件酷盒:源码提供iapp解决方案,自定义打造个性化体验 酷盒是一款功能丰富的工具箱软件,内置众多实用功能,并实时更新热门功能。该软件还拥有丰富的资源库,用户可以在线畅玩游戏、免费下载音乐等。 我们提…...
aspose.cells java合并多个excel
背景 有需求需要把多个excel合并到一个excel文件里面,之前一直都是用python来处理办公自动化的东西,但是这个需求用python的openxyl库处理基本只能合并数据,样式没办法一比一合并过去,找了很多解决方案都没法实现,所以…...
【每日一题】三个无重叠子数组的最大和
文章目录 Tag题目来源题目解读解题思路方法一:滑动窗口 写在最后 Tag 【滑动窗口】【数组】【2023-11-19】 题目来源 689. 三个无重叠子数组的最大和 题目解读 解题思路 方法一:滑动窗口 单个子数组的最大和 我们先来考虑一个长度为 k 的子数组的最…...
react之基于@reduxjs/toolkit使用react-redux
react之基于reduxjs/toolkit使用react-redux 一、配置基础环境二、使用React Toolkit 创建 counterStore三、为React注入store四、React组件使用store中的数据五、实现效果六、提交action传递参数七、异步状态操作 一、配置基础环境 1.使用cra快速创建一个react项目 npx crea…...
基于51单片机水位监测控制报警仿真设计( proteus仿真+程序+设计报告+讲解视频)
这里写目录标题 💥1. 主要功能:💥2. 讲解视频:💥3. 仿真💥4. 程序代码💥5. 设计报告💥6. 设计资料内容清单&&下载链接💥[资料下载链接:](https://doc…...
git基本用法和操作
文章目录 创建版本库方式:Git常用操作命令:远程仓库相关命令分支(branch)操作相关命令版本(tag)操作相关命令子模块(submodule)相关操作命令忽略一些文件、文件夹不提交其他常用命令 创建版本库方式: 创建文件夹 在目录下 右键 Git Bush H…...
设计模式-组合模式-笔记
“数据结构”模式 常常有一些组件在内部具有特定的数据结构,如果让客户程序依赖这些特定数据结构,将极大地破坏组件的复用。这时候,将这些特定数据结构封装在内部,在外部提供统一的接口,来实现与特定数据结构无关的访…...
Android 弹出自定义对话框
Android在任意Activity界面弹出一个自定义的对话框,效果如下图所示: 准备一张小图片,右上角的小X图标64*64,close_icon.png,随便找个小图片代替; 第一步:样式添加,注意:默认在value…...
(论文阅读40-45)图像描述1
40.文献阅读笔记(m-RNN) 简介 题目 Explain Images with Multimodal Recurrent Neural Networks 作者 Junhua Mao, Wei Xu, Yi Yang, Jiang Wang, Alan L. Yuille, arXiv:1410.1090 原文链接 http://arxiv.org/pdf/1410.1090.pdf 关键词 m-RNN、…...
4核8G服务器价格选择轻量还是CVM合适?
腾讯云服务器4核8G配置优惠价格表,轻量应用服务器和CVM云服务器均有活动,云服务器CVM标准型S5实例4核8G配置价格15个月1437.3元,5年6490.44元,轻量应用服务器4核8G12M带宽一年446元、529元15个月,腾讯云百科txybk.com分…...
Selenium操作已经打开的Chrome浏览器窗口
Selenium操作已经打开的Chrome浏览器窗口 0. 背景 在使用之前的代码通过selenium操作Chrome浏览器时,每次都要新打开一个窗口,觉得麻烦,所以尝试使用 Selenium 获取已经打开的浏览器窗口,在此记录下过程 本文使用 chrome浏览器来…...
创新研报|新业务发展是CEO推动企业增长的必要选择 – Mckinsey研究
🔍📈 创新研究报告 |新业务拓展:CEO推动企业成长的必然选择 – 麦肯锡研究 🔥💼 所有执行长和商界领袖请注意!您是否正在寻找为您的组织释放成长机会的钥匙? 🌐 麦肯锡最近的一份研究…...
rv1126-rv1109-openssh
这是一个工具,可以通过ssh远程登录来操作,非常逆天! 于是rv1109代码自身自带有openssh 所以只需要打开config即可 diff --git a/buildroot/configs/rockchip_rv1126_rv1109_spi_nand_defconfig b/buildroot/configs/rockchip_rv1126_rv1109…...
MySQL中json类型,你使用过吗
在最近的项目开发过程中,遇到了消息发送内容以Map形式存储的情况。最初的解决方案是将对象转换为字符串,并存储在MySQL的varchar(3000)字段中。然而,由于对存储空间的限制,不得不寻找其他解决方案。在调研中发现,从MyS…...
MATLAB 状态空间设计 —— LQG/LQR 和极点配置算法
系列文章目录 文章目录 系列文章目录前言一、相关函数 —— LQG/LQR 和极点配置算法1.1 LQR —— lqr 函数1.1.1 函数用法1.1.2 举例1.1.2.1 倒摆模型的 LQR 控制 1.2 LQG —— lqg() 函数1.2.1 函数用法1.2.2 举例 1.3 极点配置 —— place() 函数1.3.1 函数用法1.3.2 示例1.3…...
杭州-区块链前瞻性论坛邀请函
2023密码与安全前瞻性论坛邀请函 生成合法节点或非法节点,测试共识协议...
ElasticSearch学习篇6_ES实践与Lucene对比及原理分析技术分享小记
前言 QBM、MFS的试题检索、试题查重、公式转换映射等业务场景以及XOP题库广泛使用搜索中间件,业务场景有着数据量大、对内容搜索性能要求高等特点,其中XOP题库数据量更是接近1亿,对检索性能以及召回率要求高。目前QBM、MFS使用的搜索中间件是…...
mysql练习1
-- 1.查询出部门编号为BM01的所有员工 SELECT* FROMemp e WHEREe.deptno BM01; -- 2.所有销售人员的姓名、编号和部门编号。 SELECTe.empname,e.empno,e.deptno FROMemp e WHEREe.empstation "销售人员";-- 3.找出奖金高于工资的员工。 SELECT* FROMemp2 WHE…...
智慧医疗能源事业线深度画像分析(上)
引言 医疗行业作为现代社会的关键基础设施,其能源消耗与环境影响正日益受到关注。随着全球"双碳"目标的推进和可持续发展理念的深入,智慧医疗能源事业线应运而生,致力于通过创新技术与管理方案,重构医疗领域的能源使用模式。这一事业线融合了能源管理、可持续发…...
应用升级/灾备测试时使用guarantee 闪回点迅速回退
1.场景 应用要升级,当升级失败时,数据库回退到升级前. 要测试系统,测试完成后,数据库要回退到测试前。 相对于RMAN恢复需要很长时间, 数据库闪回只需要几分钟。 2.技术实现 数据库设置 2个db_recovery参数 创建guarantee闪回点,不需要开启数据库闪回。…...
K8S认证|CKS题库+答案| 11. AppArmor
目录 11. AppArmor 免费获取并激活 CKA_v1.31_模拟系统 题目 开始操作: 1)、切换集群 2)、切换节点 3)、切换到 apparmor 的目录 4)、执行 apparmor 策略模块 5)、修改 pod 文件 6)、…...
day52 ResNet18 CBAM
在深度学习的旅程中,我们不断探索如何提升模型的性能。今天,我将分享我在 ResNet18 模型中插入 CBAM(Convolutional Block Attention Module)模块,并采用分阶段微调策略的实践过程。通过这个过程,我不仅提升…...
DockerHub与私有镜像仓库在容器化中的应用与管理
哈喽,大家好,我是左手python! Docker Hub的应用与管理 Docker Hub的基本概念与使用方法 Docker Hub是Docker官方提供的一个公共镜像仓库,用户可以在其中找到各种操作系统、软件和应用的镜像。开发者可以通过Docker Hub轻松获取所…...
CMake基础:构建流程详解
目录 1.CMake构建过程的基本流程 2.CMake构建的具体步骤 2.1.创建构建目录 2.2.使用 CMake 生成构建文件 2.3.编译和构建 2.4.清理构建文件 2.5.重新配置和构建 3.跨平台构建示例 4.工具链与交叉编译 5.CMake构建后的项目结构解析 5.1.CMake构建后的目录结构 5.2.构…...
LeetCode - 394. 字符串解码
题目 394. 字符串解码 - 力扣(LeetCode) 思路 使用两个栈:一个存储重复次数,一个存储字符串 遍历输入字符串: 数字处理:遇到数字时,累积计算重复次数左括号处理:保存当前状态&a…...
基于Uniapp开发HarmonyOS 5.0旅游应用技术实践
一、技术选型背景 1.跨平台优势 Uniapp采用Vue.js框架,支持"一次开发,多端部署",可同步生成HarmonyOS、iOS、Android等多平台应用。 2.鸿蒙特性融合 HarmonyOS 5.0的分布式能力与原子化服务,为旅游应用带来…...
Frozen-Flask :将 Flask 应用“冻结”为静态文件
Frozen-Flask 是一个用于将 Flask 应用“冻结”为静态文件的 Python 扩展。它的核心用途是:将一个 Flask Web 应用生成成纯静态 HTML 文件,从而可以部署到静态网站托管服务上,如 GitHub Pages、Netlify 或任何支持静态文件的网站服务器。 &am…...
Spring AI 入门:Java 开发者的生成式 AI 实践之路
一、Spring AI 简介 在人工智能技术快速迭代的今天,Spring AI 作为 Spring 生态系统的新生力量,正在成为 Java 开发者拥抱生成式 AI 的最佳选择。该框架通过模块化设计实现了与主流 AI 服务(如 OpenAI、Anthropic)的无缝对接&…...
