java拼图游戏(待优化)

启动类

java 复制代码
package com.yx.ui;

public class App {
//启动入口
	public static void main(String[] args) {
		//如果想要开启一个界面,就创建谁的对象
//	new DengJFrame();	
//	new ZCJFrame();
	new GameJFrame();
	}

}

游戏类

java 复制代码
package com.yx.ui;

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{
		//创建二维数组
		int[][]date=new int[4][4];
		//记录空白方块的位置
		int x=0;
		int y=0;
		//游戏界面,所有跟游戏有关的代码
	public GameJFrame() {
		//初始化界面
		jmian();
		
		//初始化菜单
		caidan();
		
		//初始化数据
		daluan();
		
		//初始化图片
		tupian();
		
		//展示出来
		this.setVisible(true);
		
	}
	
	//初始化数据(打乱)
	private void daluan() {
		//需求:
		//把一个一维数组中的数据: 0~15 打乱顺序
		//然后再按照4个一组的方式添加到二维数组当中
		
		//定义一个一维数组
		int[]temp= {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
		//打乱数组中的数据的顺序
		//遍历数组,得到每一个元素,拿着每一个元素跟随机索引上的数据进行交换
		Random r=new Random();
		for(int i=0;i<temp.length;i++) {
			//获取随机索引
		int x=r.nextInt(temp.length);
		//交换数据
		int temp1=temp[i];
		temp[i]=temp[x];
		temp[x]=temp1;
		}
		//给二维数组添加数据
		//遍历一维数组temp得到每个元素,将每个元素添加到二维数组中
		//i=0		0  0
		//i=1		0  1
		//i=2		0  2.....
		for(int i=0;i<temp.length;i++) {
			if(temp[i]==0) {
				x=i/4;
				y=i%4;
			}else {
				date[i/4][i%4]=temp[i];
			}
			
		}
	}
	//初始化图片
	
	private void tupian() {
		
	//清空图片
		this.getContentPane().removeAll();
		
		
	//先加载的图片在上方
		
		//把内循环执行4次
		for(int i=0;i<4;i++) {
			//一行添加4张图片
			for(int j=0;j<4;j++) {
				//获取图片序号
				int num=date[i][j];
				//创建JLabel对象(管理容器)
				JLabel jLabel=new JLabel(new ImageIcon("image/animal/animal3/"+num+".jpg"));
			//指定图片位置
				jLabel.setBounds(105*j+83, 105*i+134, 105, 105);
				//给图片添加边框
				jLabel.setBorder(new BevelBorder(1));
				//0让图片凸起来,1让图片凹下去
			//将管理容器添加到容器内
			this.getContentPane().add(jLabel);
			
			}
			
		}

		//添加背景
		
		JLabel ba=new JLabel(new ImageIcon("image/background.png"));
		ba.setBounds(40, 40, 508, 560);
		this.getContentPane().add(ba);
		
		//刷新界面
		this.getContentPane().repaint();
		
		
}
	private void caidan() {
		//创建菜单对象
		JMenuBar cdan=new JMenuBar();
		//创建菜单上面两个选项对象(功能  关于我们)
		JMenu gn=new JMenu("功能");
		JMenu gywm=new JMenu("关于我们");
		//创建选项下面的条目对象
		JMenuItem cxyx=new JMenuItem("重新游戏");
		JMenuItem cxdr=new JMenuItem("重新登入");
		JMenuItem gbyx=new JMenuItem("关闭游戏");
		
		JMenuItem gzh=new JMenuItem("公众号");
		//将每一个选项下面的条目添加到选项中
		gn.add(cxyx);
		gn.add(cxdr);
		gn.add(gbyx);
		
		gywm.add(gzh);
		//将菜单里面的两个选项添加到菜单当中
		cdan.add(gn);
		cdan.add(gywm);
		
		//给整个界面设置菜单
		this.setJMenuBar(cdan);
	}
	private void jmian() {
		//设置窗体的宽高
		this.setSize(603,680);
		//标题
		this.setTitle("拼图游戏");
		//置顶
		this.setAlwaysOnTop(true);
		//居中
		this.setLocationRelativeTo(null);
		//关闭模式
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		//取消默认的居中放置
		this.setLayout(null);
		//添加键盘事件
		this.addKeyListener(this);
	}
	public static void main(String[] args) {
		
		
	}
	@Override
	public void keyTyped(KeyEvent e) {
		// TODO Auto-generated method stub
		
	}
	@Override
	public void keyPressed(KeyEvent e) {
		// TODO Auto-generated method stub
		
	}
	@Override
	public void keyReleased(KeyEvent e) {
		//上下左右进行判断
		int code=e.getKeyCode();
		if(code==38) {
		System.out.println("向上移动");
		if(x==3) {
			//表示空白方块已经在最下方了,他的下面没有图片在能移动了
			return;
		}
		
		
		//把空白方块下方的数字往上移动
		//x,y 表示空白方块
		//x+1,y表示空白方块的数字
		date[x][y]=date[x+1][y];
		date[x+1][y]=0;
		x++;
		tupian();
		
		
		
		
		}else if(code==40) {
			System.out.println("向下移动");
			if(x==0) {
				return;
			}
			//把空白方块上方的数字往下移动
			date[x][y]=date[x-1][y];
			date[x-1][y]=0;
			x--;
			tupian();
		}else if(code==37) {
			//把空白方块右方的数字往下移动
			System.out.println("向左移动");
			if(y==3) {
				return;
			}
			date[x][y]=date[x][y+1];
			date[x][y+1]=0;
			y++;
			tupian();
		}else if(code==39) {
			//把空白方块左方的数字往下移动
			System.out.println("向右移动");
			if(y==0) {
				return;
			}
			date[x][y]=date[x][y-1];
			date[x][y-1]=0;
			y--;
			tupian();
		}
		
	}

}

展示

相关推荐
奇树谦1 小时前
QT|windwos桌面端应用程序开发,当连接多个显示器的时候,如何获取屏幕编号?
开发语言·qt
weixin_307779131 小时前
VS Code配置MinGW64编译GNU 科学库 (GSL)
开发语言·c++·vscode·算法
学行库小秘1 小时前
ANN神经网络回归预测模型
人工智能·python·深度学习·神经网络·算法·机器学习·回归
froginwe111 小时前
HTML 框架:构建网页布局的基石
开发语言
Yn3122 小时前
在 Python 中使用 json 模块的完整指南
开发语言·python·json
秋难降2 小时前
线段树的深度解析(最长递增子序列类解题步骤)
数据结构·python·算法
猿榜2 小时前
Python基础-控制结构
python
Ratten2 小时前
【Python 实战】---- 实现一个可选择、配置操作的批量文件上传工具(三)上传类的实现
python
binqian2 小时前
【异步】js中异步的实现方式 async await /Promise / Generator
开发语言·前端·javascript
林开落L3 小时前
库制作与原理(下)
linux·开发语言·centos·库制作与原理