拼图游游戏代码

news2024/12/25 12:26:02

一.创建新项目

二.插入图片

三.游戏的主界面

1.代码

package com.itheima.ui;
 
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.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游戏的主界面
	//4.创建二维数组,用来管理数据
	int[][] data = new int[4][4];
	int x=0;
	int y=0;
	
	//定义一个变量,展示图片路径
	String path="images\\\\";
	
	
	//定义一个二维数组
	int[][] win = {
			{1,2,3,4},
			{5,6,7,8},
			{9,10,11,12},
			{13,14,15,0}
	};
	
	int step=0;
	//创建选项下面的对象
			JMenuItem replayItem = new JMenuItem("重新游戏");
			JMenuItem reLoginItem = new JMenuItem("重新登入");
			JMenuItem closeItem = new JMenuItem("关闭游戏");
			
			JMenuItem accountItem = new JMenuItem("公众号");
	public GameJFrame() {
		//设置宽高
		this.setSize(640, 700);
		//设置界面的标题
		this.setTitle("拼图单机版1.0");
		//设置界面置顶
		this.setAlwaysOnTop(true);
		//设置界面居中
		this.setLocationRelativeTo(null);
		//设置关闭模式
		this.setDefaultCloseOperation(3);
		//取消默认中间放置
		this.setLayout(null);
		//监听事件
		this.addKeyListener(this);
		
		
		
		//初始化菜单
		//创建菜单对象
		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);
		
		//初始化数据
		initData();
		
		//初始化图片
		initImage();
		
	
		
		//显示
		this.setVisible(true);
		
	}
	
	//初始化数据
	private void initData() {
	
		//1.定义一维数组
				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;
					}
					data[i /4][i%4] = tempArr[i];
				}
				}
				
				
 
	//初始化图片
	//添加图片
private void initImage() {
	//清空原本已经出现的所有图片
	this.getContentPane().removeAll();
	
	if(victory()) {
		JLabel winJLabel = new JLabel(new ImageIcon("C:\\Users\\徐梦\\Desktop\\images\\s.png"));
		winJLabel.setBounds(60, 59, 500, 500);
		this.getContentPane().add(winJLabel);
	}
	
	
	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];
			JLabel jLabel = new JLabel(new ImageIcon(path+num+".gif"));
			//创建一个图片JLabel对象(管理容器)
			//指定图片位=位置
			jLabel.setBounds(151 * j+10, 121 *i+110, 151, 121);
			//添加边框0/1都可以
			jLabel.setBorder(new BevelBorder(1));
			//把管理容器添加到界面中
			this.getContentPane().add(jLabel);
			
		}
	}
		
		this.getContentPane().repaint();
		
		
	
}
@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("C:\\Users\\徐梦\\Desktop\\images\\all.png"));
		all.setBounds(10, 110, 603, 485);
		this.getContentPane().add(all);
		//刷新界面
		this.getContentPane().repaint();
	}
}
@Override
public void keyReleased(KeyEvent e) {
	//判断游戏是否胜利
	if(victory()) {
		return;
	}
	
	
	
	//对上下左右进行判断
	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("向上");
	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++;
		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},
		{5,6,7,8},
		{9,10,11,12},
		{13,14,15,0}
	};
	initImage();
}
	}
public  boolean victory() {
	for(int i=0;i<data.length;i++) {
		for(int j=0;j<data[i].length;j++) {
			if(data[i][j] != win[i][j]) {
				return false;
			}
		}
	}
	return true;
	
}
 
@Override
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("公众号");
	}
	
}
}
 

2.程序的启动入口

package com.itheima.ui;
public class App {
 
	public static void main(String[] args) {
		// TODO Auto-generated method stub
//程序的启动入口
		
		//想要开启谁的界面,就创建谁的对象
	
 
 
		new GameJFrame();
	}
 
}

3.结果

 

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

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

相关文章

【Spring进阶系列丨第三篇】Spring核心技术之 IoC 与 DI 实战案例

前言 在上一篇文章中&#xff0c;我们学习了IoC与DI的相关概念与原理&#xff0c;现在让我们 以HelloWorld为例&#xff0c;编写一个程序&#xff0c;让创建对象的工作由Spring帮助我们创建。 一同感受一下Spring框架带给我们开发的便捷性。 文章目录 前言一、编写Java类二、传…

IDEA调用接口超时,但Postman可成功调用接口

&#x1f4e2;专注于分享软件测试干货内容&#xff0c;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01;&#x1f4e2;交流讨论&#xff1a;欢迎加入我们一起学习&#xff01;&#x1f4e2;资源分享&#xff1a;耗时200小时精选的「软件测试」资…

基于非洲秃鹫算法优化概率神经网络PNN的分类预测 - 附代码

基于非洲秃鹫算法优化概率神经网络PNN的分类预测 - 附代码 文章目录 基于非洲秃鹫算法优化概率神经网络PNN的分类预测 - 附代码1.PNN网络概述2.变压器故障诊街系统相关背景2.1 模型建立 3.基于非洲秃鹫优化的PNN网络5.测试结果6.参考文献7.Matlab代码 摘要&#xff1a;针对PNN神…

消息中间的应用场景

1、异步处理 比如用户在电商网站下单&#xff0c;下单完成后会给用户推送短信或邮件&#xff0c;发短信和邮件的过程就可以异步完成。因为下单付款是核心业务&#xff0c;发邮件和短信并不属于核心功能&#xff0c;并且可能耗时较长&#xff0c;所以针对这种业务场景可以选择先…

趣学python编程(六、关于蓝桥杯比赛)

蓝桥杯全国软件和信息技术专业人才大赛简称“蓝桥杯”&#xff0c;是由工业和信息化部人才交流中心举办的国内最大的信息技术竞赛。为促进中小学科技创新&#xff0c;提升中小学生逻辑思维&#xff0c;发现和培养面向未来的科技精英人才。 蓝桥杯介绍 蓝桥杯全国软件和信息技术…

Selenium安装WebDriver最新Chrome驱动(含116/117/118/119)

&#x1f4e2;专注于分享软件测试干货内容&#xff0c;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01;&#x1f4e2;交流讨论&#xff1a;欢迎加入我们一起学习&#xff01;&#x1f4e2;资源分享&#xff1a;耗时200小时精选的「软件测试」资…

贪吃蛇代码

一.准备 1.新建项目 2.放进照片 3.创建两个包放置图片类和入口类 二&#xff0c;游戏界面 package com.snake.view;import java.awt.Color; import java.awt.EventQueue; import java.awt.Font; import java.awt.Frame; import java.awt.Graphics; import java.awt.Image; i…

前缀和(c++,超详细,含二维)

前缀和与差分 当给定一段整数序列a1,a2,a3,a4,a5…an; 每次让我们求一段区间的和&#xff0c;正常做法是for循环遍历区间起始点到结束点&#xff0c;进行求和计算&#xff0c;但是当询问次数很多并且区间很长的时候 比如&#xff0c;10^5 个询问和10^6区间长度&#xff0c;相…

[JDK工具-2] javap 类文件解析工具-帮助理解class文件,了解Java编译器机制

文章目录 1. javap -version 版本信息2. javap -verbose 输出附加信息3. javap -l 显示行号和局部变量列表4. javap -c 对代码进行反汇编&#xff08;或叫反编译生成汇编代码&#xff0c;一般说反编译是生成java代码&#xff09;&#xff0c;分解方法代码&#xff0c;也就是显示…

电机应用开发-PID控制器参数整定

PID控制器参数整定 比例调节&#xff1a;调节作用快&#xff0c;系统一出现偏差&#xff0c;调节器立即将偏差放大输出。 积分调节&#xff1a;输出变化和输入偏差的积分成正比。输出不仅取决于偏差大小&#xff0c;还取决于偏差存在的时间。只要有偏差存在&#xff0c;尽管偏差…

【23真题】超难985!做完感觉没学过!

本套试卷难度分析&#xff1a;22年西北工业大学827考研真题&#xff0c;我也发布过&#xff0c;若有需要&#xff0c;戳这里自取&#xff01;本套试题内容有难度&#xff0c;题目考察全为大题&#xff0c;题目不多&#xff01;但是题目都很新颖&#xff0c;状态方程的题目考察较…

MySQL为什么选择了B+树

首先MySQL的数据**&#xff08;索引记录&#xff09;**是存在磁盘里的&#xff0c;磁盘读取非常慢&#xff0c;所以要尽可能减少磁盘操作&#xff0c;因此我们需要更好的利用索引。 首先索引按顺序排列了数据&#xff0c;那么很显然最好的查找方式是二分查找&#xff0c;数组自…

解决证书加密问题:OpenSSL与urllib3的兼容性与优化

在使用客户端证书进行加密通信时&#xff0c;用户可能会遇到一些问题。特别是当客户端证书被加密并需要密码保护时&#xff0c;OpenSSL会要求用户输入密码。这对于包含多个调用的大型会话来说并不方便&#xff0c;因为密码无法在连接的多个调用之间进行缓存和重复使用。用户希望…

改进YOLOv8:结合ConvNeXt V2骨干网络!使用MAE共同设计和扩展ConvNet

🗝️YOLOv8实战宝典--星级指南:从入门到精通,您不可错过的技巧   -- 聚焦于YOLO的 最新版本, 对颈部网络改进、添加局部注意力、增加检测头部,实测涨点 💡 深入浅出YOLOv8:我的专业笔记与技术总结   -- YOLOv8轻松上手, 适用技术小白,文章代码齐全,仅需 …

java桌面程序

目标之一是把打印导出的功能最终用java实现一套&#xff0c;首先选定javafx&#xff0c;因为idea默认创建工程就带的javafx&#xff0c;没找到swing。 创建工程&#xff0c;这里要选1.8&#xff0c;高版本jdk默认不带fx 实现主界面的代码 package sample;import javafx.app…

【DevOps】Git 图文详解(五):远程仓库

Git 图文详解&#xff08;五&#xff09;&#xff1a;远程仓库 1.远程用户登录1.1 &#x1f511; 远程用户登录&#xff1a;HTTS1.2 &#x1f511; 远程用户登录&#xff1a;SSH 2.远程仓库指令 &#x1f525;3.推送 push / 拉取 pull4.fetch 与 pull 有什么不同 &#xff1f; …

通过easyexcel实现数据导入功能

上一篇文章通过easyexcel导出数据到excel表格已经实现了简单的数据导出功能&#xff0c;这篇文章也介绍一下怎么通过easyexcel从excel表格中导入数据。 目录 一、前端代码 index.html index.js 二、后端代码 controller service SongServiceImpl 三、功能预览 四、后端…

Run Legends将健身运动游戏化,使用户保持健康并了解Web3游戏

最近&#xff0c;我们有机会采访Talofa Games的首席执行官兼创始人Jenny Xu&#xff0c;一起讨论游戏开发&#xff0c;Talofa Games是Run Legends这款健身游戏的开发工作室。她已经创作了超过一百款游戏&#xff0c;对于推动游戏的可能性并将她的创造力和叙事技巧带入她最喜爱的…

面试题-6

1.精灵图和base64的区别是什么&#xff1f; 精灵图:把多张小图整合到一张大图上,利用定位的一些属性把小图显示在页面上,当访问页面可以减少请求,提高加载速度 base64&#xff1a;传输8bit字节代码的编码方式,把原本二进制形式转为64个字符的单位&#xff0c;最后组成字符串 …