当前位置: 首页 > news >正文

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 {//表示登录界面&#xff0c;以后所有跟登录相关的都写在这里public LoginJFrame() {//设置界面的长和宽this.setSize(603,680);//设置界面的标题this.setTitle("拼图登陆界面");//设置界面置顶this.setAlwaysOnTop(true);/…...

Linux Shell批量测试IP连通性

Linux 通过Shell脚本来实现读取txt文件中的IP地址&#xff0c;并使用telnet对其后的所有端口进行测试&#xff0c;判断是否可以连接。每个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进行备份 激活对应的虚拟环境&#xff0c;切换到桌面或者想备份的位置。 备份即可&#xff1a; pip freeze > requirements.txt如何安装备份&#xff1f; pip install -r requirements.txt2.使用conda进行备份 激活对应的虚拟环境&#xff0c;切换到桌面或者想…...

自动化与高效设计:推理技术在FPGA中的应用

想象一下&#xff0c;你正在设计一个复杂的电路系统&#xff0c;就像在搭建一座精巧的积木城堡。你手头有各种形状和功能的积木块&#xff0c;这些积木块可以组合成任何你需要的结构。在这个过程中&#xff0c;你有两种主要的方法&#xff1a;一种是手动挑选和搭建每一块积木&a…...

对react模块和模块化理解

在React开发中&#xff0c;模块化和React模块是两个紧密相关但又有区别的概念。理解它们对于构建高效、可维护的React应用至关重要。 模块化 模块化是一种将大型代码库拆分成更小、更易于管理的部分&#xff08;即模块&#xff09;的软件设计技术。每个模块都封装了特定的功能…...

CAN总线-----帧格式

目录 前言 一、CAN总线帧格式分类 1.数据帧&#xff08;重点&#xff09; 2.遥控帧 3.错误帧 4.过载帧 5.间隔帧 二、位填充 三、波形实例 前言 本期我们就开始学习CAN总线的帧格式&#xff0c;对应帧格式的话&#xff0c;在前面我们学习I2C协议和SPI协议等协议的时候…...

UE网络同步(一) —— 一个项目入门UE网络同步之概念解释

最近在学习UE网络同步&#xff0c;发现了一个非常好的教程&#xff0c;并且附带了项目文件&#xff0c;这里从这个小项目入手&#xff0c;理解UE的网络同步 教程链接&#xff1a;https://www.youtube.com/watch?vJOJP0CvpB8w 项目链接&#xff1a;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++)

概述 在上一篇文章中&#xff0c;我们介绍了快速排序以及随机快速排序&#xff1a; 「数组」快速排序 / 随机值优化|小区间插入优化&#xff08;C&#xff09; 今天&#xff0c;我们来介绍归并排序。 相比于快速排序是冒泡排序融合了分治思想后形成的究极promax进化版&…...

颠覆传统 北大新型MoM架构挑战Transformer模型,显著提升计算效率

挑战传统的Transformer模型设计 在深度学习和自然语言处理领域&#xff0c;Transformer模型已经成为一种标准的架构&#xff0c;广泛应用于各种任务中。传统的Transformer模型依赖于一个固定的、按深度排序的层次结构&#xff0c;每一层的输出都作为下一层的输入。这种设计虽然…...

接口优化笔记

索引 添加索引 where条件的关键自动或者order by后面的排序字段可以添加索引加速查询 索引只能通过删除新增进行修改&#xff0c;无法直接修改。 # 查看表的索引 show index from table_name; show create table table_name; # 添加索引 alter table table_name add index …...

pandas 科学计数法显示

我注意到pandas中有一个问题&#xff0c; 默认情况下&#xff0c;就是其中的数据的小数位不能超过6位&#xff0c;比如0.0000007就会被显示为0&#xff0c;这个结果如下 全部以科学技术显示 import pandas as pd import numpy as np# 设置显示格式为科学计数法 pd.options.d…...

PHP正则替换字符串中的图片地址

在PHP中&#xff0c;可以使用preg_replace()函数来实现正则表达式的替换功能。以下是一个简单的例子&#xff0c;演示如何替换字符串中的图片地址。 double $str 图片地址1&#xff1a;<img src"http://example.com/image1.jpg"> 图片地址2&#xff1a;<i…...

基于多商户AI智能名片商城小程序的粉丝忠诚度提升策略:深度融合足额法则与多维度激励体系

摘要&#xff1a;在数字化浪潮的推动下&#xff0c;多商户AI智能名片商城小程序以其独特的商业模式和技术优势&#xff0c;正逐步成为连接商家与消费者&#xff0c;特别是粉丝群体的重要平台。本文深入探讨了如何通过深度融合足额法则与多维度激励体系&#xff0c;有效提升多商…...

BigDecimal高精度运算

1. BigDecimal是什么类型&#xff0c;为什么可以转为double BigDecimal 是 Java 中用于表示任意精度的十进制数的类。它主要用于金融和商业计算&#xff0c;能够提供比 double 类型更高精度的运算&#xff0c;特别是在处理货币等需要精确计算的场景中。 1.1 BigDecimal 的基…...

C/C++实现蓝屏2.0

&#x1f680;欢迎互三&#x1f449;&#xff1a;程序猿方梓燚 &#x1f48e;&#x1f48e; &#x1f680;关注博主&#xff0c;后期持续更新系列文章 &#x1f680;如果有错误感谢请大家批评指出&#xff0c;及时修改 &#x1f680;感谢大家点赞&#x1f44d;收藏⭐评论✍ 前…...

Unity音频管理器插件AudioToolKit

Unity音频管理器插件AudioToolKit 介绍AudioToolKit介绍具体用法总结 介绍 最近在自己写音频管理器的时候在网上发现了一款比较好用并且功能很全的一个音频管理插件&#xff0c;叫做AudioToolKit的插件。 如果需要的可以直接从我资源中找AudioToolKit。 AudioToolKit介绍 A…...

搜维尔科技:驾驶模拟器背后的技术: Varjo的虚拟/混合现实 (VR/XR)提供独特的优势,最终加快汽车开发创新的步伐

专业驾驶模拟器广泛应用于车辆开发&#xff0c;帮助汽车行业在开发过程的早期做出更好的设计决策。总体目标是为测试驾驶员提供最真实的驾驶体验&#xff0c;包括动态动作和声音&#xff0c;并测试控制算法或辅助系统等功能。环境越真实&#xff0c;驾驶员的体验就越接近最终车…...

OSL 冠名赞助Web3峰会 “FORESIGHT2024”圆满收官

OSL 望为香港数字资产市场发展建设添砖加瓦 &#xff08;香港&#xff0c;2024 年 8 月 13 日&#xff09;- 8 月 11 日至 12 日&#xff0c; 由 香港唯一专注数字资产的上市公司 OSL 集团&#xff08;863.HK&#xff09;冠名赞助&#xff0c;Foresight News、 Foresight Ventu…...

Vim 调用外部命令学习笔记

Vim 外部命令集成完全指南 文章目录 Vim 外部命令集成完全指南核心概念理解命令语法解析语法对比 常用外部命令详解文本排序与去重文本筛选与搜索高级 grep 搜索技巧文本替换与编辑字符处理高级文本处理编程语言处理其他实用命令 范围操作示例指定行范围处理复合命令示例 实用技…...

深入浅出Asp.Net Core MVC应用开发系列-AspNetCore中的日志记录

ASP.NET Core 是一个跨平台的开源框架&#xff0c;用于在 Windows、macOS 或 Linux 上生成基于云的新式 Web 应用。 ASP.NET Core 中的日志记录 .NET 通过 ILogger API 支持高性能结构化日志记录&#xff0c;以帮助监视应用程序行为和诊断问题。 可以通过配置不同的记录提供程…...

微信小程序之bind和catch

这两个呢&#xff0c;都是绑定事件用的&#xff0c;具体使用有些小区别。 官方文档&#xff1a; 事件冒泡处理不同 bind&#xff1a;绑定的事件会向上冒泡&#xff0c;即触发当前组件的事件后&#xff0c;还会继续触发父组件的相同事件。例如&#xff0c;有一个子视图绑定了b…...

盘古信息PCB行业解决方案:以全域场景重构,激活智造新未来

一、破局&#xff1a;PCB行业的时代之问 在数字经济蓬勃发展的浪潮中&#xff0c;PCB&#xff08;印制电路板&#xff09;作为 “电子产品之母”&#xff0c;其重要性愈发凸显。随着 5G、人工智能等新兴技术的加速渗透&#xff0c;PCB行业面临着前所未有的挑战与机遇。产品迭代…...

解锁数据库简洁之道:FastAPI与SQLModel实战指南

在构建现代Web应用程序时&#xff0c;与数据库的交互无疑是核心环节。虽然传统的数据库操作方式&#xff08;如直接编写SQL语句与psycopg2交互&#xff09;赋予了我们精细的控制权&#xff0c;但在面对日益复杂的业务逻辑和快速迭代的需求时&#xff0c;这种方式的开发效率和可…...

Module Federation 和 Native Federation 的比较

前言 Module Federation 是 Webpack 5 引入的微前端架构方案&#xff0c;允许不同独立构建的应用在运行时动态共享模块。 Native Federation 是 Angular 官方基于 Module Federation 理念实现的专为 Angular 优化的微前端方案。 概念解析 Module Federation (模块联邦) Modul…...

论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一)

宇树机器人多姿态起立控制强化学习框架论文解析 论文解读&#xff1a;交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架&#xff08;一&#xff09; 论文解读&#xff1a;交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化…...

HTML前端开发:JavaScript 常用事件详解

作为前端开发的核心&#xff0c;JavaScript 事件是用户与网页交互的基础。以下是常见事件的详细说明和用法示例&#xff1a; 1. onclick - 点击事件 当元素被单击时触发&#xff08;左键点击&#xff09; button.onclick function() {alert("按钮被点击了&#xff01;&…...

Unit 1 深度强化学习简介

Deep RL Course ——Unit 1 Introduction 从理论和实践层面深入学习深度强化学习。学会使用知名的深度强化学习库&#xff0c;例如 Stable Baselines3、RL Baselines3 Zoo、Sample Factory 和 CleanRL。在独特的环境中训练智能体&#xff0c;比如 SnowballFight、Huggy the Do…...

汇编常见指令

汇编常见指令 一、数据传送指令 指令功能示例说明MOV数据传送MOV EAX, 10将立即数 10 送入 EAXMOV [EBX], EAX将 EAX 值存入 EBX 指向的内存LEA加载有效地址LEA EAX, [EBX4]将 EBX4 的地址存入 EAX&#xff08;不访问内存&#xff09;XCHG交换数据XCHG EAX, EBX交换 EAX 和 EB…...