拼图游游戏代码

一.创建新项目

二.插入图片

三.游戏的主界面

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.结果

 

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

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

相关文章

贪吃蛇代码

一.准备 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…

【Java程序员面试专栏 算法训练篇】二叉树高频面试算法题

一轮的算法训练完成后,对相关的题目有了一个初步理解了,接下来进行专题训练,以下这些题目就是二叉树相关汇总的高频题目 遍历二叉树 遍历二叉树,分为递归和迭代两种方式,递归类似于DFS,迭代类似于BFS,【算法训练-二叉树 一】【遍历二叉树】前序遍历、中序遍历、后续遍…

【高级程序设计】Week2-4Week3-1 JavaScript

一、Javascript 1. What is JS 定义A scripting language used for client-side web development.作用 an implementation of the ECMAScript standard defines the syntax/characteristics of the language and a basic set of commonly used objects such as Number, Date …

【Java 进阶篇】Ajax 实现——原生JS方式

大家好&#xff0c;欢迎来到这篇关于原生 JavaScript 中使用 Ajax 实现的博客&#xff01;在前端开发中&#xff0c;我们经常需要与服务器进行数据交互&#xff0c;而 Ajax&#xff08;Asynchronous JavaScript and XML&#xff09;是一种用于创建异步请求的技术&#xff0c;它…

多态语法详解

多态语法详解 一&#xff1a;概念1&#xff1a;多态实现条件 二:重写&#xff1a;三&#xff1a;向上转型和向下转型1:向上转型&#xff1a;1&#xff1a;直接赋值&#xff1a;2&#xff1a;方法传参3&#xff1a;返回值 2:向下转型 一&#xff1a;概念 1&#xff1a;同一个引…

Java值传递和引用传递

在Java中&#xff0c;有值传递&#xff08;Pass-by-Value&#xff09;和引用传递&#xff08;Pass-by-Reference&#xff09;两种参数传递方式。 值传递&#xff08;Pass-by-Value&#xff09;&#xff1a;当使用值传递方式时&#xff0c;方法将参数的副本传递给调用方法。这意…

Go 语言中的map和内存泄漏

map在内存中总是会增长&#xff1b;它不会收缩。因此&#xff0c;如果map导致了一些内存问题&#xff0c;你可以尝试不同的选项&#xff0c;比如强制 Go 重新创建map或使用指针。 在 Go 中使用map时&#xff0c;我们需要了解map增长和收缩的一些重要特性。让我们深入探讨这一点…

大型 APP 的性能优化思路

做客户端开发都基本都做过性能优化&#xff0c;比如提升自己所负责的业务的速度或流畅性&#xff0c;优化内存占用等等。但是大部分开发者所做的性能优化可能都是针对中小型 APP 的&#xff0c;大型 APP 的性能优化经验并不会太多&#xff0c;毕竟大型 APP 就只有那么几个&…

ESP32-BLE基础知识

一、存储模式 两种存储模式&#xff1a; 大端存储&#xff1a;低地址存高字节&#xff0c;如将0x1234存成[0x12,0x34]。小端存储&#xff1a;低地址存低字节&#xff0c;如将0x1234存成[0x34,0x12]。 一般来说&#xff0c;我们看到的一些字符串形式的数字都是大端存储形式&a…

【VRTK】【VR开发】【Unity】7-配置交互能力和向量追踪

【前情提要】 目前为止,我们虽然设定了手模型和动画,还能够正确根据输入触发动作,不过还未能与任何物体互动。要互动,需要给手部设定相应的Interactor能力。 【配置Interactor的抓取功能】 在Hierarchy中选中[VRTK_CAMERA_RIGS_SETUP] ➤ Camera Rigs, Tracked Alias ➤ …

MobaXterm配置ssh端口转发(tensorboard使用)

背景&#xff1a; 我有一台本地Windows电脑&#xff0c;上面安装了MobaXterm软件。 MobaXterm通过ssh连接了一台服务器&#xff08;默认是通过22端口连&#xff0c;我这里配了一下&#xff0c;要填别的&#xff09; 现在服务器在跑模型&#xff0c;其6006端口是tensorboard端口…

8、创建第一个鸿蒙页面并实现页面跳转

一、创建页面 1、新建页面 在项目的"pages"目录上右键&#xff0c;选择”新建“——”page" 2、录入页面的名称 在“Page name”中输入页面的名称&#xff0c;并点击“Finish”完成创建 3、以下为创建的新页面 2、注册页面 新建的页面会自动在“resources”…

ArkTS - HarmonyOS服务卡片(创建)

可以参考官网文档 其中我们在已有的文件中File > New > Service Widget创建你想要的小卡片 本文章发布时目前可使用的模板就三种 有卡片后的new 最终效果

pnpm : 无法加载文件 E:\Soft\PromSoft\nodejs\node_global\pnpm.ps1,

pnpm : 无法加载文件 E:\Soft\PromSoft\nodejs\node_global\pnpm.ps1&#xff0c;因为在此系统上禁止运行脚本。有关详细信息&#xff0c;请参阅 https:/go.microsoft.com/fwlink/?LinkID135170 中 的 about_Execution_Policies。 所在位置 行:1 字符: 1pnpm -v~~~~ CategoryI…

Kotlin学习之函数

原文链接 Understanding Kotlin Functions 函数对于编程语言来说是极其重要的一个组成部分&#xff0c;函数可以视为是程序的执行&#xff0c;是真正活的代码&#xff0c;为啥呢&#xff1f;因为运行的时候你必须要执行一个函数&#xff0c;一般从主函数入口&#xff0c;开始一…

《微信小程序开发从入门到实战》学习二十二

3.3 开发创建投票页面 3.3.10 使用switch开关组件 用switch开关组件增加一个设置是否匿名投票的功能。 switch常用属性如下&#xff1a; checked 开还是关&#xff0c;默认false关 disabled 是否禁用&#xff0c;默认false不禁用&#xff0…

应试教育导致学生迷信标准答案惯性导致思维僵化-移动机器人

移动机器人课程群实践创新的困境与突围 一、引言 随着科技的快速发展&#xff0c;工程教育变得越来越重要。然而&#xff0c;传统的应试教育模式往往侧重于理论知识的传授&#xff0c;忽视了学生的实践能力和创新精神的培养。这在移动机器人课程群的教学中表现得尤为明显。本文…

win10手机投屏到电脑的操作方法

工具/原料&#xff1a; 系统版本&#xff1a;iOS 15.3,HarmonyOS 2.0.0&#xff0c;windows10系统 品牌型号&#xff1a;iPhone 13,HUAWEI Mate 40 Pro&#xff0c;联想小新air14 方法/步骤&#xff1a;方法一&#xff1a;安卓手机使用无线投屏功能投屏到win10电脑 1、保持手…

sapjco3.dll has version “721.619“, but required is at least version “721.913“

context with path [] threw exception [org.glassfish.jersey.server.ContainerException: java.lang.ExceptionInInitializerError: Native library sapjco3 is too old. Found library C:\Windows\System32\sapjco3.dll has version “721.619”, but required is at least …

网络参考模型与标准协议(一)

OSI参考模型 OSI 模型(Open Systems Interconnection Model)&#xff0c;由国际化标准组织ISO (TheInternational Organization for Standardization )收录在ISO 7489标准中并于1984年发布。 OSI参考模型又被称为七层模型&#xff0c;由下至上依次为: 物理层: 在设备之间传输比…