java拼图小游戏

news2024/9/23 23:35:02

 

第一步是创建项目 项目名自拟

第二部创建个包名 来规范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.coloradmin.cn/o/1228432.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

深入理解注意力机制(下)——缩放点积注意力及示例

一、介绍 在这篇文章中&#xff0c;我们将重点介绍 Transformer 背后的 Scaled Dot-Product Attention&#xff0c;并详细解释其计算逻辑和设计原理。 在文章的最后&#xff0c;我们还会提供一个Attention的使用示例&#xff0c;希望读者看完后能够对Attention有更全面的了解。…

将word中的表格无变形的弄进excel中

在上篇文章中记录了将excel表拷贝到word中来&#xff1a; 记录将excel表无变形的弄进word里面来-CSDN博客 本篇记录&#xff1a;将word中的表格无变形的弄进excel中。 1.按F12&#xff0c;“另存为...”&#xff0c;保存类型&#xff1a;“单个文件页面”&#xff0c;保存。…

Java读写Jar

Java提供了读写jar的类库Java.util.jar&#xff0c;Java获取解析jar包的工具类如下&#xff1a; import java.io.File; import java.io.IOException; import java.net.URL; import java.net.URLClassLoader; import java.util.Enumeration; import java.util.HashMap; import …

【C++入门到精通】新的类功能 | 可变参数模板 C++11 [ C++入门 ]

阅读导航 引言一、新的类功能1. 默认成员函数2. 类成员变量初始化3. 强制生成默认函数的关键字default4. 禁止生成默认函数的关键字delete5. override 和 final&#xff08;1&#xff09;override&#xff08;2&#xff09;final 二、可变参数模板递归函数方式展开参数包逗号表…

C# Winform围棋棋盘

C# Winform简单的围棋棋盘vs2008winform小游戏C#vs2010winform棋盘C#窗体小游戏 这是一个简单的围棋棋盘小游戏&#xff0c;使用C# Winform编写棋盘界面&#xff0c;玩家可以在空白的交叉点上下棋子 项目获取&#xff1a; 项目获取&#xff1a;typora: typora/img (gitee.co…

支付宝沙箱支付

支付宝沙箱支付 支付宝沙箱&#xff08;Alipay Sandbox&#xff09;是支付宝提供的一个模拟环境&#xff0c;用于开发者在不影响真实交易的情况下进行支付宝相关功能的测试和调试。在软件开发中&#xff0c;沙箱环境通常指的是一个隔离的测试环境&#xff0c;可以模拟真实环境…

【论文阅读】MAG:一种用于航天器遥测数据中有效异常检测的新方法

文章目录 摘要1 引言2 问题描述3 拟议框架4 所提出方法的细节A.数据预处理B.变量相关分析C.MAG模型D.异常分数 5 实验A.数据集和性能指标B.实验设置与平台C.结果和比较 6 结论 摘要 异常检测是保证航天器稳定性的关键。在航天器运行过程中&#xff0c;传感器和控制器产生大量周…

Python 自动化(十八)admin后台管理

admin后台管理 什么是admin后台管理 django提供了比较完善的后台数据库的接口&#xff0c;可供开发过程中调用和测试使用 django会搜集所有已注册的模型类&#xff0c;为这些模型类提供数据管理界面&#xff0c;供开发使用 admin配置步骤 创建后台管理账号 该账号为管理后…

2023年中职“网络安全“—Web 渗透测试①

2023年中职"网络安全"—Web 渗透测试① Web 渗透测试任务环境说明&#xff1a;1.访问地址http://靶机IP/task1&#xff0c;分析页面内容&#xff0c;获取flag值&#xff0c;Flag格式为flag{xxx}&#xff1b;2.访问地址http://靶机IP/task2&#xff0c;访问登录页面。…

【每日一题】三个无重叠子数组的最大和

文章目录 Tag题目来源题目解读解题思路方法一&#xff1a;滑动窗口 写在最后 Tag 【滑动窗口】【数组】【2023-11-19】 题目来源 689. 三个无重叠子数组的最大和 题目解读 解题思路 方法一&#xff1a;滑动窗口 单个子数组的最大和 我们先来考虑一个长度为 k 的子数组的最…

【开源】基于Vue.js的创意工坊双创管理系统

项目编号&#xff1a; S 049 &#xff0c;文末获取源码。 \color{red}{项目编号&#xff1a;S049&#xff0c;文末获取源码。} 项目编号&#xff1a;S049&#xff0c;文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 管理员端2.2 Web 端2.3 移动端 三、…

leetcode算法之分治-快排

目录 1.颜色分类2.排序数组3.数组中的第k个最大元素4.最小的k个数 1.颜色分类 颜色分类 class Solution { public:void sortColors(vector<int>& nums) {int n nums.size();int left -1,rightn,i0;while(i<right){if(nums[i] 0) swap(nums[left],nums[i]);e…

力扣 字母异位词分组 哈表 集合

&#x1f468;‍&#x1f3eb; 力扣 字母异位词分组 ⭐ 思路 由于互为字母异位词的两个字符串包含的字母相同&#xff0c;因此对两个字符串分别进行排序之后得到的字符串一定是相同的&#xff0c;故可以将排序之后的字符串作为哈希表的键。 &#x1f351; AC code class Solut…

设计模式-行为型模式-策略模式

一、什么是策略模式 策略模式是一种行为设计模式&#xff0c;它允许在运行时选择算法或行为&#xff0c;并将其封装成独立的对象&#xff0c;使得这些算法或行为可以相互替换&#xff0c;而不影响使用它们的客户端。&#xff08;ChatGPT生成&#xff09; 主要组成部分&#xff…

一款实用的.NET Core加密解密工具类库

前言 在我们日常开发工作中&#xff0c;为了数据安全问题对数据加密、解密是必不可少的。加密方式有很多种如常见的AES&#xff0c;RSA&#xff0c;MD5&#xff0c;SAH1&#xff0c;SAH256&#xff0c;DES等&#xff0c;这时候假如我们有一个封装的对应加密解密工具类可以直接…

【STL】:反向迭代器

朋友们、伙计们&#xff0c;我们又见面了&#xff0c;本期来给大家解读一下有关反向迭代器的模拟实现&#xff0c;如果看完之后对你有一定的启发&#xff0c;那么请留下你的三连&#xff0c;祝大家心想事成&#xff01; C 语 言 专 栏&#xff1a;C语言&#xff1a;从入门到精通…

【kafka】使用docker启动kafka

1.环境准备 docker拉取zookeeper镜像 docker pull zookeeper:3.4.14 创建zookeeper容器&#xff0c;默认端口号为2181 docker run -d --name zookeeper -p 2181:2181 zookeeper:3.4.14 拉取kafka镜像 docker pull wurstmeister/kafka:2.12-2.3.1 创键kafka容器&#xff…

c语言-输入输出详解

文章目录 格式化输入输出占位符printfscanf 字符串输入输出puts&#xff08;&#xff09;gets&#xff08;&#xff09; 字符输入输出putchar&#xff08;&#xff09;getchar&#xff08;&#xff09; 区别 格式化输入输出 输入输出的库函数的头文件&#xff1a; #include<…

2023/11/19总结

项目进度&#xff1a; 地址管理&#xff1a; 显示菜品 购物车相关功能 然后最近在看 支付宝沙盒支付的相关功能&#xff0c;打算把支付给做了 。界面做的不是很好看 &#xff0c;但是后续会改成 手机端的。

WSL 2 更改默认安装的 Linux 发行版

目录 什么是 WSL 2&#xff1f;更改默认安装的 Linux 发行版更改发行版的 WSL 版本 什么是 WSL 2&#xff1f; WSL 2 是适用于 Linux 的 Windows 子系统体系结构的一个新版本&#xff0c;它支持适用于 Linux 的 Windows 子系统在 Windows 上运行 ELF64 Linux 二进制文件。 它的…