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();//登入界面
	}
}

运行结果图:

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

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

相关文章

Flutter笔记:缩放手势

Flutter笔记 缩放手势 作者&#xff1a;李俊才 &#xff08;jcLee95&#xff09;&#xff1a;https://blog.csdn.net/qq_28550263 邮箱 &#xff1a;291148484163.com 本文地址&#xff1a;https://blog.csdn.net/qq_28550263/article/details/134485138 目 录 1. 概述2. 缩放手…

数据结构【DS】图的应用

图的连通性问题 最少边数 最多边数 无向图非连通 &#x1d48e;&#x1d7ce; &#x1d48e;&#x1d48f;−&#x1d7d0;∗(&#x1d48f;−&#x1d7cf;)/&#x1d7d0; 无向图连通 &#x1d48e;&#x1d48f;−&#x1d7cf; &#x1d48e;&#x1d48f;∗(&#…

网络割接用VRRP替换HSRP

如图3-11所示&#xff0c;C6500作为核心层设备上行连接出口路由器NE40E-X3&#xff0c;下行连接接入层设备CE6800。C6500上配置HSRP实现冗余备份网关&#xff0c;同时在二层网络部署MSTP破除环路。 总体思路 HSRP为CISCO私有协议&#xff0c;CE系列交换机&#xff08;以CE1280…

【算法挨揍日记】day26——53. 最大子数组和、918. 环形子数组的最大和

53. 最大子数组和 53. 最大子数组和 题目描述&#xff1a; 给你一个整数数组 nums &#xff0c;请你找出一个具有最大和的连续子数组&#xff08;子数组最少包含一个元素&#xff09;&#xff0c;返回其最大和。 子数组 是数组中的一个连续部分。 解题思路&#xff1a; 状态…

quinn源码解析:QUIC数据包是如何发送的

quinn源码解析&#xff1a;QUIC数据包是如何发送的 简介QUIC协议中的概念endpoint&#xff08;端点&#xff09;connection&#xff08;连接&#xff09;Stream&#xff08;流&#xff09;Frame (帧) 发包过程解析SendStream::write_allConnectionDriverEndpointDriver 简介 q…

【Java】线程池源码解析

目录 一、线程池介绍 1.1、什么是线程池 1.2、线程池的工作原理 二、Executor框架接口 2.1、JDK提供的原生线程池 2.2、类关系 三、线程池核心源码分析 3.1、关键属性 3.2、状态控制 3.3、线程池状态的跃迁 3.4、execute方法源码分析 3.5、addWorker方法源码分析 3…

第五篇 《随机点名答题系统》——抽点答题详解(类抽奖系统、在线答题系统、线上答题系统、在线点名系统、线上点名系统、在线考试系统、线上考试系统)

目录 1.功能需求 2.界面设计 3.流程设计 4.关键代码 随机点名答题系统&#xff08;类抽奖系统、在线答题系统、线上答题系统、在线点名系统、线上点名系统、在线考试系统、线上考试系统&#xff09;&#xff0c;是基于php&#xff08;8.2.11&#xff09;&#xff0c;Java…

【汇编】[bx+idata]的寻址方式、SI和DI寄存器

文章目录 前言一、[bxidata]寻址方式1.1 [bxidata]的含义1.2 示例代码 二、SI和DI寄存器2.1 SI和DI寄存器是什么&#xff1f;2.2 [bxsi]和[bxdi]方式寻址2.3 [bxsiidata]和[bxdiidata] 总结 前言 在汇编语言中&#xff0c;寻址方式是指指令如何定位内存中的数据。BX寄存器与偏…

C#,数值计算——插值和外推,Laplace_interp的计算方法与源程序

1 文本格式 using System; namespace Legalsoft.Truffer { /// <summary> /// Object for interpolating missing data in a matrix by solving Laplaces /// equation.Call constructor once, then solve one or more times /// </summary> …

7 Redis的PipeLine

PipeLine的作用是批量执行命令 redis的性能瓶颈基本上是网络 import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import redis.clients.jedis.Jedis; import redis.clients.jedis.JedisPool; import redis.…

应用开发平台集成表单设计器系列之3——整体集成思路及表单设计器功能深度了解

背景 平台需要实现自定义表单功能&#xff0c;作为低代码开发的一部分&#xff0c;通过技术预研和技术选型&#xff0c;选择form-create和form-create-designer这两个组件进行集成作为实现方案。通过深入了解和技术验证&#xff0c;确认了组件的功能能满足需求&#xff0c;具备…

迪克森电荷泵

迪克森电荷泵&#xff08;Dickson Charge Pump&#xff09;是一种电压倍增器电路&#xff0c;可以将低电压升高到较高电压&#xff0c;相对于其他电压升压电路&#xff0c;迪克森电荷泵具有较高的效率和较简单的电路结构。该电路的基本原理是通过电容和开关来实现电荷的积累和转…

数据结构 堆

手写堆&#xff0c;而非stl中的堆 如何手写一个堆&#xff1f; //将数组建成堆 <O(n) for (int i n / 2;i;i--) //从n/2开始down down(i); 从n/2元素开始down&#xff0c;最下面一层元素的个数是n/2&#xff0c;其余上面的元素的个数是n/2&#xff0c;从最下面一层到最高层…

《数字图像处理-OpenCV/Python》连载(44)图像的投影变换

《数字图像处理-OpenCV/Python》连载&#xff08;44&#xff09;图像的投影变换 本书京东优惠购书链接&#xff1a;https://item.jd.com/14098452.html 本书CSDN独家连载专栏&#xff1a;https://blog.csdn.net/youcans/category_12418787.html 第 6 章 图像的几何变换 几何变…

Open AI开发者大会:AI“科技春晚”

ChatGPT的亮相即将满一年之时&#xff0c;OpenAI举行了自己的首次开发者大会。OpenAI首席执行官Sam Altman宣布推出最新的大模型GPT-4 Turbo。正如“Turbo”一词的中文含义“涡轮增压器”一样&#xff0c;本次发布会上&#xff0c;OpenAI的这款最新大模型在长文本、知识库、多模…

V100 GPU服务器安装GPU驱动教程

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

计算机网络——物理层-信道的极限容量(奈奎斯特公式、香农公式)

目录 介绍 奈氏准则 香农公式 介绍 信号在传输过程中&#xff0c;会受到各种因素的影响。 如图所示&#xff0c;这是一个数字信号。 当它通过实际的信道后&#xff0c;波形会产生失真&#xff1b;当失真不严重时&#xff0c;在输出端还可根据已失真的波形还原出发送的码元…

Go语言常用命令详解(二)

文章目录 前言常用命令go bug示例参数说明 go doc示例参数说明 go env示例 go fix示例 go fmt示例 go generate示例 总结写在最后 前言 接着上一篇继续介绍Go语言的常用命令 常用命令 以下是一些常用的Go命令&#xff0c;这些命令可以帮助您在Go开发中进行编译、测试、运行和…

Linux性能分析——TOP命令详解

我的圈子&#xff1a; 高级工程师聚集地 我是董哥&#xff0c;高级嵌入式软件开发工程师&#xff0c;从事嵌入式Linux驱动开发和系统开发&#xff0c;曾就职于世界500强公司&#xff01; 创作理念&#xff1a;专注分享高质量嵌入式文章&#xff0c;让大家读有所得&#xff01; …

JVM垃圾回收相关概念

目录 一、System.gc()的理解 二、内存溢出与内存泄露 &#xff08;一&#xff09;OOM &#xff08;二&#xff09;内存泄露 三、StopTheWorld 四、垃圾回收的并行与并发 五、安全点与安全区域 &#xff08;一&#xff09;安全点 &#xff08;二&#xff09;安全区域 …
最新文章