0 字
1 分钟
这是一篇凑数的文章(也是测试)
package com.yu.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.Random;
public class GameJFrame extends JFrame implements KeyListener, ActionListener {
//创建二维数组,用来存放图片的编号int[][] data = new int[4][4];//图片偏移量int offsetX = 83;int offsetY = 134;//空白方块在二维数组的位置int zeroX ;int zeroY ;//当前展示图片的路径String ImagePath = "image/animal/animal3/";//定义一个二维数组用来存储胜利时的坐标数据int[][] win = new int[][]{{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() {//初始化界面initJFrame();
//初始化菜单initJMenuBar();
//初始化数据(打乱图片)initData();
//初始化图片initImage();
//让界面显示this.setVisible(true);}
private void initData() {//定义一个数组,存放图片的编号int[] numbers = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};Random r = new Random();//打乱数组for (int i = 0; i < numbers.length; i++) {int index = r.nextInt(numbers.length);int temp = numbers[i];numbers[i] = numbers[index];numbers[index] = temp;}
//将打乱的数组赋值给二维数组for(int i = 0 ;i<numbers.length;i++){if(numbers[i] == 0) {zeroX = i/4;zeroY = i%4;}data[i/4][i%4] = numbers[i];}}
//初始化图片private void initImage() {//清空原本已经出现的图片this.getContentPane().removeAll();
//做胜利判断if(isWin()){//显示胜利图片JLabel winJlabel = new JLabel(new ImageIcon("image/win.png"));winJlabel.setBounds(203,283,197,73);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 jLabel = new JLabel(new ImageIcon(ImagePath+num+".jpg"));//指定图片的位置jLabel.setBounds(105*j+offsetX,105*i+offsetY,105,105);//给图片添加边框jLabel.setBorder(new BevelBorder(BevelBorder.RAISED));//斜面边框(RAISED这个常量的值是0)//把管理容器添加到界面当中this.getContentPane().add(jLabel);}}//细节:先加载的图片会在上方,后加载的图片会在下方,所以要把背景图片放在最下面//添加背景图片JLabel backGround = new JLabel(new ImageIcon("image/background.png"));backGround.setBounds(40, 40, 508, 560);this.getContentPane().add(backGround);
//刷新界面this.getContentPane().repaint();
}
private void initJMenuBar() {//创建菜单栏JMenuBar jMenuBar = new JMenuBar();//创建菜单选项JMenu fuctionJMenu = new JMenu("功能");JMenu aboutJMenu = new JMenu("关于");
//将每一个条目添加到菜单选项当中fuctionJMenu.add(replayItem);fuctionJMenu.add(reLoginItem);fuctionJMenu.add(closeItem);
aboutJMenu.add(accountItem);
//为每一个条目添加事件监听器replayItem.addActionListener(this);reLoginItem.addActionListener(this);closeItem.addActionListener(this);accountItem.addActionListener(this);
//将菜单选项添加到菜单栏jMenuBar.add(fuctionJMenu);jMenuBar.add(aboutJMenu);
//给整个界面设置菜单this.setJMenuBar(jMenuBar);}
private void initJFrame() {//设置界面的宽高this.setSize(603, 680);//设置界面标题this.setTitle("拼图游戏 v1.0");//设置界面置顶this.setAlwaysOnTop(true);//设置界面居中(窗口对于屏幕的位置)this.setLocationRelativeTo(null);//设置关闭模式(使其关闭窗口时停止)this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//取消对于组件的居中放置(只有取消了才会按照XY轴的方式添加组件)this.setLayout(null);
//给整个界面添加键盘监听器this.addKeyListener(this);
}
@Overridepublic void keyTyped(KeyEvent e) {
}
//按下不松时会调用这个方法@Overridepublic void keyPressed(KeyEvent e) {if(isWin()) return;
int code = e.getKeyCode();//A 65if(code == 65){//把界面中所有的图片删除this.getContentPane().removeAll();//加载完整图片JLabel all = new JLabel(new ImageIcon(ImagePath+"all.jpg"));all.setBounds(83, 134, 420, 420);this.getContentPane().add(all);//加载背景图片JLabel backGround = new JLabel(new ImageIcon("image/background.png"));backGround.setBounds(40, 40, 508, 560);this.getContentPane().add(backGround);//刷新界面this.getContentPane().repaint();}}
@Overridepublic void keyReleased(KeyEvent e) {//做胜利判断if(isWin()){return;}
//对上下左右键进行处理//左:37,上:38,右:39,下:40int code = e.getKeyCode();if(code == 37){//System.out.println("左");if(zeroY == 3) return;data[zeroX][zeroY]=data[zeroX][zeroY+1];data[zeroX][zeroY+1]=0;zeroY++;step++;initImage();}else if(code == 38){//System.out.println("上");if(zeroX == 3) return;//逻辑://把空白方块下方的图片往上移动//zeroX zeroY 空白方块的位置//zeroX+1 zeroY 空白方块下方的图片的位置//把空白方块下方的图片的编号赋值给空白方块data[zeroX][zeroY]=data[zeroX+1][zeroY];data[zeroX+1][zeroY]=0;zeroX++;step++;//刷新界面initImage();
}else if(code == 39){//System.out.println("右");if(zeroY == 0)return;data[zeroX][zeroY]=data[zeroX][zeroY-1];data[zeroX][zeroY-1]=0;zeroY--;step++;initImage();}else if(code == 40){//System.out.println("下");if(zeroX == 0)return;data[zeroX][zeroY]=data[zeroX-1][zeroY];data[zeroX-1][zeroY]=0;zeroX--;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();}}
//判断data数组是否和win数组相同public boolean isWin(){for(int i=0;i<4;i++){for(int j=0;j<4;j++){if(data[i][j]!=win[i][j]){return false;}}}return true;}
@Overridepublic 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("作者");//弹出作者信息框JDialog dialog = new JDialog(this,"作者信息");JLabel label = new JLabel(new ImageIcon("image/about.png"));label.setBounds(0,0,258,258);dialog.getContentPane().add(label);dialog.setSize(344,344);dialog.setAlwaysOnTop(true);dialog.setLocationRelativeTo(null);//弹窗不关闭则无法操作下面的界面dialog.setModal(true);//显示弹窗dialog.setVisible(true);}}} 分享
如果这篇文章对你有帮助,欢迎分享给更多人!
这是一篇凑数的文章(也是测试)
https://shiliuyinyu.github.io/posts/test02/ 部分信息可能已经过时
相关文章 智能推荐
1
这是一篇测试文章
其他 一篇测试文章,包含 DFS 全排列代码示例。
2
世界,您好!
其他 欢迎来到我的博客!这是第一篇默认文章。
3
小苯的数字折叠-牛客周赛106B
题解 牛客周赛106B题解,大数回文数字折叠,C++ 溢出后用 Java BigInteger 解决。
4
[实战] 零成本打造私人 AI 助手:Win11 + Docker 本地部署 Qwen2.5 + QQ 机器人全流程
学习记录 Win11 + WSL2 + Docker 本地部署 Qwen2.5-7b + NapCat + AstrBot,零成本打造 QQ AI 机器人。
5
牛客周赛116-D-小红的区间相交
题解 牛客周赛 Round 116 D 题解,判断多个区间是否两两相交。