1.游戏的主界面
package Game.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[][] date = new int[3][3];
//记录空白方块在二维数组中的位置
int x = 0;
int y = 0;
//定义一个新变量
String path = "C:\\Users\\86157\\Desktop\\Game\\image\\bate\\";
//定义一个二维数组,储存正确结果
int[][] win = {
{1, 2, 3},
{4, 5, 6},
{7, 8, 0}
};
//定义变量用来统计步数
int step=0;
//创建选项下面的菜单条目对象
JMenuItem replayItem=new JMenuItem("重新游戏");
JMenuItem reLoginItem=new JMenuItem("重新登录");
JMenuItem closeItem=new JMenuItem("关闭游戏");
JMenuItem accountItem=new JMenuItem("打赏");
//游戏相关
public GameJFrame() {
//初始化
initJFrame();
//初始化菜单
initjMenuBar();
//初始化数据(打乱)
initDate();
//初始化图片
initImage();
//页面显示
setVisible(true);
}
//初始化数据(打乱)
private void initDate() {
//定义一个一维数组
int[] tempArr = {0, 1, 2, 3, 4, 5, 6, 7, 8};
//打乱数组中数据的顺序
Random r = new Random();
for (int i = 0; i < tempArr.length; i++) {
//获取随机索引
int intdex = r.nextInt(tempArr.length);
//用遍历的数据和索引交换
int temp = tempArr[i];
tempArr[i] = tempArr[intdex];
tempArr[intdex] = temp;
}
//给二维数组添加数据
for (int i = 0; i < tempArr.length; i++) {
if (tempArr[i] == 0) {
x = i / 3;
y = i % 3;
}
date[i / 3][i % 3] = tempArr[i];
}
}
//初始化图片
private void initImage() {
//清空已有的图片
this.getContentPane().removeAll();
if (victory()) {
//显示胜利的图标
JLabel winJLabel = new JLabel(new ImageIcon("C:\\Users\\86157\\Desktop\\Game\\image\\win.png"));
winJLabel.setBounds(380, 330, 219, 234);
this.getContentPane().add(winJLabel);
}
JLabel stepcount=new JLabel("步数:"+step);
stepcount.setBounds(80,100,100,30);
this.getContentPane().add(stepcount);
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
//获取当前要加载的图片序号
int num = date[i][j];
//创建一个JLabel的对象
JLabel jLabel = new JLabel(new ImageIcon(path + num + ".png"));
//指定图片位置
jLabel.setBounds(124 * j + 300, 130 * i + 235, 124, 130);
//给图片添加边框
jLabel.setBorder(new BevelBorder(BevelBorder.RAISED));
//将icon添加到界面中
this.getContentPane().add(jLabel);
//表示图片的自增
}
}
//添加图片
JLabel background = new JLabel(new ImageIcon("C:\\Users\\86157\\Desktop\\Game\\image\\kuang.png"));
//设置位置大小
background.setBounds(90, 0, 800, 900);
//把背景添加到界面中
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() {
//设计宽高
setSize(908, 780);
//设置页面标题
setTitle("拼图游戏");
//设置页面置顶
setAlwaysOnTop(true);
//设置页面居中
setLocationRelativeTo(null);
//设置页面关闭
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
//设置取消居中,取消才会按照xy形式
this.setLayout(null);
//给整个界面加键盘监听器
this.addKeyListener(this);
}
@Override
public void keyTyped(KeyEvent e) {
}
@Override
//按下不松调用
public void keyPressed(KeyEvent e) {
int code = e.getKeyCode();
if (code == 65) {
//删除所有图片
this.getContentPane().removeAll();
//加载完整图片
JLabel all = new JLabel(new ImageIcon(path + "bate (all).png"));
all.setBounds(303, 235, 372, 390);
this.getContentPane().add(all);
//加载背景图片
JLabel background = new JLabel(new ImageIcon("C:\\Users\\86157\\Desktop\\Game\\image\\kuang.png"));
//设置位置大小
background.setBounds(90, 0, 800, 900);
//给图片添加边框
all.setBorder(new BevelBorder(BevelBorder.RAISED));
//把背景添加到界面中
this.getContentPane().add(background);
//刷新界面
this.getContentPane().repaint();
}
}
@Override
public void keyReleased(KeyEvent e) {
//判断游戏胜利
if (victory()) {
return;
}
int code = e.getKeyCode();
if (code == 37) {
System.out.println("左");
//设置限制
if (y == 0) {
return;
}
//把空白右方的数字赋值给空白
date[x][y] = date[x][y - 1];
date[x][y = 1] = 0;
y--;
//每移动一次,计数器自增
step++;
initImage();
} else if (code == 38) {
System.out.println("上");
//设置限制
if (x == 2) {
return;
}
//把空白下方的数字赋值给空白
date[x][y] = date[x + 1][y];
date[x + 1][y] = 0;
x++;
//每移动一次,计数器自增
step++;
initImage();
} else if (code == 39) {
System.out.println("右");
//设置限制
if (y == 2) {
return;
}
//把空白左方的数字赋值给空白
date[x][y] = date[x][y + 1];
date[x][y + 1] = 0;
y++;
//每移动一次,计数器自增
step++;
initImage();
} else if (code == 40) {
System.out.println("下");
//设置限制
if (x == 0) {
return;
}
//把空白上方的数字赋值给空白
date[x][y] = date[x - 1][y];
date[x - 1][y] = 0;
x--;
//每移动一次,计数器自增
step++;
initImage();
} else if (code == 65) {
initImage();
}//作弊码w
else if (code == 87) {
date = new int[][]{
{1, 2, 3},
{4, 5, 6},
{7, 8, 0}
};
initImage();
}
}
//判断date数组中的数据是否和win相同
public boolean victory() {
for (int i = 0; i < date.length; i++) {
//i表示二维数组date里面的索引
//date[i]:依次表示每一个一维数组
for (int j = 0; j < date[i].length; j++) {
if (date[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;
//打乱二维数组中的变量
initDate();
//重新加载图片
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 jDialog = new JDialog();
//创建一个图片管理容器
JLabel jLabel = new JLabel(new ImageIcon("image/money.png"));
//设置大小
jLabel.setBounds(0, 0, 573, 685);
//把图片添加到弹框中
jDialog.getContentPane().add(jLabel);
//给弹窗设置大小
jDialog.setSize(600, 700);
//让弹窗置顶
jDialog.setAlwaysOnTop(true);
//让弹窗居中
jDialog.setLocationRelativeTo(null);
//设置弹窗不关闭无法操作其他
jDialog.setModal(true);
//让弹窗显示
jDialog.setVisible(true);
}
}
}
2.登陆界面
package Game.ui;
import javax.swing.*;
public class loginJFrame extends JFrame {
//登录界面
public loginJFrame(){
//设置宽度
setSize(488,430);
//设置页面标题
setTitle("登录");
//设置页面置顶
setAlwaysOnTop(true);
//设置页面居中
setLocationRelativeTo(null);
//设置页面关闭
setDefaultCloseOperation(3);
//页面显示
setVisible(true);
}
}
3.注册界面
package Game.ui;
import javax.swing.*;
import java.awt.*;
public class RegisterJFrame extends JFrame {
//注册相关
public RegisterJFrame(){
setSize(488,500);
//设置页面标题
setTitle("注册");
//设置页面置顶
setAlwaysOnTop(true);
//设置页面居中
setLocationRelativeTo(null);
//设置页面关闭
setDefaultCloseOperation(3);
//页面显示
setVisible(true);
}
}
4.程序的启动入口
import Game.ui.GameJFrame;
public class APP {
public static void main(String[] args) {
//程序入口
new GameJFrame();
}
}