package game;
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 {
//JFrame 界面,窗体
//子类呢?也表示界面,窗体
//规定:GameJFrame这个界面就是表示游戏的主界面
//以后跟游戏相关的所有逻辑都写在这个类
int[][] date = new int[4][4]; //创建二维数组,用来管理数据,加载图片时会根据二维数组进行加载
//记录空白方块在数组中的位置
int x = 0; int y = 0;
//定义一个变量,记录当前展示图片路径
String path = "image\\animal\\animal3\\";
//定义一个二维数组 储存正确的数据
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(){
//初始化界面
initJFrame();
//初始化菜单
initJMenuBar();
//初始化数据(打乱)
initDate();
//初始化图片
initImage();
this.setVisible(true); //显示界面,建议写在最后
}
//初始化数据(打乱)
private void initDate() {
int[] tempArr = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15}; //定义一个一维数组
Random r = new Random();
int a,b;
for (int i = 0; i < tempArr.length; i++) { //随机打乱
a = r.nextInt(tempArr.length);
b = tempArr[i];
tempArr[i] = tempArr[a];
tempArr[a] = b;
}
int index = 0; //计算器
//赋值给二维数组
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 4; j++) {
if (tempArr[index] == 0) {
x = i;
y = j;
}
date[i][j] = tempArr[index];
index++;
}
}
}
//初始化图片
private void initImage() {
//绝对路径:从盘符开始。C:\ D:\
//相对路径:相等当前项目而言。aaa\\bbb
this.getContentPane().removeAll(); //删除原有的所有图片
//判断是否胜利
if (victory()) {
//显示胜利图标
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 = date[i][j];
//ImageIcon icon = new ImageIcon("D:\\java代码\\heima\\image\\animal\\animal3\\1.jpg"); //创建一个图片 ImageIcon 对象
JLabel jLabel = new JLabel(new ImageIcon(path + num +".jpg")); //创建一个 JLabel 对象
jLabel.setBounds(j * 105 + 83,i * 105 + 134,105,105); //添加到指定位置
jLabel.setBorder(new BevelBorder(1)); //给图片添加边框 0:让图片凸起来 1:让图片凹下去
this.getContentPane().add(jLabel); //把管理容器添加到界面中
}
}
//添加背景图片
JLabel jLabel = new JLabel(new ImageIcon("image\\background.png")); //创建一个 JLabel 对象
jLabel.setBounds(40,40,508,560); //把管理容器添加到界面中
this.getContentPane().add(jLabel);
this.getContentPane().repaint(); //刷新
}
private void initJMenuBar() {
//JMenuBar 包括 JMenu 包括 JMenuItem
//创建整个的菜单对象
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);
}
private void initJFrame() {
this.setSize(603,680); //设置界面大小
this.setTitle("拼图单机版 v1.0"); //设置界面标题
this.setAlwaysOnTop(true); //设置界面置顶
this.setLocationRelativeTo(null); //设置界面居中
this.setDefaultCloseOperation(3); //设置关闭模式
this.setLayout(null); //取消默认的居中放置,只有取消了才会按照xy轴的形式添加
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 + "all.jpg"));
all.setBounds(83,134,420,420);
this.getContentPane().add(all);
//添加背景图片
JLabel jLabel = new JLabel(new ImageIcon("image\\background.png")); //创建一个 JLabel 对象
jLabel.setBounds(40,40,508,560); //把管理容器添加到界面中
this.getContentPane().add(jLabel);
this.getContentPane().repaint(); //刷新
}
}
//键盘事件 抬起来
@Override
public void keyReleased(KeyEvent e) {
if (victory()) {
return;
//返回结果 结束方法
}
//对上,下,左,右判断
//左:37 上:38 右:39 下:40
int code = e.getKeyCode();
/* System.out.println(code);*/
if (code == 37){
if (y == 3){
return;
}
System.out.println("向左移动");
date[x][y] = date[x][y + 1];
date[x][y + 1] = 0;
y++;
step++; //步数
initImage();
} else if (code == 38) {
if (x == 3){
return;
}
System.out.println("向上移动");
date[x][y] = date[x + 1][y];
date[x + 1][y] = 0;
x++;
step++; //步数
initImage();
} else if (code == 39) {
if (y == 0) {
return;
}
System.out.println("向右移动");
date[x][y] = date[x][y - 1];
date[x][y - 1] = 0;
y--;
step++; //步数
initImage();
} else if (code == 40){
if (x == 0) {
return;
}
System.out.println("向下移动");
date[x][y] = date[x - 1][y];
date[x - 1][y] = 0;
x--;
step++; //步数
initImage();
} else if (code == 65) { //查看原图
initImage();
} else if (code == 87) { //一键通关
date = 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 < date.length; 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 j = new JLabel(new ImageIcon("image\\about.png"));
j.setBounds(0,0,258,258);
jDialog.getContentPane().add(j); //添加到弹窗中
jDialog.setSize(344,344);
jDialog.setAlwaysOnTop(true); //置顶
jDialog.setLocationRelativeTo(null); //居中
jDialog.setModal(true); //弹窗不关闭无法操作下面内容
jDialog.setVisible(true);
}
}
}
package game;
public class App {
public static void main(String[] args) {
//表示程序的启动入口
//如果我们想要开启一个界面,就创建谁的对象就可以了
// new LoginJFrame()
// //登录
//
// new RegisterJFrame();
// //注册
new GameJFrame();
//主界面
}
}