package game.ui;
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.Objects;
import java.util.Random;
public class GameJFrame extends JFrame implements KeyListener,ActionListener{
//游戏主界面
//空白的位置
int x;
int y;
//存放图片数据
int[][] data=initData();
//存放移动步数
int count=0;
//存放图片路径
String path="img/langYY/";
//定义一个正确二维数组
int[][] win=new int[][]{
{1,2,3,4},
{5,6,7,8},
{9,10,11,12},
{13,14,15,0}
};
//创建菜单选项对象
JMenuItem replayItem=new JMenuItem("重新游戏");
JMenuItem closeItem=new JMenuItem("关闭游戏");
JMenuItem bx=new JMenuItem("白熊");
JMenuItem fw=new JMenuItem("废物猫");
JMenuItem gaa=new JMenuItem("美女与野兽");
JMenuItem lyy=new JMenuItem("懒洋洋");
JMenuItem accountItem=new JMenuItem("关于本游戏");
public GameJFrame(){
//无参构造,界面初始化
initJFrame();
//创建初始化菜单
initjmb();
//初始化图片
initImage();
System.out.println(x+" "+y);
this.setVisible(true); //显示界面
//给界面添加事件
this.addKeyListener(this);
}
//初始化图片
private void initImage() {
//清空图片
this.getContentPane().removeAll();
//胜利图片
if(victory()){
JLabel winjlb=new JLabel(new ImageIcon("img/Win/win.png"));
winjlb.setBounds(105,203,380,210);
this.getContentPane().add(winjlb);
}
//步数
JLabel stepCount=new JLabel("步数"+count);
stepCount.setBounds(50,30,100,20);
this.getContentPane().add(stepCount);
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 4; j++) {
//图片对象
ImageIcon icon = new ImageIcon(path+data[i][j]+".png");
//将图片对象添加进容器
JLabel jLabel=new JLabel(icon);
//设置图片位置
jLabel.setBounds(105*j+85,105*i+134,105,105);
//给图片加边框
jLabel.setBorder(new BevelBorder(0));
//将管理容器添加到界面中
this.getContentPane().add(jLabel);
}
}
this.getContentPane().repaint();
}
//初始化数据(打乱)
private int[][] initData() {
//创建一个0~15的一维数组
int[] tempArr=new int[16];
for (int i = 0; i < 16; i++) {
tempArr[i]=i;
}
//将一维数组里的值打乱
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;
}
//将打乱的一维数组存进二维数组中
int[][] data=new int[4][4];
for (int i = 0; i < tempArr.length; i++) {
if(tempArr[i]==0){
x=i/4;
y=i%4;
}else{
data[i/4][i%4]=tempArr[i];
}
}
return data;
}
//界面初始化
public void initJFrame(){
this.setSize(603,680); //设置宽高
this.setTitle("拼图 v1.0"); //界面标题
this.setAlwaysOnTop(true); //界面置顶
this.setLocationRelativeTo(null); //设置界面居中
this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); //设置关闭模式
//取消默认的居中位置
this.setLayout(null);
}
//菜单初始化
public void initjmb(){
JMenuBar jmb=new JMenuBar();
JMenu functionjm=new JMenu("功能");
JMenu aboutjm=new JMenu("关于本游戏");
JMenu changeimg= new JMenu("更换图片");
//将选项添加到功能菜单中
functionjm.add(replayItem);
functionjm.add(closeItem);
aboutjm.add(accountItem);
changeimg.add(bx);
changeimg.add(fw);
changeimg.add(lyy);
changeimg.add(gaa);
functionjm.add(changeimg);
//给选项绑定事件
replayItem.addActionListener(this);
closeItem.addActionListener(this);
accountItem.addActionListener(this);
bx.addActionListener(this);
fw.addActionListener(this);
lyy.addActionListener(this);
gaa.addActionListener(this);
//将两个菜单添加到菜单栏中
jmb.add(functionjm);
jmb.add(aboutjm);
this.setJMenuBar(jmb);
}
@Override
public void keyTyped(KeyEvent e) {
}
@Override
public void keyPressed(KeyEvent e) {
int code= e.getKeyCode();
if(code==18){
// 删除界面图片
this.getContentPane().removeAll();
//加载完整图片
JLabel all=new JLabel(new ImageIcon(path+"all.bmp"));
all.setBounds(83,134,420,420);
this.getContentPane().add(all);
//刷新
this.getContentPane().repaint();
}
}
//键盘按键绑定
@Override
public void keyReleased(KeyEvent e) {
//判断胜利并停止用户继续移动图片
if(victory()){
return;
}
int code=e.getKeyCode();
System.out.println(code);
if(code==87){
if(x==0){
return;
}
System.out.println("上");
data[x][y]=data[x-1][y];
data[x-1][y]=0;
x--;
count++;
initImage();
} else if (code==83) {
if(x==3){
return;
}
System.out.println("下");
data[x][y]=data[x+1][y];
data[x+1][y]=0;
x++;
count++;
initImage();
} else if (code==65) {
if(y==0){
return;
}
System.out.println("左");
data[x][y]=data[x][y-1];
data[x][y-1]=0;
y--;
count++;
initImage();
} else if (code==68) {
if(y==3){
return;
}
System.out.println("右");
data[x][y]=data[x][y+1];
data[x][y+1]=0;
y++;
count++;
initImage();
} else if (code==18) {
initImage();
} else if (code==74) {
data = new int[][]{
{1,2,3,4},
{5,6,7,8},
{9,10,11,12},
{13,14,15,0}
};
initImage();
}
}
//判断胜利方法
public boolean victory(){
for (int i = 0; i < data.length; i++) {
for (int j = 0; j < data.length; j++) {
if(data[i][j]!=win[i][j]){
return false;
}
}
}
return true;
}
//菜单选项功能方法
@Override
public void actionPerformed(ActionEvent e) {
Object obj= e.getSource