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/165054.html

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

相关文章

EDA实验-----4*4矩阵键盘与数码管显示测试

目录 一、实验目的 二、实验仪器设备 三、实验原理 四、实验要求 五、实验步骤 六、实验报告 七、实验过程 1.矩阵键盘按键原理 2.数码管原理 3.分频器代码 4.电路图连接 5.文件烧录 一、实验目的 了解数码管的工作原理&#xff1b;掌握4*4矩阵键盘和数码管显示的编…

UnitTest框架

目标&#xff1a; 1.掌握UnitTest框架的基本使用方法 2.掌握断言的使用方法 3.掌握如何实现参数化 4.掌握测试报告的生成 1.定义 &#xff08;1&#xff09;框架(framework)&#xff1a;为解决一类事情的功能集合。&#xff08;需要按照框架的规定(套路) 去书写代码&…

Virtual安装centos后,xshell连接centos

1. 网络使用Host-Only模式动态分配IP&#xff0c;运行 system restart network 后&#xff0c;使用ifconfig查看新的ip&#xff0c;XShell可以直接连上centos&#xff0c; 但是由于使用的是Host-Only模式&#xff0c;centos不能访问网络&#xff0c;只能与宿主机相互通信 2. 网…

快速支持客户知识库的核心优势是什么?

快速支持客户知识库是一个集中存储和组织企业知识的平台&#xff0c;包含了丰富的信息和解决方案&#xff0c;以帮助客户快速解决问题&#xff0c;帮助企业提高客户支持效率和满意度。那么&#xff0c;快速支持客户知识库的核心优势是什么呢&#xff1f; | 1、提高客户自助支持…

VBA之Word应用:文档(Document)的书签

《VBA之Word应用》&#xff08;版权10178982&#xff09;&#xff0c;是我推出第八套教程&#xff0c;教程是专门讲解VBA在Word中的应用&#xff0c;围绕“面向对象编程”讲解&#xff0c;首先让大家认识Word中VBA的对象&#xff0c;以及对象的属性、方法&#xff0c;然后通过实…

win10无损升级到win11

1&#xff0c;下载win11升级助手 https://download.microsoft.com/download/5/4/c/54c22b82-d0cd-4e34-9a06-b75823a8aede/Windows11InstallationAssistant.exe 2&#xff0c;启动助手开始安装 安装时需要重启数次 3&#xff0c;安装后界面 4&#xff0c;安装后&#xff0c…

ACWSpring1.3

首先,前端写ajax写上我们的访问路径(就在我们前端的源代码里面),我们建了两个包pkController用于前端页面url映射过来一层一层找到我们的RestController返回bot1里面有键值,返回的这就是一个session对象bot1这个map.前端拿到我们bot1里的两个值给到我们前端显示出来 1准备页面:…

苹果签名应用掉签频繁原因排查,以及如何避免

作为一个对iOS生态有着深厚理解的实用技术博主&#xff0c;我明白苹果签名应用掉签对我们的开发和使用带来的困扰。签名在苹果设备中扮演着至关重要的角色&#xff0c;它不仅确保了应用来源的合法性&#xff0c;也影响着应用的顺畅运行。 今天&#xff0c;我将和您一同探讨苹果…

云存储与物理存储:优缺点对比分析

当您需要存储数字文件时&#xff0c;您有两个基本选择&#xff1a;云存储和物理存储。 云存储允许您通过互联网将文件保存在云存储提供商运营的服务器上。这些公司通常在多个数据中心制作文件的备份副本&#xff0c;并使用复杂的加密来保护它们。您可以从任何连接互联网的设备访…

ZC序列理论学习及仿真

文章目录 前言一、ZC 序列理论1、基本概念2、表达式3、ZC 序列一些定义①、自相关②、循环移位③、循环自相关④、循环互相关二、ZC 序列性质1、性质 1:恒包络,即等模2、性质 2:零循环自相关3、性质 3:固定循环互相关4、其他性质①、傅里叶变换后仍是 ZC 序列②、低峰均比③…

docker的基本使用以及使用Docker 运行D435i

1.一些基本的指令 1.1 容器 要查看正在运行的容器&#xff1a; sudo docker ps 查看所有的容器&#xff08;包括停止状态的容器&#xff09; sudo docker ps -a 重新命名容器 sudo docker rename <old_name> <new_name> <old_name> 替换为你的容器名称…

基环树(pseudotree)入门

目录 无向基环树找环&#xff0c;[题目](https://www.luogu.com.cn/problem/P8655)拓扑排序找环并查集找环dfs找环 内向基环树[2876. 有向图访问计数](https://leetcode.cn/problems/count-visited-nodes-in-a-directed-graph/description/)[2127. 参加会议的最多员工数](https…

leetcode34.排序数组中查找元素第一个和最后一个位置两种解题方法(超详细)

34. 在排序数组中查找元素的第一个和最后一个位置 - 力扣&#xff08;LeetCode&#xff09;https://leetcode.cn/problems/find-first-and-last-position-of-element-in-sorted-array/description/?envTypelist&envIdZCa7r67M这道题&#xff0c;读者可能会说这道题有什么好…

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/134485123 目 录 1. 概述2. 垂直拖…

argocd

部署argocd https://github.com/argoproj/argo-cd/releases kubectl create namespace argocd kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/v2.9.1/manifests/install.yaml官网 https://argo-cd.readthedocs.io/en/stable/ kubectl crea…

从 0 开始手写一个 Mybatis 框架,三步搞定!

MyBatis框架的核心功能其实不难&#xff0c;无非就是动态代理和jdbc的操作&#xff0c;难的是写出来可扩展&#xff0c;高内聚&#xff0c;低耦合的规范的代码。本文完成的Mybatis功能比较简单&#xff0c;代码还有许多需要改进的地方&#xff0c;大家可以结合Mybatis源码去动手…

计算机毕业设计选题推荐-点餐微信小程序/安卓APP-项目实战

✨作者主页&#xff1a;IT毕设梦工厂✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Py…

AOT:一个.Net 8最牛逼和最受欢迎关注的功能!

这次.Net 8发布&#xff0c;更新了诸多功能&#xff0c;但从各个编程社区看到大家讨论和交流最多的&#xff0c;还是AOT这个功能。 AOT本身在.Net 7就开始引入了&#xff0c;但这次.Net 8做了诸多更新&#xff1a; 1、增加了macOS 平台的 x64 和 Arm64 体系结构的支持&#x…

最新版微信如何打开青少年模式?

最新版微信如何打开青少年模式&#xff1f; 1、将手机微信升级到最新版&#xff0c;并打开后点击底部我的进入&#xff1b; 2、在我的内&#xff0c;找到并点击设置进入&#xff1b; 3、在设置内找到青少年模式&#xff0c;并点击进入开启微信青少年模式&#xff1b; 原文来源…

一、MySQL-Replication(主从复制)

1.1、MySQL Replication 主从复制&#xff08;也称 AB 复制&#xff09;允许将来自一个MySQL数据库服务器&#xff08;主服务器&#xff09;的数据复制到一个或多个MySQL数据库服务器&#xff08;从服务器&#xff09;。 根据配置&#xff0c;您可以复制数据库中的所有数据库&a…
最新文章