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…...
《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》
引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...
MySQL 隔离级别:脏读、幻读及不可重复读的原理与示例
一、MySQL 隔离级别 MySQL 提供了四种隔离级别,用于控制事务之间的并发访问以及数据的可见性,不同隔离级别对脏读、幻读、不可重复读这几种并发数据问题有着不同的处理方式,具体如下: 隔离级别脏读不可重复读幻读性能特点及锁机制读未提交(READ UNCOMMITTED)允许出现允许…...
AI Agent与Agentic AI:原理、应用、挑战与未来展望
文章目录 一、引言二、AI Agent与Agentic AI的兴起2.1 技术契机与生态成熟2.2 Agent的定义与特征2.3 Agent的发展历程 三、AI Agent的核心技术栈解密3.1 感知模块代码示例:使用Python和OpenCV进行图像识别 3.2 认知与决策模块代码示例:使用OpenAI GPT-3进…...
【HarmonyOS 5.0】DevEco Testing:鸿蒙应用质量保障的终极武器
——全方位测试解决方案与代码实战 一、工具定位与核心能力 DevEco Testing是HarmonyOS官方推出的一体化测试平台,覆盖应用全生命周期测试需求,主要提供五大核心能力: 测试类型检测目标关键指标功能体验基…...
解决Ubuntu22.04 VMware失败的问题 ubuntu入门之二十八
现象1 打开VMware失败 Ubuntu升级之后打开VMware上报需要安装vmmon和vmnet,点击确认后如下提示 最终上报fail 解决方法 内核升级导致,需要在新内核下重新下载编译安装 查看版本 $ vmware -v VMware Workstation 17.5.1 build-23298084$ lsb_release…...
理解 MCP 工作流:使用 Ollama 和 LangChain 构建本地 MCP 客户端
🌟 什么是 MCP? 模型控制协议 (MCP) 是一种创新的协议,旨在无缝连接 AI 模型与应用程序。 MCP 是一个开源协议,它标准化了我们的 LLM 应用程序连接所需工具和数据源并与之协作的方式。 可以把它想象成你的 AI 模型 和想要使用它…...
Leetcode 3577. Count the Number of Computer Unlocking Permutations
Leetcode 3577. Count the Number of Computer Unlocking Permutations 1. 解题思路2. 代码实现 题目链接:3577. Count the Number of Computer Unlocking Permutations 1. 解题思路 这一题其实就是一个脑筋急转弯,要想要能够将所有的电脑解锁&#x…...
Spring Boot面试题精选汇总
🤟致敬读者 🟩感谢阅读🟦笑口常开🟪生日快乐⬛早点睡觉 📘博主相关 🟧博主信息🟨博客首页🟫专栏推荐🟥活动信息 文章目录 Spring Boot面试题精选汇总⚙️ **一、核心概…...
SpringCloudGateway 自定义局部过滤器
场景: 将所有请求转化为同一路径请求(方便穿网配置)在请求头内标识原来路径,然后在将请求分发给不同服务 AllToOneGatewayFilterFactory import lombok.Getter; import lombok.Setter; import lombok.extern.slf4j.Slf4j; impor…...
高防服务器能够抵御哪些网络攻击呢?
高防服务器作为一种有着高度防御能力的服务器,可以帮助网站应对分布式拒绝服务攻击,有效识别和清理一些恶意的网络流量,为用户提供安全且稳定的网络环境,那么,高防服务器一般都可以抵御哪些网络攻击呢?下面…...
