启动类
package com.yx.ui;
public class App {
//启动入口
public static void main(String[] args) {
//如果想要开启一个界面,就创建谁的对象
// new DengJFrame();
// new ZCJFrame();
new GameJFrame();
}
}
游戏类
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();
}
}
}
展示