图形化界面GUI
GUI:Graphical User Interface(图像用户接口),指采用图形化的方式显示操作界面
两套体系:AWT包中和Swing包中
组件
JFrame:最外层的窗体
JMenuBar:最上层菜单
JLaber:管理文字和图片的容器
ImageIcon:图片
事件
可以被组件识别的操作
代码游戏界面
package cn.puzzlegame.ui;
import javax.swing.*;
import javax.swing.border.BevelBorder;
import javax.swing.border.Border;
import java.awt.*;
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 {
//创建二维数组用以管理数据
int[][]date=new int[4][4];
//定义变量,用来记录图片路径
String path="C:\\Users\\33376\\IdeaProjects\\PuzzleGame\\素材\\image\\girl\\girl1\\";
//定义一个储存正确的数组
int[][]win=new int[][]{
{1,2,3,4},
{5,6,7,8},
{9,10,11,12},
{13,14,15,0}
};
public GameJFrame(){
//创建主界面
creatGameJFrame();
//创建菜单
creatJmenuBar();
//初始化数据(打乱)
creatdate();
//初始化图片
createImage();
//打开界面
setVisible(true);
}
//记录空白块位置
int x=0;
int y=0;
//记录步数
int step=0;
private void creatdate() {
//创建数组
int[]tem={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< tem.length;i++){
int index=r.nextInt(tem.length);
int temp=tem[i];
tem[i]=tem[index];
tem[index]=temp;
}
//添加到二维数组中
for (int i = 0; i<tem.length;i++) {
if(tem[i]==0){
x=i/4;
y=i%4;
}else {
date[i/4][i%4]=tem[i];}
}
}
//初始化图片
private void createImage() {
//清空
this.getContentPane().removeAll();
//判断是否成功
if (victory()){
JLabel winJLabel=new JLabel(new ImageIcon("C:\\Users\\33376\\IdeaProjects\\PuzzleGame\\素材\\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++){
//创建ImageIcon对象
//ImageIcon icon=new ImageIcon("C:\\Users\\33376\\IdeaProjects\\PuzzleGame\\素材\\image\\girl\\girl1\\1.jpg");
//创建JLaber对象
//JLabel jLabel=new JLabel(icon);
//合并
int number=date[i][j];
JLabel jLabel=new JLabel(new ImageIcon(path+number+".jpg"));
//指定图片位置+38+134使图片整体位于中间
jLabel.setBounds(105*j+83,105*i+134,105,105);
//添加边框BevelBorder 0凸起 1凹陷
jLabel.setBorder(new BevelBorder(BevelBorder.LOWERED));
//添加到界面
getContentPane().add(jLabel);
}
}
//背景图片
JLabel background=new JLabel(new ImageIcon("C:\\Users\\33376\\IdeaProjects\\PuzzleGame\\素材\\image\\background.png"));
//设置背景图片位置
background.setBounds(40,40,508,560);
getContentPane().add(background);
//刷新界面
this.getContentPane().repaint();
//创建ImageIcon对象
//ImageIcon icon=new ImageIcon("C:\\Users\\33376\\IdeaProjects\\PuzzleGame\\素材\\image\\girl\\girl1\\1.jpg");
//创建JLaber对象
//JLabel jLabel=new JLabel(icon);
//合并
//JLabel jLabel=new JLabel(new ImageIcon("C:\\Users\\33376\\IdeaProjects\\PuzzleGame\\素材\\image\\girl\\girl1\\1.jpg"));
//指定图片位置
//jLabel.setBounds(0,0,105,105);
//添加到界面
//getContentPane().add(jLabel);
}
//创建菜单
private void creatJmenuBar() {
//初始化菜单
JMenuBar jMenuBar=new JMenuBar();
//主菜单
JMenu functionJmenu=new JMenu("功能");
JMenu ahoutJmenu=new JMenu("关于我们");
JMenu rewardJmenu=new JMenu("打赏");
//菜单下选项
JMenuItem replayItem=new JMenuItem("重新游戏");
JMenuItem reLoginItem=new JMenuItem("重新登录");
JMenuItem chagepictureItem=new JMenuItem("更换图片");
JMenuItem closeItem=new JMenuItem("关闭游戏");
JMenuItem wechatItem=new JMenuItem("微信号");
JMenuItem PaymentItem=new JMenuItem("收款码");
//给条目绑定事件
replayItem.addActionListener(this);
reLoginItem.addActionListener(this);
chagepictureItem.addActionListener(this);
closeItem.addActionListener(this);
//添加
jMenuBar.add(functionJmenu);
jMenuBar.add(ahoutJmenu);
jMenuBar.add(rewardJmenu);
functionJmenu.add(replayItem);
functionJmenu.add(reLoginItem);
functionJmenu.add(chagepictureItem);
functionJmenu.add(closeItem);
ahoutJmenu.add(wechatItem);
rewardJmenu.add(PaymentItem);
setJMenuBar(jMenuBar);
}
//创建游戏窗口
private void creatGameJFrame() {
//设置页面大小
setSize(603,680);
//设置标题
setTitle("拼图游戏1.0");
//设置页面置顶
setAlwaysOnTop(true);
//设置居中
setLocationRelativeTo(null);
//设置关闭
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
//取消默认居中
setLayout(null);
//整个界面添加键盘监听事件
this.addKeyListener(this);
}
@Override
public void keyTyped(KeyEvent e) {
}
//按下不松手调用
@Override
public void keyPressed(KeyEvent e) {
int code=e.getKeyCode();
if(code==65){
//按a显示完整图片
//清空界面图片
getContentPane().removeAll();
//加载完整图片
JLabel all=new JLabel(new ImageIcon(path+"all.jpg"));
//设置 all大小,添加图片
all.setBounds(83,134,420,420);
getContentPane().add(all);
//添加背景图片
JLabel background=new JLabel(new ImageIcon("C:\\Users\\33376\\IdeaProjects\\PuzzleGame\\素材\\image\\background.png"));
//设置背景图片位置
background.setBounds(40,40,508,560);
getContentPane().add(background);
//刷新
this.getContentPane().repaint();
}
}
@Override
public void keyReleased(KeyEvent e) {
//判断游戏是否胜利
if(victory()){return;}
//判断上下左右
int code =e.getKeyCode();
//左37,右39,上38,下40,a65,w87
if(code==37){
if(y==3){return;}
date[x][y]=date[x][y+1];
date[x][y+1]=0;
y++;
step++;
createImage();
} else if (code==38) {
if(x==3){return;}
date[x][y]=date[x+1][y];
date[x+1][y]=0;
x++;
step++;
createImage();
} else if (code==39) {
if(y==0){return;}
date[x][y]=date[x][y-1];
date[x][y-1]=0;
y--;
step++;
createImage();
}else if(code==40){
if(x==0){return;}
date[x][y]=date[x-1][y];
date[x-1][y]=0;
x--;
step++;
createImage();
} else if (code==65) {
createImage();
} else if (code==87) {
//创建新二维数组,一键通过
date=new int[][]{
{1,2,3,4},
{5,6,7,8},
{9,10,11,12},
{13,14,15,0}
};
createImage();
}
}
//判断是否与win数组数据相同
public boolean victory(){
for(int i=0;i< 4;i++){
for (int j=0;j< 4;j++){
if(date[i][j]!=win[i][j])
//一个不同即失败
{return false;}
}
}
return true;
}
}
效果: