package com.itheima.ui;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
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,ActionListener{
//GameJFrame游戏的主界面
//4.创建二维数组,用来管理数据
int[][] data = new int[4][4];
int x=0;
int y=0;
//定义一个变量,展示图片路径
String path="images\\\\";
//定义一个二维数组
int[][] win = {
{1,2,3,4},
{5,6,7,8},
{9,10,11,12},
{13,14,15,0}
};
int step=0;
//创建选项下面的对象
JMenuItem replayItem = new JMenuItem("重新游戏");
JMenuItem reLoginItem = new JMenuItem("重新登入");
JMenuItem closeItem = new JMenuItem("关闭游戏");
JMenuItem accountItem = new JMenuItem("公众号");
public GameJFrame() {
//设置宽高
this.setSize(640, 700);
//设置界面的标题
this.setTitle("拼图单机版1.0");
//设置界面置顶
this.setAlwaysOnTop(true);
//设置界面居中
this.setLocationRelativeTo(null);
//设置关闭模式
this.setDefaultCloseOperation(3);
//取消默认中间放置
this.setLayout(null);
//监听事件
this.addKeyListener(this);
//初始化菜单
//创建菜单对象
JMenuBar jMenuBar = new JMenuBar();
//创建菜单上面的选项
JMenu functionJMenu = new JMenu("功能");
JMenu aboutJMenu = new JMenu("关于我们");
//将每一个选项下面的条目添加到选项当中
functionJMenu.add(replayItem);
functionJMenu.add(reLoginItem);
functionJMenu.add(closeItem);
aboutJMenu.add(accountItem);
//绑定事件
replayItem.addActionListener(this);
reLoginItem.addActionListener(this);
closeItem.addActionListener(this);
accountItem.addActionListener(this);
//将菜单里面的两个选项添加到菜单中
jMenuBar.add(functionJMenu);
jMenuBar.add(aboutJMenu);
//给整个界面设置菜单
this.setJMenuBar(jMenuBar);
//初始化数据
initData();
//初始化图片
initImage();
//显示
this.setVisible(true);
}
//初始化数据
private void initData() {
//1.定义一维数组
int[] tempArr = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
//2.打乱数组中的数据顺序
//遍历数组
Random r = new Random();
for(int i=0;i
int index = r.nextInt(tempArr.length);
//拿到遍历数组的数据,和随机交换
int temp = tempArr[i];
tempArr[i] = tempArr[index];
tempArr[index] = temp;
}
//遍历一维数组给二维数组
for(int i=0;i
x=i/4;
y=i%4;
}
data[i /4][i%4] = tempArr[i];
}
}
//初始化图片
//添加图片
private void initImage() {
//清空原本已经出现的所有图片
this.getContentPane().removeAll();
if(victory()) {
JLabel winJLabel = new JLabel(new ImageIcon("C:\\Users\\徐梦\\Desktop\\images\\s.png"));
winJLabel.setBounds(60, 59, 500, 500);
this.getContentPane().add(winJLabel);
}
JLabel stepCount =new JLabel("步数: " +step);
stepCount.setBounds(50, 30, 100, 20);
this.getContentPane().add(stepCount);
for(int i=0;i<4;i++) {
for(int j=0;j<4;j++) {
//获取当前图片的序号
int num=data[i][j];
JLabel jLabel = new JLabel(new ImageIcon(path+num+".gif"));
//创建一个图片JLabel对象(管理容器)
//指定图片位=位置
jLabel.setBounds(151 * j+10, 121 *i+110, 151, 121);
//添加边框0/1都可以
jLabel.setBorder(new BevelBorder(1));
//把管理容器添加到界面中
this.getContentPane().add(jLabel);
}
}
this.getContentPane().repaint();
}
@Override
public void keyTyped(KeyEvent e) {
// TODO Auto-generated method stub
}//按下不松时
@Override
public void keyPressed(KeyEvent e) {
// TODO Auto-generated method stub
int code = e.getKeyCode();
if(code == 65) {
//清空原本已经出现的所有图片
this.getContentPane().removeAll();
//加载完整图片
JLabel all = new JLabel(new ImageIcon("C:\\Users\\徐梦\\Desktop\\images\\all.png"));
all.setBounds(10, 110, 603, 485);
this.getContentPane().add(all);
//刷新界面
this.getContentPane().repaint();
}
}
@Override
public void keyReleased(KeyEvent e) {
//判断游戏是否胜利
if(victory()) {
return;
}
//对上下左右进行判断
int code = e.getKeyCode();
if(code == 37) {
System.out.println("向左");
if(y == 3) {
//表示空白方块已经在最下方了,不能在移动了
return;
}
//把空白方块下面的数字赋值给上面
data[x][y] = data[x ][y-1];
data[x][y-1]=0;
y++;
step++;
initImage();
}else if(code == 38) {
System.out.println("向上");
if(x == 3) {
//表示空白方块已经在最下方了,不能在移动了
return;
}
//把空白方块下面的数字赋值给上面
data[x][y] = data[x + 1][y];
data[x+1][y]=0;
x++;
step++;
initImage();
}else if(code == 39) {
System.out.println("向右");
if(y == 0) {
//表示空白方块已经在最下方了,不能在移动了
return;
}
//把空白方块下面的数字赋值给上面
data[x][y] = data[x ][y-1];
data[x][y-1]=0;
y--;
step++;
initImage();
}else if(code == 40) {
System.out.println("向下");
if(x == 0) {
//表示空白方块已经在最下方了,不能在移动了
return;
}
//把空白方块下面的数字赋值给上面
data[x][y] = data[x - 1][y];
data[x-1][y]=0;
x--;
step++;
initImage();
}else if(code == 65) {
initImage();
}else if(code == 87) {
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
return false;
}
}
}
return true;
}
@Override
public void actionPerformed(ActionEvent e) {
Object obj =e.getSource();
//判断
if(obj == replayItem) {
System.out.println("重新游戏");
step = 0;
initData();
initImage();
}else if(obj == reLoginItem) {
System.out.println("重新登入");
this.setVisible(false);
new LoginJFrame();
}else if(obj == closeItem) {
System.out.println("关闭游戏");
System.exit(0);
}else if(obj == accountItem) {
System.out.println("公众号");
}
}
}
2.程序的启动入口
package com.itheima.ui;
public class App {
public static void main(String[] args) {
// TODO Auto-generated method stub
//程序的启动入口
//想要开启谁的界面,就创建谁的对象
new GameJFrame();
}
}