一.创建新项目
二.插入图片
三.游戏的主界面
1.代码
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<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++) {if(tempArr[i]== 0) {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 stubint 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<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) {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();}}
3.结果