只完成了游戏界面,登入和注册界面还没完成
启动类
package com.yx.ui;
public class App {
//启动入口
public static void main(String[] args) {
//如果想要开启一个界面,就创建谁的对象
// new DengJFrame();
// new ZCJFrame();
new GameJFrame();
}
}
游戏类
package com.yx.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.JDialog;
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{
//创建二维数组
int[][]date=new int[4][4];
//记录空白方块的位置
int x=0;
int y=0;
String pas="image/animal/animal3/";
//游戏界面,所有跟游戏有关的代码
//定义数组保存正确数据
int[][] win={
{1,2,3,4},
{5,6,7,8},
{9,10,11,12},
{13,14,15,0}
};
//步数
int bu=0;
//创建选项下面的条目对象
JMenuItem cxyx=new JMenuItem("重新游戏");
JMenuItem cxdr=new JMenuItem("重新登入");
JMenuItem gbyx=new JMenuItem("关闭游戏");
JMenuItem gzh=new JMenuItem("公众号");
public GameJFrame() {
//初始化界面
jmian();
//初始化菜单
caidan();
//初始化数据
daluan();
//初始化图片
tupian();
//展示出来
this.setVisible(true);
}
//初始化数据(打乱)
private void daluan() {
//需求:
//把一个一维数组中的数据: 0~15 打乱顺序
//然后再按照4个一组的方式添加到二维数组当中
//定义一个一维数组
int[]temp= {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<temp.length;i++) {
//获取随机索引
int x=r.nextInt(temp.length);
//交换数据
int temp1=temp[i];
temp[i]=temp[x];
temp[x]=temp1;
}
//给二维数组添加数据
//遍历一维数组temp得到每个元素,将每个元素添加到二维数组中
//i=0 0 0
//i=1 0 1
//i=2 0 2.....
for(int i=0;i<temp.length;i++) {
if(temp[i]==0) {
x=i/4;
y=i%4;
}
date[i/4][i%4]=temp[i];
}
}
//初始化图片
private void tupian() {
//清空图片
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 bs=new JLabel("步数"+bu);
bs.setBounds(50, 30, 100, 20);
this.getContentPane().add(bs);
//先加载的图片在上方
//把内循环执行4次
for(int i=0;i<4;i++) {
//一行添加4张图片
for(int j=0;j<4;j++) {
//获取图片序号
int num=date[i][j];
//创建JLabel对象(管理容器)
JLabel jLabel=new JLabel(new ImageIcon(pas+num+".jpg"));
//指定图片位置
jLabel.setBounds(105*j+83, 105*i+134, 105, 105);
//给图片添加边框
jLabel.setBorder(new BevelBorder(1));
//0让图片凸起来,1让图片凹下去
//将管理容器添加到容器内
this.getContentPane().add(jLabel);
}
}
//添加背景
JLabel ba=new JLabel(new ImageIcon("image/background.png"));
ba.setBounds(40, 40, 508, 560);
this.getContentPane().add(ba);
//刷新界面
this.getContentPane().repaint();
}
private void caidan() {
//创建菜单对象
JMenuBar cdan=new JMenuBar();
//创建菜单上面两个选项对象(功能 关于我们)
JMenu gn=new JMenu("功能");
JMenu gywm=new JMenu("关于我们");
//将每一个选项下面的条目添加到选项中
gn.add(cxyx);
gn.add(cxdr);
gn.add(gbyx);
gywm.add(gzh);
//给条目绑定事件
cxyx.addActionListener(this);
cxdr.addActionListener(this);
gbyx.addActionListener(this);
gzh.addActionListener(this);
//将菜单里面的两个选项添加到菜单当中
cdan.add(gn);
cdan.add(gywm);
//给整个界面设置菜单
this.setJMenuBar(cdan);
}
private void jmian() {
//设置窗体的宽高
this.setSize(603,680);
//标题
this.setTitle("拼图游戏");
//置顶
this.setAlwaysOnTop(true);
//居中
this.setLocationRelativeTo(null);
//关闭模式
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//取消默认的居中放置
this.setLayout(null);
//添加键盘事件
this.addKeyListener(this);
}
public static void main(String[] args) {
}
@Override
public void keyTyped(KeyEvent e) {
// TODO Auto-generated method stub
}
//按下不松会调用这个方法
@Override
public void keyPressed(KeyEvent e) {
int code=e.getKeyCode();
if(code==65) {
//删除当前界面所有图片
this.getContentPane().removeAll();
//加载完整图片
JLabel all=new JLabel(new ImageIcon(pas+"all.jpg"));
all.setBounds(83, 134, 420, 420);
this.getContentPane().add(all);
//加载背景
JLabel ba=new JLabel(new ImageIcon("image/background.png"));
ba.setBounds(40, 40, 508, 560);
this.getContentPane().add(ba);
//刷新界面
this.getContentPane().repaint();
}
}
@Override
public void keyReleased(KeyEvent e) {
//上下左右进行判断
int code=e.getKeyCode();
if(code==38) {
System.out.println("向上移动");
if(x==3) {
//表示空白方块已经在最下方了,他的下面没有图片在能移动了
return;
}
//把空白方块下方的数字往上移动
//x,y 表示空白方块
//x+1,y表示空白方块的数字
date[x][y]=date[x+1][y];
date[x+1][y]=0;
x++;
//步数自增
bu++;
tupian();
}else if(code==40) {
System.out.println("向下移动");
if(x==0) {
return;
}
//把空白方块上方的数字往下移动
date[x][y]=date[x-1][y];
date[x-1][y]=0;
x--;
//步数自增
bu++;
tupian();
}else if(code==37) {
//把空白方块右方的数字往下移动
System.out.println("向左移动");
if(y==3) {
return;
}
date[x][y]=date[x][y+1];
date[x][y+1]=0;
y++;
//步数自增
bu++;
tupian();
}else if(code==39) {
//把空白方块左方的数字往下移动
System.out.println("向右移动");
if(y==0) {
return;
}
date[x][y]=date[x][y-1];
date[x][y-1]=0;
y--;
//步数自增
bu++;
tupian();
}else if(code==65) {
tupian();
}else if(code==87) {
date=new int[][] {
{1,2,3,4},
{5,6,7,8},
{9,10,11,12},
{13,14,15,0}
};
tupian();
}
}
//判断是否正确,正确返回true,否则返回false
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==cxyx) {
System.out.println("重新游戏");
//打乱二维数组数据
daluan();
//计步器清零
bu=0;
//重新加载图片
tupian();
}else if(obj==cxdr) {
System.out.println("重新登入");
//关闭游戏
this.setVisible(false);
//打开登入界面
new DengJFrame();
}else if(obj==gbyx) {
System.out.println("关闭游戏");
//关闭虚拟机
System.exit(0);
}else if(obj==gzh) {
System.out.println("公众号");
//创建弹框
JDialog gzhtu=new JDialog();
//创建管理的容器对象
JLabel jLabel=new JLabel(new ImageIcon("image/about.png"));
jLabel.setBounds(0, 0, 258, 258);
//添加到弹框
gzhtu.getContentPane().add(jLabel);
//设置大小
gzhtu.setSize(344, 344);
//置顶
gzhtu.setAlwaysOnTop(true);
//居中
gzhtu.setLayout(null);
//不关闭,无法操作
gzhtu.setModal(true);
//显示弹框
gzhtu.setVisible(true);
}
}
}
展示