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();
		}
		
	}

}

展示

相关推荐
量子炒饭大师2 分钟前
【C++入门】零域终端的虚空指针协议——【nullptr】还在为编译器给NULL匹配为int而头疼?nullptr给予你全新的字面量!
开发语言·c++·nullptr
edisao4 分钟前
一。星舰到底改变了什么?
大数据·开发语言·人工智能·科技·php
阿豪只会阿巴8 分钟前
【多喝热水系列】从零开始的ROS2之旅——Day10 话题的订阅与发布1:Python
开发语言·c++·python·ubuntu·ros2
Frank Castle32 分钟前
【C语言】详解C语言字节打包:运算符优先级、按位或与字节序那些坑
c语言·开发语言
kk哥889933 分钟前
分享一些学习JavaSE的经验和技巧
java·开发语言
橙露1 小时前
时间序列分析实战:用 Python 实现股票价格预测与风险评估
人工智能·python·机器学习
2501_940315261 小时前
【无标题】1.17给定一个数将其转换为任意一个进制数(用栈的方法)
开发语言·c++·算法
神云瑟瑟1 小时前
看langchain理解python中的链式调用
python·langchain·链式调用
栈与堆1 小时前
LeetCode 21 - 合并两个有序链表
java·数据结构·python·算法·leetcode·链表·rust
CCPC不拿奖不改名1 小时前
循环神经网络RNN:整数索引→稠密向量(嵌入层 / Embedding)详解
人工智能·python·rnn·深度学习·神经网络·自然语言处理·embedding