java之拼图小游戏(开源)
public class LoginJFrame extends JFrame {//表示登录界面,以后所有跟登录相关的都写在这里public LoginJFrame() {//设置界面的长和宽this.setSize(603,680);//设置界面的标题this.setTitle("拼图登陆界面");//设置界面置顶this.setAlwaysOnTop(true);//设置界面居中this.setLocationRelativeTo(null);//设置游戏的关闭模式this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);//这里是开启和关闭图形化界面的this.setVisible(true);}
}
public class RegisterJFrame extends JFrame {//注册界面,以后跟注册相关的都写在这里public RegisterJFrame() {//设置界面的长和宽this.setSize(603,680);//设置界面的标题this.setTitle("拼图注册界面");//设置界面置顶this.setAlwaysOnTop(true);//设置界面居中this.setLocationRelativeTo(null);//设置游戏的关闭模式this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);//这里是开启和关闭图形化界面的this.setVisible(true);}
}
public class GameJFrame extends JFrame implements KeyListener {//创建一个二维数组int[][] data = new int[4][4];//记录空白方块在二维数组中的位置int x=0;int y=0;//把地址路径改为变量String path="..\\Day03\\out\\image\\animal\\";//定义变量用来统计步数int step=0;//JFrame 界面,窗体//跟游戏相关的都写在这个界面public GameJFrame() {//初始化界面initJFrame();//初始化菜单initJMenuBar();//初始化数据(打乱)initdata();//初始化图片(根据打乱之后的数据来加载图片)initImage();//这里是开启和关闭图形化界面的this.setVisible(true);}//定义一个二维数组,存储正确的数据int[][] win={{1,2,3,4},{6,7,8,9},{11,12,13,10},{14,15,0,5}};//初始化数据(打乱)private void initdata() {//需求://把一个一维数组的数据:0~15打乱顺序//然后再按照4个一组的方式添加到二维数组当中//定义一个一维数组int[] tempArr = {0,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[i];tempArr[i] = tempArr[index];tempArr[index] = temp;}//遍历数组for (int i = 0; i < tempArr.length; i++) {if (tempArr[i] == 0){x=i/4;y=i%4;}else{data[i/4][y%4]=tempArr[i];}}//给二维数组添加数据//遍历二维数组,给里面每一个数据赋值int index = 0;for (int i = 0; i < data.length; i++) {for (int j = 0; j < data[0].length; j++) {data[i][j] = tempArr[index];index++;}}}//初始化图片private void initImage() {//清空原本已经出现的图片this.getContentPane().removeAll();if (victory()) {//显示的胜利的图标JLabel winlabel = new JLabel(new ImageIcon("C:\\Users\\Administrator\\IdeaProjects\\Day03\\out\\image\\animal1\\victory.png"));winlabel.setBounds(203,253,250,200);this.getContentPane().add(winlabel);}JLabel stepCount=new JLabel("步数:"+step);stepCount.setBounds(50,30,100,20);this.getContentPane().add(stepCount);// 细节:先加载的图片在上边,后加载的图片在下边for (int i = 0; i < 4; i++) {for (int j= 0; j < 4; j++) {int num=data[i][j];//创建一个JLable的对象(管理容器)JLabel label=new JLabel(new ImageIcon(path+num+".png"));//指定图片的位置label.setBounds(50*j+200,50*i+200 ,50,50);//给图片添加边框//0:表示让图片凸起来//1:表示让图片凹下去label.setBorder(new BevelBorder(BevelBorder.LOWERED));//把管理容器放到界面当中this.getContentPane().add(label);}}//添加背景图片JLabel background = new JLabel(new ImageIcon("..\\Day03\\out\\image\\animal1\\background.png"));background.setBounds(40, 40 , 508,560);//把背景图片添加到界面当中this.getContentPane().add(background);//刷新一下界面this.getContentPane().repaint();}//初始化菜单private void initJMenuBar() {//初始化菜单//创建整个菜单对象JMenuBar menuBar = new JMenuBar();//创建菜单上面的俩个选项的对象 (功能 关于我们)JMenu functionJMenu = new JMenu("功能");JMenu aboutJMenu = new JMenu("关于我们");//创建选项下面的条目对象JMenuItem replayItem= new JMenuItem("重新游戏");JMenuItem reloginItem= new JMenuItem("重新登陆");JMenuItem closeItem= new JMenuItem("关闭游戏");JMenuItem accoutItem= new JMenuItem("公众号");//将每一个选项的条目添加到选项当中functionJMenu.add(replayItem);functionJMenu.add(reloginItem);functionJMenu.add(closeItem);//然后再把选项添加到菜单里面menuBar.add(functionJMenu);aboutJMenu.add(accoutItem);menuBar.add(aboutJMenu);//给整个界面去设置菜单this.setJMenuBar(menuBar);}// 初始化界面private void initJFrame() {//设置界面的长和宽this.setSize(603,680);//设置界面的标题this.setTitle("拼图单机版v1.0");//设置界面置顶this.setAlwaysOnTop(true);//设置界面居中this.setLocationRelativeTo(null);//设置游戏的关闭模式this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);//取消默认的居中方式this.setLayout(null);//给整个界面添加键盘监听事件this.addKeyListener(this);}@Overridepublic void keyTyped(KeyEvent e) {}@Override//按下不松时候,可以调用这个方法public void keyPressed(KeyEvent e) {int code=e.getKeyCode();if(code==65){//把界面中所有的图片删除this.getContentPane().removeAll();//加载第一张完整的图片JLabel all=new JLabel(new ImageIcon(path+"all.png"));all.setBounds(100,100,400,400);this.getContentPane().add(all);//加载背景图片JLabel background = new JLabel(new ImageIcon("..\\Day03\\out\\image\\animal1\\background.png"));background.setBounds(40, 40 , 508,560);//把背景图片添加到界面当中this.getContentPane().add(background);this.getContentPane().repaint();}}@Override//松开按键的时候,可以调用这个方法public void keyReleased(KeyEvent e) {if (victory()) {return;}//对上下左右进行判断//左:37,上:38,右:39,下:40int code=e.getKeyCode();if(code==37){if(y==3){//表示空白方块已经在最下方了,他的下面没有图片能移动了return;}System.out.println("向左移动");data[x][y]=data[x][y+1];data[x][y+1]=0;y++;//每移动一次,计数器就自增一次step++;initImage();}else if(code==38){System.out.println("向上移动");if (x==3){//表示空白方块已经在最下方了,他的下面没有图片能移动了return;}//逻辑:把空白方块下方的的数字向上移动//x,y表示空白方块//x+1,y表示空白方块下方的数字//把空白下方的数字赋值给空白方块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++;initImage();}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},{6,7,8,9},{11,12,13,10},{14,15,0,5}};initImage();}}//判断data里面的数据看是否跟win数据相同//如果相同就返回true,不相同就返回falsepublic 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]){//只要有一个数据不一样,就返回falsereturn false;}}}//循环结束表示数组遍历比较完毕,全部一样返回truereturn true;}
}



相关文章:
java之拼图小游戏(开源)
public class LoginJFrame extends JFrame {//表示登录界面,以后所有跟登录相关的都写在这里public LoginJFrame() {//设置界面的长和宽this.setSize(603,680);//设置界面的标题this.setTitle("拼图登陆界面");//设置界面置顶this.setAlwaysOnTop(true);/…...
Linux Shell批量测试IP连通性
Linux 通过Shell脚本来实现读取txt文件中的IP地址,并使用telnet对其后的所有端口进行测试,判断是否可以连接。每个IP地址的端口测试时间限制为5秒。 IP文件 : ips.txt 192.168.1.1 22,80,443 192.168.1.2 21,25,110 192.168.1.3 8080每一行包含一个IP地…...
已解决:anaocnda如何备份环境与安装环境
1.使用pip进行备份 激活对应的虚拟环境,切换到桌面或者想备份的位置。 备份即可: pip freeze > requirements.txt如何安装备份? pip install -r requirements.txt2.使用conda进行备份 激活对应的虚拟环境,切换到桌面或者想…...
自动化与高效设计:推理技术在FPGA中的应用
想象一下,你正在设计一个复杂的电路系统,就像在搭建一座精巧的积木城堡。你手头有各种形状和功能的积木块,这些积木块可以组合成任何你需要的结构。在这个过程中,你有两种主要的方法:一种是手动挑选和搭建每一块积木&a…...
对react模块和模块化理解
在React开发中,模块化和React模块是两个紧密相关但又有区别的概念。理解它们对于构建高效、可维护的React应用至关重要。 模块化 模块化是一种将大型代码库拆分成更小、更易于管理的部分(即模块)的软件设计技术。每个模块都封装了特定的功能…...
CAN总线-----帧格式
目录 前言 一、CAN总线帧格式分类 1.数据帧(重点) 2.遥控帧 3.错误帧 4.过载帧 5.间隔帧 二、位填充 三、波形实例 前言 本期我们就开始学习CAN总线的帧格式,对应帧格式的话,在前面我们学习I2C协议和SPI协议等协议的时候…...
UE网络同步(一) —— 一个项目入门UE网络同步之概念解释
最近在学习UE网络同步,发现了一个非常好的教程,并且附带了项目文件,这里从这个小项目入手,理解UE的网络同步 教程链接:https://www.youtube.com/watch?vJOJP0CvpB8w 项目链接:https://github.com/awforsyt…...
MATLAB中rsf2csf函数用法
目录 语法 说明 示例 将实数 Schur 形式变换为复数 Schur 形式 rsf2csf函数的功能是将实数 Schur 形式转换为复数 Schur 形式。 语法 [Unew,Tnew] rsf2csf(U,T) 说明 [Unew,Tnew] rsf2csf(U,T) 将实矩阵 X 的 [U,T] schur(X) 的输出从实数 Schur 形式变换为复数 Sc…...
Java基础 文字小游戏
souf System.out.printf("你好啊%s","张三") 输出你好啊张三 System.out.printn()放在中间可以换行 System.out.printf("%s你好啊%s","张三","李四") 输出 张三你好啊李四 只有输出没有换行效果。 制作一个文字小游戏…...
「数组」归并排序 / if语句优化|小区间插入优化(C++)
概述 在上一篇文章中,我们介绍了快速排序以及随机快速排序: 「数组」快速排序 / 随机值优化|小区间插入优化(C) 今天,我们来介绍归并排序。 相比于快速排序是冒泡排序融合了分治思想后形成的究极promax进化版&…...
颠覆传统 北大新型MoM架构挑战Transformer模型,显著提升计算效率
挑战传统的Transformer模型设计 在深度学习和自然语言处理领域,Transformer模型已经成为一种标准的架构,广泛应用于各种任务中。传统的Transformer模型依赖于一个固定的、按深度排序的层次结构,每一层的输出都作为下一层的输入。这种设计虽然…...
接口优化笔记
索引 添加索引 where条件的关键自动或者order by后面的排序字段可以添加索引加速查询 索引只能通过删除新增进行修改,无法直接修改。 # 查看表的索引 show index from table_name; show create table table_name; # 添加索引 alter table table_name add index …...
pandas 科学计数法显示
我注意到pandas中有一个问题, 默认情况下,就是其中的数据的小数位不能超过6位,比如0.0000007就会被显示为0,这个结果如下 全部以科学技术显示 import pandas as pd import numpy as np# 设置显示格式为科学计数法 pd.options.d…...
PHP正则替换字符串中的图片地址
在PHP中,可以使用preg_replace()函数来实现正则表达式的替换功能。以下是一个简单的例子,演示如何替换字符串中的图片地址。 double $str 图片地址1:<img src"http://example.com/image1.jpg"> 图片地址2:<i…...
基于多商户AI智能名片商城小程序的粉丝忠诚度提升策略:深度融合足额法则与多维度激励体系
摘要:在数字化浪潮的推动下,多商户AI智能名片商城小程序以其独特的商业模式和技术优势,正逐步成为连接商家与消费者,特别是粉丝群体的重要平台。本文深入探讨了如何通过深度融合足额法则与多维度激励体系,有效提升多商…...
BigDecimal高精度运算
1. BigDecimal是什么类型,为什么可以转为double BigDecimal 是 Java 中用于表示任意精度的十进制数的类。它主要用于金融和商业计算,能够提供比 double 类型更高精度的运算,特别是在处理货币等需要精确计算的场景中。 1.1 BigDecimal 的基…...
C/C++实现蓝屏2.0
🚀欢迎互三👉:程序猿方梓燚 💎💎 🚀关注博主,后期持续更新系列文章 🚀如果有错误感谢请大家批评指出,及时修改 🚀感谢大家点赞👍收藏⭐评论✍ 前…...
Unity音频管理器插件AudioToolKit
Unity音频管理器插件AudioToolKit 介绍AudioToolKit介绍具体用法总结 介绍 最近在自己写音频管理器的时候在网上发现了一款比较好用并且功能很全的一个音频管理插件,叫做AudioToolKit的插件。 如果需要的可以直接从我资源中找AudioToolKit。 AudioToolKit介绍 A…...
搜维尔科技:驾驶模拟器背后的技术: Varjo的虚拟/混合现实 (VR/XR)提供独特的优势,最终加快汽车开发创新的步伐
专业驾驶模拟器广泛应用于车辆开发,帮助汽车行业在开发过程的早期做出更好的设计决策。总体目标是为测试驾驶员提供最真实的驾驶体验,包括动态动作和声音,并测试控制算法或辅助系统等功能。环境越真实,驾驶员的体验就越接近最终车…...
OSL 冠名赞助Web3峰会 “FORESIGHT2024”圆满收官
OSL 望为香港数字资产市场发展建设添砖加瓦 (香港,2024 年 8 月 13 日)- 8 月 11 日至 12 日, 由 香港唯一专注数字资产的上市公司 OSL 集团(863.HK)冠名赞助,Foresight News、 Foresight Ventu…...
第19节 Node.js Express 框架
Express 是一个为Node.js设计的web开发框架,它基于nodejs平台。 Express 简介 Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建各种Web应用,和丰富的HTTP工具。 使用Express可以快速地搭建一个完整功能的网站。 Expre…...
C++实现分布式网络通信框架RPC(3)--rpc调用端
目录 一、前言 二、UserServiceRpc_Stub 三、 CallMethod方法的重写 头文件 实现 四、rpc调用端的调用 实现 五、 google::protobuf::RpcController *controller 头文件 实现 六、总结 一、前言 在前边的文章中,我们已经大致实现了rpc服务端的各项功能代…...
rknn优化教程(二)
文章目录 1. 前述2. 三方库的封装2.1 xrepo中的库2.2 xrepo之外的库2.2.1 opencv2.2.2 rknnrt2.2.3 spdlog 3. rknn_engine库 1. 前述 OK,开始写第二篇的内容了。这篇博客主要能写一下: 如何给一些三方库按照xmake方式进行封装,供调用如何按…...
Swagger和OpenApi的前世今生
Swagger与OpenAPI的关系演进是API标准化进程中的重要篇章,二者共同塑造了现代RESTful API的开发范式。 本期就扒一扒其技术演进的关键节点与核心逻辑: 🔄 一、起源与初创期:Swagger的诞生(2010-2014) 核心…...
零基础在实践中学习网络安全-皮卡丘靶场(第九期-Unsafe Fileupload模块)(yakit方式)
本期内容并不是很难,相信大家会学的很愉快,当然对于有后端基础的朋友来说,本期内容更加容易了解,当然没有基础的也别担心,本期内容会详细解释有关内容 本期用到的软件:yakit(因为经过之前好多期…...
USB Over IP专用硬件的5个特点
USB over IP技术通过将USB协议数据封装在标准TCP/IP网络数据包中,从根本上改变了USB连接。这允许客户端通过局域网或广域网远程访问和控制物理连接到服务器的USB设备(如专用硬件设备),从而消除了直接物理连接的需要。USB over IP的…...
Yolov8 目标检测蒸馏学习记录
yolov8系列模型蒸馏基本流程,代码下载:这里本人提交了一个demo:djdll/Yolov8_Distillation: Yolov8轻量化_蒸馏代码实现 在轻量化模型设计中,**知识蒸馏(Knowledge Distillation)**被广泛应用,作为提升模型…...
Go语言多线程问题
打印零与奇偶数(leetcode 1116) 方法1:使用互斥锁和条件变量 package mainimport ("fmt""sync" )type ZeroEvenOdd struct {n intzeroMutex sync.MutexevenMutex sync.MutexoddMutex sync.Mutexcurrent int…...
代码规范和架构【立芯理论一】(2025.06.08)
1、代码规范的目标 代码简洁精炼、美观,可持续性好高效率高复用,可移植性好高内聚,低耦合没有冗余规范性,代码有规可循,可以看出自己当时的思考过程特殊排版,特殊语法,特殊指令,必须…...
Python 实现 Web 静态服务器(HTTP 协议)
目录 一、在本地启动 HTTP 服务器1. Windows 下安装 node.js1)下载安装包2)配置环境变量3)安装镜像4)node.js 的常用命令 2. 安装 http-server 服务3. 使用 http-server 开启服务1)使用 http-server2)详解 …...
