努力打卡 每天学习 不浪费每一天 day39_haenu0317的博客-爱代码爱编程
项目完成 用时两天
public class GameJFrame extends JFrame implements KeyListener, ActionListener {
//创建一个二维数组
//用来管理数据
//加载数据的时候会根据二维数组中的数据进行加载
int[][] data=new int[4][4];
int[][] win=new int[][]{
{1,2,3,4},
{5,6,7,8},
{9,10,11,12},
{13,14,15,0}
};
//记录步数
int step=0;
//记录空白坐标
int x;
int y;
String path="../JavaGUI/image/animal/animal3/";
//初始化选项下面的条目对象
JMenuItem animal=new JMenuItem("动物");
JMenuItem girl=new JMenuItem("美女");
JMenuItem sprot=new JMenuItem("风景");
JMenuItem replayItem=new JMenuItem("重新游戏");
JMenuItem closeItem=new JMenuItem("关闭游戏");
JMenuItem accountItem=new JMenuItem("联系作者");
public GameJFrame() {
//初始化界面
initJFram();
//初始化菜单
initJMenuBar();
//初始化数据
initData();
//初始化图片
initImage();
//让窗口显示出来
this.setVisible(true);
}
private void initData() {
int[] arr = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15};
Random ra = new Random();
int temp;
int index;
for (int i = 0; i < arr.length; i++) {
temp = arr[i];
index = arr[ra.nextInt(arr.length)];
arr[i] = arr[index];
arr[index] = temp;
}
//将一位数组存入到二维数组中
for (int i = 0; i < arr.length; i++) {
if (arr[i] == 0) {
x = i / 4;
y = i % 4;
}
data[i / 4][i % 4] = arr[i];
}
}
private void initImage() {
//刷新图片 去掉原有的
this.getContentPane().removeAll();
//判断是否还原成功
if(victory())
{
//显示胜利的图标
ImageIcon imageIcon=new ImageIcon("../JavaGUI/image/win.png");
JLabel jLabel=new JLabel(imageIcon);
jLabel.setBounds(203,293,197,73);
this.getContentPane().add(jLabel);
}
JLabel jLabelstep=new JLabel("步数"+step);
jLabelstep.setBounds(50,30,100,20);
this.getContentPane().add(jLabelstep);
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 4; j++) {
int index=data[i][j];
//创建一个管理容器
JLabel jLabel=new JLabel(new ImageIcon(path+index+".jpg"));
//设定位置
jLabel.setBounds(105*j+83,105*i+134,105,105);
//给图片添加边框
//0 凸起
//1 凹
jLabel.setBorder(new BevelBorder(0));
//加到隐藏内容上
this.getContentPane().add(jLabel);
}
}
JLabel jb=new JLabel(new ImageIcon("../JavaGUI/image/background.png"));
jb.setBounds(40,40,508,560);
this.getContentPane().add(jb);
//刷新一下界面
this.getContentPane().repaint();
}
private void initJMenuBar() {
JMenuBar jMenuBar=new JMenuBar();
//初始化菜单上面的选项对象
JMenu functionJMenu=new JMenu("功能");
JMenu aboutJMenu=new JMenu("关于我们");
JMenu reimgItem=new JMenu("更换图片");
//将每一个选项下面的条目对象添加到选项对象中
reimgItem.add(animal);
reimgItem.add(girl);
reimgItem.add(sprot);
functionJMenu.add(reimgItem);
functionJMenu.add(replayItem);
functionJMenu.add(closeItem);
aboutJMenu.add(accountItem);
//讲选项对象添加到菜单中
jMenuBar.add(functionJMenu);
jMenuBar.add(aboutJMenu);
//给条目绑定时间
replayItem.addActionListener(this);
closeItem.addActionListener(this);
accountItem.addActionListener(this);
animal.addActionListener(this);
girl.addActionListener(this);
sprot.addActionListener(this);
this.setJMenuBar(jMenuBar);
}
private void initJFram() {
//设置窗口大小(像素)
this.setSize(603,680);
//设置界面标题
this.setTitle("单机拼图游戏 V1.0");
//设置界面置顶
this.setAlwaysOnTop(true);
//位置居中
this.setLocationRelativeTo(null);
//设置关闭模式
this.setDefaultCloseOperation(3);
//取消默认的居中方式,只有取消了才会按照X,Y轴
this.setLayout(null);
this.addKeyListener(this);
}
@Override
public void keyTyped(KeyEvent e) {
}
@Override
public void keyPressed(KeyEvent e) {
if(victory())
{
return;
}
int code=e.getKeyCode();
if(code==65)
{
this.getContentPane().removeAll();
JLabel jLabel=new JLabel(new ImageIcon(path+"all.jpg"));
jLabel.setBounds(83,134,420,420);
this.getContentPane().add(jLabel);
JLabel jb=new JLabel(new ImageIcon("../JavaGUI/image/background.png"));
jb.setBounds(40,40,508,560);
this.getContentPane().add(jb);
this.getContentPane().repaint();
}
}
@Override
public void keyReleased(KeyEvent e) {
if(victory())
{
return;
}
int code=e.getKeyCode();
if(code==37)
{
if(y==3)
{
return;
}
step++;
System.out.println("向左移动");
data[x][y]=data[x][y+1];
data[x][y+1]=0;
y++;
initImage();
}
else if(code==38)
{
if(x==3)
{
return;
}
step++;
System.out.println("向上移动");
data[x][y]=data[x+1][y];
data[x+1][y]=0;
x++;
initImage();
}
else if(code==39)
{
if(y==0)
{
return;
}
step++;
System.out.println("向右移动");
data[x][y]=data[x][y-1];
data[x][y-1]=0;
y--;
initImage();
}
else if(code==40)
{
if(x==0)
{
return;
}
step++;
System.out.println("向下移动");
data[x][y]=data[x-1][y];
data[x-1][y]=0;
x--;
initImage();
}
else if (code==65) {
initImage();
}
else if(code==123)
{
data=new int[][]{
{1,2,3,4},
{5,6,7,8},
{9,10,11,12},
{13,14,15,0}
};
initImage();
x=3;
y=3;
}
}
public boolean victory()
{
for (int i = 0; i < data.length; i++) {
for (int j = 0; j < data[i].length; j++) {
if(data[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;
initData();
initImage();
}
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("../JavaGUI/image/wxchat.jpg"));
jLabel.setBounds(0,0,262,259);
JLabel jLabel1=new JLabel("大连民族大学软件213班");
jLabel1.setBounds(0,0,200,40);
jDialog.getContentPane().add(jLabel1);
jDialog.getContentPane().add(jLabel);
jDialog.setSize(270,350);
jDialog.setAlwaysOnTop(true);
jDialog.setLocationRelativeTo(null);
//弹窗不关闭无法操作下面的界面
jDialog.setModal(true);
jDialog.setVisible(true);
}
else if(obj==animal)
{
Random rd=new Random();
path="../JavaGUI/image/animal/animal"+(rd.nextInt(8)+1)+"/";
step=0;
initData();
initImage();
}
else if(obj==girl)
{
Random rd=new Random();
path="../JavaGUI/image/girl/girl"+(rd.nextInt(14)+1)+"/";
step=0;
initData();
initImage();
}
else if(obj==sprot)
{
Random rd=new Random();
path="../JavaGUI/image/sport/sport"+(rd.nextInt(10)+1)+"/";
step=0;
initData();
initImage();
}
}
}