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;}
}

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

兼容性测试详解

目录 前言1. 兼容性测试的定义和重要性1.1 兼容性测试的定义1.2 兼容性测试的重要性 2. 兼容性测试的类型2.1 跨浏览器测试2.1.1 跨浏览器测试的挑战2.1.2 跨浏览器测试的方法 2.2 跨平台测试2.2.1 跨平台测试的挑战2.2.2 跨平台测试的方法 3. 兼容性测试的步骤和策略3.1 测试计…

必了解的 20 个 AI 术语解析(下)

AI 领域的基础概念和相关技术有很多&#xff0c;这篇文章里&#xff0c;作者就深入浅出地介绍了相应的内容&#xff0c;感兴趣的同学们&#xff0c;不妨来看一下。 必了解的 20 个 AI 术语解析&#xff08;下&#xff09;© 由 ZAKER科技 提供 本文专为非技术背景的 AI 爱…

【源码+文档+调试讲解】活力健身馆管理系统

摘 要 活力健身馆管理系统的目的是让使用者可以更方便的将人、设备和场景更立体的连接在一起。能让用户以更科幻的方式使用产品&#xff0c;体验高科技时代带给人们的方便&#xff0c;同时也能让用户体会到与以往常规产品不同的体验风格。 与安卓&#xff0c;iOS相比较起来&am…

html+css 实现hover选择按钮

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;今天给大家分享htmlcss 绚丽效果&#xff01;并提供具体代码帮助大家深入理解&#xff0c;彻底掌握&#xff01;创作不易&#xff0c;如果能帮助到大家或者给大家一些灵感和启发&#xff0c;欢迎收藏关注哦 &#x1f495; 目…

【Android】跨程序共享数据——内容提供器初识

跨程序共享数据——探究内容提供器 内容提供器的简介 主要用于在不同的应用程序之间实现数据共享的功能&#xff0c;它提供了一套完整的机制,允许一个程序访问另一个程序中的数据,同时还能保证被访数据的安全性。目前,使用内容提供器是Android实现跨程序共享数据的标准方式。…

opencv-图像透视变换

透射变换是视角变化的结果&#xff0c;是指利用透视中心&#xff0c;像点&#xff0c;目标点共线的条件&#xff0c;按透视旋转定律使承影面(透视面)绕迹线(透视轴旋转某一角度&#xff0c;破坏原有的投影光束&#xff0c;仍能保持承影面上投影几何图形不变的变化) 它的本质将图…

【nginx】解决k8s中部署nginx转发不会自动更新域名解析启动失败的问题

文章目录 1. 问题2.解决办法3.扩展说明3.1 DNS解析阶段划分3.2 问题说明3.2.1 先看/etc/resolv.conf说明3.2.2 针对第一个问题3.2.3 针对第二个问题 【后端】NginxluaOpenResty高性能实践 参考&#xff1a; https://blog.csdn.net/u010837612/article/details/123275026 1. 问…

【二分查找】3143. 正方形中的最多点数

本文涉及的基础知识点 C二分查找 LeetCode3143. 正方形中的最多点数 给你一个二维数组 points 和一个字符串 s &#xff0c;其中 points[i] 表示第 i 个点的坐标&#xff0c;s[i] 表示第 i 个点的 标签 。 如果一个正方形的中心在 (0, 0) &#xff0c;所有边都平行于坐标轴&…

【数据结构入门 】栈

目录 前言 一、栈的概念及结构 二、栈的实现 1. 栈的声明 2.初始化栈 3. 栈的销毁 4.判断是否为空栈 5.入栈&#xff08;只能插入栈顶元素&#xff09; 6. 出栈&#xff08;只能从栈顶删除&#xff09; 7.栈的大小 8.获取栈顶元素 总结 前言 在计算机科学中&#xf…

【MySQL 01】在 Ubuntu 22.04 环境下安装 MySQL

文章目录 &#x1f308; 1. 说明&#x1f308; 2. 卸载不必要的环境&#x1f308; 3. 安装 MySQL&#x1f308; 4. 启动和关闭 MySQL 服务&#x1f308; 5. 临时登录 MySQL&#x1f308; 6. 设置 MySQL 密码&#x1f308; 7. 配置 MySQL &#x1f308; 1. 说明 在安装与卸载中…

Python面试宝典第29题:袋鼠过河

题目 一只袋鼠要从河这边跳到河对岸&#xff0c;河很宽&#xff0c;但是河中间打了很多桩子。每隔一米就有一个桩子&#xff0c;每个桩子上都有一个弹簧&#xff0c;袋鼠跳到弹簧上就可以跳得更远。每个弹簧力量不同&#xff0c;用一个数字代表它的力量&#xff0c;如果弹簧力量…

Maven实战(五)- Nexus 私服安装与使用

Maven实战&#xff08;五&#xff09;- Nexus 私服安装与使用 文章目录 Maven实战&#xff08;五&#xff09;- Nexus 私服安装与使用1.安装Nexus1.1.下载安装包1.2.Nexus启动命令1.3.登陆Nexus 2.仓库与仓库组2.1.内置仓库2.2.仓库分类2.3.创建宿主仓库2.4.创建代理仓库2.5.创…

CSS基础知识day4

目录 1. 浮动 1.1 传统网页布局的三种方式 1.2 标准流&#xff08;普通流/文档流&#xff09; 1.3 为什么需要浮动&#xff1f; 1.4 什么是浮动&#xff1f; 1.5 浮动特性&#xff08;重难点&#xff09; 1.6 浮动元素经常和标准流父级搭配使用 2.常见网页布局 2.1 常…

WEB应用(十四)---文件上传

什么是文件上传漏洞 文件上传是Web应用的常见功能&#xff0c;允许用户上传图片、视频及其他文件类型文件。如果用户上传的是木马文件&#xff0c;则服务器就会收到攻击。 对于这个漏洞的练习有一个专门的靶场&#xff0c;即upload-labs&#xff0c;这个的安装可以在windows中使…

顺序表的实现【数据结构】

文章目录 1.线性表2.顺序表2.1 概念及结构 3.模拟实现3.1 准备工作3.2 顺序表的初始化与销毁3.3 顺序表的尾插3.4 顺序表的尾删3.5顺序表的打印3.6 顺序表的头插3.7 顺序表的头删3.8 顺序表查找3.9 顺序表在pos位置插入x3.10 顺序表删除pos位置的值 4.代码整合 1.线性表 线性表…

【Linux学习】深入理解软硬链接

&#x1f351;个人主页&#xff1a;Jupiter. &#x1f680; 所属专栏&#xff1a;Linux从入门到进阶 欢迎大家点赞收藏评论&#x1f60a; 目录 &#x1f388;软硬链接&#x1f427;软链接&#x1f42c;硬链接 &#x1f438;总结软硬链接的原理&#x1f40d;软硬链接的应用场景&…

观成科技:海莲花活跃木马KSRAT加密通信分析

概述 自2023年8月至今&#xff0c;海莲花组织多次利用KSRAT远控木马对我国发起攻击。KSRAT通过HTTP协议与C&C服务器进行通信&#xff0c;每个样本都使用了不同的URL。其心跳包采用XOR算法进行加密&#xff0c;而控制指令包和数据回传包则使用了XOR以及“XORAES-128-CBC”组…

DC系列靶场---DC 7靶场的渗透测试

DC-7渗透测试 信息收集 地址探测 使用arpscan对目标地址进行探测 arp-scan -l I eth0 得到目标主机IP地址为172.30.1.132 扫描端口 使用nmap对目标主机做端口扫描 nmap -sS -sV -T4 -p- -O 172.30.1.132 扫描到目标主机开启了80端口、22端口。 -sS Nmap的SYN扫描&…

mapbox-gl 实现房间面生成墙(借助jsts)

文章目录 一、前言 一、前言 当我们从室外放大到室内展示室内图层时&#xff0c;我们可能只有房间面的数据&#xff0c;这时要展示房间墙数据&#xff0c;就需要借助工具对房间面进行缓冲&#xff0c;但是数据变动时&#xff0c;我们还要再次进行一下缓冲区生成操作。下面是借…

Copy as cURL 字段含义

当前端在开发过程中&#xff0c;遇到接口错误反馈给后端人员时&#xff0c;一般在此接口处右键复制为cURL。 格式如下&#xff1a; curl https://xxx.xxx.cn/xxx/xxx/management/record/list \-H accept: application/json, text/plain, */* \-H accept-language: zh-CN,zh;q0…