

- 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
- 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 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
- for(int j=0;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.结果
-
相关阅读:
餐饮外卖小程序商城的作用是什么
Python开发工具PyCharm全新版本V2022.2正式发布——支持 Python 3.11
Java 基于微信小程序的农产品自主供销小程序
关于Linux中批量配置SSH免密的一些笔记
RTE11- 中断解耦功能
记一次Golang Windows GUI 程序 添加UAC权限+exe图标+程序信息
SAP ABAP——数据类型(三)【TYPE-POOL和INCLUDE嵌套定义类型】
第15届台州学院校赛题解
百度爬虫的工作原理解析
JVM内存和垃圾回收-06.本地方法栈
-
原文地址:https://blog.csdn.net/2302_76534780/article/details/134520680