主方法
package Demo.youxi;
public class Text {
public static void main(String[] args) {
//MainFrame mainFrame = new MainFrame();
new MainFrame();
}
}
实现类
package Demo.youxi;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.util.Random;
public class MainFrame extends JFrame implements KeyListener {
static int[][] data = {
{1,2,3,4},
{5,6,7,8},
{9,10,11,12},
{13,14,15,0}
};
static int[][] win = {
{1,2,3,4},
{5,6,7,8},
{9,10,11,12},
{13,14,15,0}
};
int count;
int X;
int Y;
public MainFrame() {
//设置键盘监听
addKeyListener(this);
//初始化
initFrame();
//打乱数组
RandomVim();
//添加图片
showFrame();
//设置窗体可见
setVisible(true);
}
/**
* 设置窗体初始化*/
public void initFrame(){
setSize(514,595);
setTitle("石头迷阵V1.0");
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
setLayout(null);
setAlwaysOnTop(true);
setLocationRelativeTo(null);
}
/**
* 添加图片*/
public void showFrame(){
//移除面板所有组件
this.getContentPane().removeAll();
if (ver()){
JLabel win = new JLabel(new ImageIcon("E:\\IDE\\Advanced-codes\\Advanced-codes\\day01-code\\src\\Demo\\youxi\\imag\\win.png"));
win.setBounds(124,230,266,88);
getContentPane().add(win);
}
//添加步数
JLabel text = new JLabel("步数为"+count);
text.setBounds(50,20,100,20);
getContentPane().add(text);
//创建重新游戏按钮
JButton cont = new JButton("重新游戏");
cont.setBounds(350,20,100,20);
getContentPane().add(cont);
cont.setFocusable(false);
cont.addActionListener(actionEvent -> {
count=0;
initFrame();
RandomVim();
showFrame();
});
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 4; j++) {
JLabel image = new JLabel(new ImageIcon("E:\\IDE\\Advanced-codes\\Advanced-codes\\day01-code\\src\\Demo\\youxi\\imag\\"+data[i][j]+".png"));
image.setBounds(50+100*j,90+100*i,100,100);
getContentPane().add(image);
}
}
JLabel background = new JLabel(new ImageIcon("E:\\IDE\\Advanced-codes\\Advanced-codes\\day01-code\\src\\Demo\\youxi\\imag\\background.png"));
background.setBounds(26,30,450,484);
getContentPane().add(background);
//通知面板做一次刷新
this.getContentPane().repaint();
}
/**
*打乱数组*/
public void RandomVim(){
Random r= new Random();
for (int i = 0; i < data.length; i++) {
for (int j = 0; j < data[i].length; j++) {
int RandomVimX = r.nextInt(4);
int RandomVimY = r.nextInt(4);
int temp = data[i][j];
data[i][j] = data[RandomVimX][RandomVimY];
data[RandomVimX][RandomVimY] = temp;
}
}
for (int i = 0; i < data.length; i++) {
for (int j = 0; j < data[i].length; j++) {
if (data[i][j]==0){
X = i;
Y = j;
}
}
}
}
@Override
public void keyTyped(KeyEvent keyEvent) {
}
@Override
public void keyReleased(KeyEvent keyEvent) {
}
/**
* 移动*/
@Override
public void keyPressed(KeyEvent e) {
int keyCode = e.getKeyCode();
move(keyCode);
showFrame();
}
/**
* 判断游戏是否胜利*/
public boolean ver(){
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;
}
/**
* 键盘监听*/
private void move(int keyCode) {
if (ver()){
return;
}
if (keyCode == 37){
if (Y==3){
return;
}
int temp = data[X][Y];
data[X][Y] = data[X][Y+1];
data[X][Y+1] = temp;
Y++;
count++;
} else if (keyCode == 38) {
if (X==3){
return;
}
int temp = data[X][Y];
data[X][Y] = data[X+1][Y];
data[X+1][Y] = temp;
X++;
count++;
} else if (keyCode == 39) {
if (Y==0){
return;
}
int temp = data[X][Y];
data[X][Y] = data[X][Y-1];
data[X][Y-1] = temp;
Y--;
count++;
} else if (keyCode == 40) {
if (X==0){
return;
}
int temp = data[X][Y];
data[X][Y] = data[X-1][Y];
data[X-1][Y] = temp;
X--;
count++;
} else if (keyCode == 90) {
data = new int[][]{
{1,2,3,4},
{5,6,7,8},
{9,10,11,12},
{13,14,15,0}
};
}
}
}