package Game;
import javax.swing.*;
import javax.swing.border.BevelBorder;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.Random;
public class GameJFrame extends JFrame implements KeyListener, ActionListener {
//定义二维数组,管理数据
int[][] data = new int[4][4];
//记录x,y变量空白方块在二维数组中的位置
int x = 0, y = 0;
int[][] win = {
{1, 2, 3, 4},
{5, 6, 7, 8},
{9, 10, 11, 12},
{13, 14, 15, 0}
};
//定义步数
int step = 0;
String path = "..\\Pingping\\image\\lanlan\\lanlan1\\";
//创建菜单上的两个选项对象
JMenuItem replayItem = new JMenuItem("重新开始");
JMenuItem reLoginItem = new JMenuItem("重新登录");
JMenuItem closeItem = new JMenuItem("关闭游戏");
JMenuItem accountItem = new JMenuItem("公众号");
JMenuItem sport = new JMenuItem("运动");
JMenuItem animal = new JMenuItem("动物");
JMenuItem lanlan = new JMenuItem("懒洋洋");
public GameJFrame() {
//初始化界面
initJrame();
//初始化菜单
initJrameBar();
//打乱图片
randomImage();
//初始化图片
initJrameImage();
//页面展示
this.setVisible(true);
}
private void randomImage() {
//打乱一维数组
int[] tempArr = {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 < 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++) {
System.out.print(tempArr[i] + " ");
}
//将数据添加至二维数组中
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 initJrameImage() {
//删除已经出现的所有图片
this.getContentPane().removeAll();
if (victory()) {
JLabel winJLabel = new JLabel(new ImageIcon("D:\\person_code\\code\\Pingping\\image\\win.png"));
winJLabel.setBounds(203, 283, 197, 73);
this.getContentPane().add(winJLabel);
}
JLabel stepCount = new JLabel("步数" + step);
stepCount.setBounds(50, 30, 100, 20);
this.getContentPane().add(stepCount);
//添加图片
for (int j = 0; j < 4; j++) {
for (int i = 0; i < 4; i++) {
int num = data[j][i];
//创建一个JLabel的对象(管理容器)
JLabel label = new JLabel(new ImageIcon(path + num + ".jpg"));
//指定图片位置
label.setBounds(105 * i + 83, 105 * j + 134, 105, 105);
//设置边框
//括号里面0表示让图片凸起来
//1表示让图片凹下去
label.setBorder(new BevelBorder(0));
this.getContentPane().add(label);
}
}
//添加背景图片
JLabel background = new JLabel(new ImageIcon("..\\Pingping\\image\\background.png"));
background.setBounds(40, 40, 508, 560);
this.getContentPane().add(background);
//刷新页面
this.getContentPane().repaint();
}
private void initJrameBar() {
JMenuBar jMenuBar = new JMenuBar();
JMenu functionMenu = new JMenu("功能");
JMenu aboutMenu = new JMenu("关于我们");
JMenu changeMenu = new JMenu("更换图片");
//将每一个二级选项添加到一级选项当中
functionMenu.add(changeMenu);
functionMenu.add(replayItem);
functionMenu.add(reLoginItem);
functionMenu.add(closeItem);
aboutMenu.add(accountItem);
//添加更换图片选项
changeMenu.add(sport);
changeMenu.add(animal);
changeMenu.add(lanlan);
//给每一个菜单添加监听事件
replayItem.addActionListener(this);
reLoginItem.addActionListener(this);
closeItem.addActionListener(this);
accountItem.addActionListener(this);
sport.addActionListener(this);
animal.addActionListener(this);
lanlan.addActionListener(this);
//将菜单添加到菜单栏中
jMenuBar.add(functionMenu);
jMenuBar.add(aboutMenu);
//给整个页面设置菜单
this.setJMenuBar(jMenuBar);
}
private void initJrame() {
//设置宽高以及视图的显示
this.setSize(603, 680);
this.setVisible(true);
//设置标题,居中,置顶,关闭模式
this.setTitle("勤劳的土拨代码鼠做的拼拼小游戏");
this.setLocationRelativeTo(null);
this.setAlwaysOnTop(true);
this.setDefaultCloseOperation(3);
//取消默认的居中放置
this.setLayout(null);
//给整个页面添加监听事件
this.addKeyListener(this);
}
@Override
public void keyTyped(KeyEvent e) {
}
@Override
public void keyPressed(KeyEvent e) {
int code = e.getKeyCode();
if (code == 65) {
this.getContentPane().removeAll();
JLabel alllabel = new JLabel(new ImageIcon(path + "all.jpg"));
//指定图片位置
alllabel.setBounds(83, 134, 420, 420);
//设置边框
//括号里面0表示让图片凸起来
//1表示让图片凹下去
alllabel.setBorder(new BevelBorder(0));
this.getContentPane().add(alllabel);
JLabel background = new JLabel(new ImageIcon("..\\Pingping\\image\\background.png"));
background.setBounds(40, 40, 508, 560);
this.getContentPane().add(background);
//刷新页面
this.getContentPane().repaint();
}
}
@Override
public void keyReleased(KeyEvent e) {
//游戏胜利之后重开
if (victory()) {
return;
}
int code = e.getKeyCode();
if (code == 37 && y <= 2) {
System.out.println("右");
data[x][y] = data[x][y + 1];
data[x][y + 1] = 0;
y++;
step++;
initJrameImage();
} else if (code == 38 && x <= 2) {
System.out.println("上");
//逻辑空白方块下方的数字往上移动
//x,y 表示空白方块
//x+1, y表示空白方块下方的数字
data[x][y] = data[x + 1][y];
data[x + 1][y] = 0;
x++;
step++;
initJrameImage();
//更新图片
} else if (code == 39 && y > 0) {
System.out.println("左");
data[x][y] = data[x][y - 1];
data[x][y - 1] = 0;
y--;
step++;
initJrameImage();
} else if (code == 40 && x > 0) {
System.out.println("下");
data[x][y] = data[x - 1][y];
data[x - 1][y] = 0;
x--;
step++;
initJrameImage();
} else if (code == 65) {
initJrameImage();
} else if (code == 87) {
data = new int[][]{
{1, 2, 3, 4},
{5, 6, 7, 8},
{9, 10, 11, 12},
{13, 14, 15, 0}
};
initJrameImage();
}
}
//判断胜利标志
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) {
//计步器为0
step = 0;
//初始化数据
randomImage();
//打乱图片
initJrameImage();
} else if (obj == reLoginItem) {
this.setVisible(false);
new LoginJFrame();
} else if (obj == closeItem) {
System.exit(0);
} else if (obj == accountItem) {
//创建弹框对象
JDialog jDialog = new JDialog();
//创建一个管理图片的容器对象
JLabel jLabel = new JLabel(new ImageIcon("..\\Pingping\\image\\about.jpg"));
//设置位置与宽高
jLabel.setBounds(0, 0, 258, 258);
//把图片添加到弹框中
jDialog.getContentPane().add(jLabel);
//设置弹框大小
jDialog.setSize(500, 500);
//置顶
jDialog.setAlwaysOnTop(true);
//居中
jDialog.setLocationRelativeTo(null);
//弹框不关闭无法操作界面
jDialog.setModal(true);
//显示弹框
jDialog.setVisible(true);
} else if (obj == sport) {
//计步器为0
step = 0;
//初始化数据
randomImage();
Random r = new Random();
int number = r.nextInt(10) + 1;
path = "..\\Pingping\\image\\sport\\sport" + number + "\\";
initJrameImage();
} else if (obj == animal) {
//计步器为0
step = 0;
//初始化数据
randomImage();
Random r = new Random();
int number = r.nextInt(8) + 1;
path = "..\\Pingping\\image\\animal\\animal" + number + "\\";
initJrameImage();
} else if (obj == lanlan) {
//计步器为0
step = 0;
//初始化数据
randomImage();
Random r = new Random();
int number = r.nextInt(2) + 1;
path = "..\\Pingping\\image\\lanlan\\lanlan" + number + "\\";
initJrameImage();
}
}
}
实现效果如图 ,有多种模式可以选择。学会了打包,将游戏已经打包成exe文件,可以直接安装。需要安装包的文末自取。
英文状态下按w可以看到大图,按A可以直接通关。