java拼图游戏(待优化)

启动类

package com.yx.ui;

public class App {
//启动入口
	public static void main(String[] args) {
		//如果想要开启一个界面,就创建谁的对象
//	new DengJFrame();	
//	new ZCJFrame();
	new GameJFrame();
	}

}

游戏类

package com.yx.ui;

import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.Random;

import javax.swing.ImageIcon;
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{
		//创建二维数组
		int[][]date=new int[4][4];
		//记录空白方块的位置
		int x=0;
		int y=0;
		//游戏界面,所有跟游戏有关的代码
	public GameJFrame() {
		//初始化界面
		jmian();
		
		//初始化菜单
		caidan();
		
		//初始化数据
		daluan();
		
		//初始化图片
		tupian();
		
		//展示出来
		this.setVisible(true);
		
	}
	
	//初始化数据(打乱)
	private void daluan() {
		//需求:
		//把一个一维数组中的数据: 0~15 打乱顺序
		//然后再按照4个一组的方式添加到二维数组当中
		
		//定义一个一维数组
		int[]temp= {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
		//打乱数组中的数据的顺序
		//遍历数组,得到每一个元素,拿着每一个元素跟随机索引上的数据进行交换
		Random r=new Random();
		for(int i=0;i<temp.length;i++) {
			//获取随机索引
		int x=r.nextInt(temp.length);
		//交换数据
		int temp1=temp[i];
		temp[i]=temp[x];
		temp[x]=temp1;
		}
		//给二维数组添加数据
		//遍历一维数组temp得到每个元素,将每个元素添加到二维数组中
		//i=0		0  0
		//i=1		0  1
		//i=2		0  2.....
		for(int i=0;i<temp.length;i++) {
			if(temp[i]==0) {
				x=i/4;
				y=i%4;
			}else {
				date[i/4][i%4]=temp[i];
			}
			
		}
	}
	//初始化图片
	
	private void tupian() {
		
	//清空图片
		this.getContentPane().removeAll();
		
		
	//先加载的图片在上方
		
		//把内循环执行4次
		for(int i=0;i<4;i++) {
			//一行添加4张图片
			for(int j=0;j<4;j++) {
				//获取图片序号
				int num=date[i][j];
				//创建JLabel对象(管理容器)
				JLabel jLabel=new JLabel(new ImageIcon("image/animal/animal3/"+num+".jpg"));
			//指定图片位置
				jLabel.setBounds(105*j+83, 105*i+134, 105, 105);
				//给图片添加边框
				jLabel.setBorder(new BevelBorder(1));
				//0让图片凸起来,1让图片凹下去
			//将管理容器添加到容器内
			this.getContentPane().add(jLabel);
			
			}
			
		}

		//添加背景
		
		JLabel ba=new JLabel(new ImageIcon("image/background.png"));
		ba.setBounds(40, 40, 508, 560);
		this.getContentPane().add(ba);
		
		//刷新界面
		this.getContentPane().repaint();
		
		
}
	private void caidan() {
		//创建菜单对象
		JMenuBar cdan=new JMenuBar();
		//创建菜单上面两个选项对象(功能  关于我们)
		JMenu gn=new JMenu("功能");
		JMenu gywm=new JMenu("关于我们");
		//创建选项下面的条目对象
		JMenuItem cxyx=new JMenuItem("重新游戏");
		JMenuItem cxdr=new JMenuItem("重新登入");
		JMenuItem gbyx=new JMenuItem("关闭游戏");
		
		JMenuItem gzh=new JMenuItem("公众号");
		//将每一个选项下面的条目添加到选项中
		gn.add(cxyx);
		gn.add(cxdr);
		gn.add(gbyx);
		
		gywm.add(gzh);
		//将菜单里面的两个选项添加到菜单当中
		cdan.add(gn);
		cdan.add(gywm);
		
		//给整个界面设置菜单
		this.setJMenuBar(cdan);
	}
	private void jmian() {
		//设置窗体的宽高
		this.setSize(603,680);
		//标题
		this.setTitle("拼图游戏");
		//置顶
		this.setAlwaysOnTop(true);
		//居中
		this.setLocationRelativeTo(null);
		//关闭模式
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		//取消默认的居中放置
		this.setLayout(null);
		//添加键盘事件
		this.addKeyListener(this);
	}
	public static void main(String[] args) {
		
		
	}
	@Override
	public void keyTyped(KeyEvent e) {
		// TODO Auto-generated method stub
		
	}
	@Override
	public void keyPressed(KeyEvent e) {
		// TODO Auto-generated method stub
		
	}
	@Override
	public void keyReleased(KeyEvent e) {
		//上下左右进行判断
		int code=e.getKeyCode();
		if(code==38) {
		System.out.println("向上移动");
		if(x==3) {
			//表示空白方块已经在最下方了,他的下面没有图片在能移动了
			return;
		}
		
		
		//把空白方块下方的数字往上移动
		//x,y 表示空白方块
		//x+1,y表示空白方块的数字
		date[x][y]=date[x+1][y];
		date[x+1][y]=0;
		x++;
		tupian();
		
		
		
		
		}else if(code==40) {
			System.out.println("向下移动");
			if(x==0) {
				return;
			}
			//把空白方块上方的数字往下移动
			date[x][y]=date[x-1][y];
			date[x-1][y]=0;
			x--;
			tupian();
		}else if(code==37) {
			//把空白方块右方的数字往下移动
			System.out.println("向左移动");
			if(y==3) {
				return;
			}
			date[x][y]=date[x][y+1];
			date[x][y+1]=0;
			y++;
			tupian();
		}else if(code==39) {
			//把空白方块左方的数字往下移动
			System.out.println("向右移动");
			if(y==0) {
				return;
			}
			date[x][y]=date[x][y-1];
			date[x][y-1]=0;
			y--;
			tupian();
		}
		
	}

}

展示

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【数据结构】前言

数据结构是在计算机中维护数据的方式。 数据结构是OI重要的一部分。 同的数据结构各有优劣&#xff0c;能够处理的问题各不相同&#xff0c;而根据具体问题选取合适的数据结构&#xff0c;可以大大提升程序的效率。 所以&#xff0c;学习各种各样的数据结构是很有必要的。 数据…

Infineon+EB构建MCAL驱动包Demo实现片内外设使用

本篇文章以实际MCAL示例程序的实现与使用&#xff0c;帮助读者理解MCAL层在BSW中具体担任的功能与角色。文章首先介绍了为了构建MCAL示例程序所需要的相关应用程序的安装&#xff1b;然后介绍了个软件相互集成配置的过程&#xff0c;达到可以编译生成可执行文件&#xff1b;最后…

055-第三代软件开发-控制台输出彩虹日志

第三代软件开发-控制台输出彩虹日志 文章目录 第三代软件开发-控制台输出彩虹日志项目介绍控制台输出彩虹日志实现原理真实代码 总结 关键字&#xff1a; Qt、 Qml、 关键字3、 关键字4、 关键字5 项目介绍 欢迎来到我们的 QML & C 项目&#xff01;这个项目结合了 QM…

054-第三代软件开发-信号槽

第三代软件开发-信号槽 文章目录 第三代软件开发-信号槽项目介绍信号槽实现原理与MFC消息映射机制区别Qt信号槽机制的优缺点 关键字&#xff1a; Qt、 Qml、 关键字3、 关键字4、 关键字5 项目介绍 欢迎来到我们的 QML & C 项目&#xff01;这个项目结合了 QML&#x…

网络层——IP协议

文章目录 一.IP协议二.基本概念三.IP协议格式四.分片与组装五.网段划分六.特殊的IP地址七.IP地址的数量限制八.私网IP地址和公网IP地址九.路由十.路由表生成算法 一.IP协议 IP协议全称为“网际互连协议&#xff08;Internet Protocol&#xff09;”&#xff0c;IP协议是TCP/IP…

视频合并:掌握视频嵌套合并技巧,剪辑高手的必备秘籍

在视频剪辑的过程中&#xff0c;掌握视频合并的技巧是每个剪辑高手必备的技能之一。通过合理的合并视频&#xff0c;可以增强视频的视觉效果&#xff0c;提高观看体验。 一、视频合并的准备工作 收集素材&#xff1a;在进行视频合并之前&#xff0c;首先需要收集足够的素材&a…

C语言 深入理解指针

目录 前言 指针的重要概念 剖析 题目一 题目二 题目三 题目四 题目五 题目六 题目七 题目八 **cpp *--*cpp 3 *cpp[-2] 3 cpp[-1][-1] 1 前言 简单来说&#xff0c;指针是一个变量&#xff0c;其值为另一个变量的地址。通过指针&#xff0c;我们可以直…

交易机器人-规则部分

微信公众号&#xff1a;大数据高性能计算 背景 背景是基于人工去做交易本身无法做到24小时无时无刻的交易&#xff0c;主要是虚拟币本身它是24小时交易&#xff0c;人无法做到24小时盯盘&#xff0c;其次就是如果你希望通过配置更加复杂的规则甚至需要爬取最新的信息走模型进行…

二阶低通滤波器(二阶巴特沃斯滤波器)

连续传递函数G(s) 离散传递函数G(z) 差分方程形式 二阶巴特沃斯滤波器参数设计 设计采样频率100Hz&#xff0c;截止频率33Hz。 注意&#xff1a;设计参数使用在离散系统中&#xff01; 同理&#xff0c;其他不同阶数不同类型的滤波器设计&#xff0c;如二阶高通滤波器、二阶…

OFDM通信系统仿真之交织技术

文章目录 前言一、交织1、概念2、图形举例3、交织的位置 二、MATLAB仿真1、MATLAB 程序2、仿真结果 前言 之前的博客&#xff1a;OFDM深入学习及MATLAB仿真 中有对交织的概念进行讲解&#xff0c;但讲解还是比较浅显&#xff0c;且仿真实现时并没有加入交织及解交织流程&#…

系列十二、强引用、软引用、弱引用、虚引用分别是什么?

一、整体架构 二、强引用&#xff08;默认支持模式&#xff09; 2.1、概述 当内存不足时&#xff0c;JVM开始垃圾回收&#xff0c;对于强引用的对象&#xff0c;就算是出现了OOM也不会对该对象进行回收&#xff0c;死都不收。 强引用是我们最常见的普通对象引用&#xff0c;只…

特效!视频里的特效在哪制作——Adobe After Effects

今天&#xff0c;我们来谈谈一款在Adobe系列中推出的一款图形视频处理软件&#xff0c;适用于从事设计和视频特技的机构&#xff0c;包括电视台、动画制作公司、个人后期制作工作室以及多媒体工作室的属于层类型后期软件——Adobe After Effects。 Adobe After Effects&#xf…

苍穹外卖项目笔记(3)——员工管理

前言 这些功能都没有展示对应的测试结果&#xff0c;可自行通过接口文档进行测试&#xff0c;也可以进行前后端联调测试&#xff0c;附代码链接&#xff1a;take-out 1新增员工 1.1 需求分析和设计 产品原型 接口设计 【注】code&#xff1a;操作成功返回1&#xff0c;否则…

Azure Machine Learning - Azure AI 搜索中的集成数据分块和嵌入

在基于索引器的索引编制中&#xff0c;Azure AI _集成矢量化_将数据分块和文本到矢量嵌入添加到技能中&#xff0c;它还为查询添加文本到矢量的转换。 关注TechLead&#xff0c;分享AI全维度知识。作者拥有10年互联网服务架构、AI产品研发经验、团队管理经验&#xff0c;同济本…

我叫:选择排序【JAVA】

1.我是个啥子&#xff1f;&#xff1f; 选择式排序&#xff1a;属于内部排序法,从欲排序的数据中,按指定的规则选出某一元素&#xff0c;再依规定交换位置后达到排序的目的。 2.我的思想 基本思想:第一次从arr[0]~arr[n-1]中选取最小值&#xff0c;与arr[0]交换&#xff0c;第…

io多路复用:select、poll和epoll

1、为什么使用多路复用&#xff1a; 1.1单线程BIO监听socket 多路复用一般用于网络io当中&#xff0c;提到网络io我们肯定能想到socket。如果我们想要一个线程单纯的用向下文的方式监听很多个socket看他是否有事件发生&#xff0c;那这样是不可行。 但上一个socket1没有可读事…

哪个电脑录屏软件好用又免费?十大好用的免费录屏软件排行

屏幕录制软件是一个非常有用的辅助工具&#xff0c;可以帮助您录制屏幕上的所有内容&#xff0c;并根据需要将其转换为视频。 此外&#xff0c;免费的屏幕录像机可以为您节省大量不必要的费用。在这篇文章中&#xff0c;我将列出我在工作和学习中最有效使用的 10 个软件。 每…

OSG加载模型时显示读取进度

目录 1. 前言 2. 开发环境说明 3. 功能实现 3.1. 方法1 3.2. 方法2 3.3. 方法3 4. 附加说明 1. 前言 OSG中加载模型文件到视景器&#xff0c;一般通过osgDB::readXXXX系列开头的函数来加载模型&#xff0c;如&#xff1a;osgDB::readNodeFile、osgDB::readImageFile、os…

Pytest自动化测试框架:mark用法---测试用例分组执行

pytest中的mark&#xff1a; mark主要用于在测试用例/测试类中给用例打标记(只能使用已注册的标记名)&#xff0c;实现测试分组功能&#xff0c;并能和其它插件配合设置测试方法执行顺序等。 如下图&#xff0c;现在需要只执行红色部分的测试方法&#xff0c;其它方法不执行&am…

【精选】项目管理工具——Maven详解

Maven简介 Maven是一个项目管理工具。它可以帮助程序员构建工程&#xff0c;管理jar包&#xff0c;编译代码&#xff0c;完成测试&#xff0c;项目打包等等。 Maven工具是基于POM&#xff08;Project Object Model&#xff0c;项目对象模型&#xff09;实现的。在Maven的管理下…
最新文章