石头迷阵

JFrame类就是用来表示窗体的类

import javax.swing.*;
public class App {public static void main(String[] args) {//1.启动主界面JFrame jFrame = new JFrame();//2.设置主界面的大小jFrame.setSize(514,595);//3.给主界面设置一个标题jFrame.setTitle("石头迷阵单机版 v1.0");//4.关闭主界面的时候让代码一起停止jFrame.setDefaultCloseOperation(3);//3代表第三种关闭方式//5.将主界面设置到屏幕的正中央jFrame.setLocationRelativeTo(null);//让JFrame处于屏幕的正中央//6.让主界面置顶jFrame.setAlwaysOnTop(true);//让JFrame置顶,盖住所有的软件//7.显示主界面jFrame.setVisible(true);}
}

改进窗体

窗体绘制
JFrame类是Java提供的,我们无法改动其中的代码,如果想要在原有的基础上添加额外的功能,可以使用继承。

继承的特点

①、子类可以使用父类的东西。
②、子类还可以添加额外的功能。

import javax.swing.*;public class MyJFrame extends JFrame{public MyJFrame(){//把当前窗体的宽高进行了设置this.setSize(514,595);//把当前窗体的标题进行了设置this.setTitle("石头迷阵单机版 V1.0");//把当前窗体的关闭模式进行了设置this.setDefaultCloseOperation(3);//让当前窗体可以写到屏幕的正中央this.setLocationRelativeTo(null);//让当前窗体可以置顶this.setAlwaysOnTop(true);//让当前窗体可以展示出来this.setVisible(true);}
}

在创建对象的时候,会自动的调用构造方法;不用像上面那样一个一个的单独创建和设置了

public class App {public static void main(String[] args) {//创建一个窗体的对象MyJFrame myJFrame = new MyJFrame();}
}

菜单制作

import javax.swing.*;
public class MyJFrame extends JFrame{public MyJFrame(){//把当前窗体的宽高进行了设置this.setSize(514,595);//把当前窗体的标题进行了设置this.setTitle("石头迷阵单机版 V1.0");//把当前窗体的关闭模式进行了设置this.setDefaultCloseOperation(3);//让当前窗体可以写到屏幕的正中央this.setLocationRelativeTo(null);//让当前窗体可以置顶this.setAlwaysOnTop(true);//1.创建一个菜单对象JMenuBar jMenuBar = new JMenuBar();//2.设置菜单的宽高jMenuBar.setSize(514,20);//3.创建一个选项JMenu jMenu = new JMenu("功能");//4.创建一个条目JMenuItem jMenuItem = new JMenuItem("重新游戏");//5.把条目添加到选项当中jMenu.add(jMenuItem);//6.把选项添加到菜单当中jMenuBar.add(jMenu);//7.把菜单添加到最外层的窗体当中this.setJMenuBar(jMenuBar);//让当前窗体可以展示出来this.setVisible(true);}
}

添加图片

可以将左上角看为坐标轴的原点,然后进行添加图片排序。

import javax.swing.*;
public class MyJFrame extends JFrame{public MyJFrame(){//把当前窗体的宽高进行了设置this.setSize(514,595);//把当前窗体的标题进行了设置this.setTitle("石头迷阵单机版 V1.0");//把当前窗体的关闭模式进行了设置this.setDefaultCloseOperation(3);//让当前窗体可以写到屏幕的正中央this.setLocationRelativeTo(null);//让当前窗体可以置顶this.setAlwaysOnTop(true);//取消内部居中放置方式this.setLayout(null);//1.创建一个菜单对象JMenuBar jMenuBar = new JMenuBar();//2.设置菜单的宽高jMenuBar.setSize(514,20);//3.创建一个选项JMenu jMenu = new JMenu("功能");//4.创建一个条目JMenuItem jMenuItem = new JMenuItem("重新游戏");//5.把条目添加到选项当中jMenu.add(jMenuItem);//6.把选项添加到菜单当中jMenuBar.add(jMenu);//7.把菜单添加到最外层的窗体当中this.setJMenuBar(jMenuBar);//添加图片ImageIcon imageIcon = new ImageIcon("image\\1.png");//创建一个JLabel对象,利用JLabel对象来设置图片的位置和宽高JLabel jLabel = new JLabel(imageIcon);//设置jLabel的位置和宽高//第一个参数,第二个参数表示位置//第三个参数,第四个参数表示宽高jLabel.setBounds(0,0,100,100);//把JLabel添加到整个窗体当中this.add(jLabel);//让当前窗体可以展示出来this.setVisible(true);}
}

我们需要将(ImageIcon)图片放到(JLabel)容器当中,然后再将容器放入主界面中,以便后期控制。

优化代码

  • 添加背景色
//添加背景图
ImageIcon background = new ImageIcon("image\\background.png");
JLabel backgroundJlabel = new JLabel(background);
backgroundJlabel.setBounds(26,30,450,484);
this.add(backgroundJlabel);


但是需要把里面的小图片的x,y的坐标进行偏移就可以;偏移为x+50y+90;效果如下

  • 抽取代码
    将各个功能的代码分开;放在不同放入构造函数中;目的是为了阅读代码更加的清晰
import javax.swing.*;
public class MyJFrame extends JFrame{public MyJFrame(){//初始化界面initFrame();//初始化菜单initMenu();//初始化图片initImage();//让整个窗体展示出来this.setVisible(true);}public void initFrame(){//把当前窗体的宽高进行了设置this.setSize(514,595);//把当前窗体的标题进行了设置this.setTitle("石头迷阵单机版 V1.0");//把当前窗体的关闭模式进行了设置this.setDefaultCloseOperation(3);//让当前窗体可以写到屏幕的正中央this.setLocationRelativeTo(null);//让当前窗体可以置顶this.setAlwaysOnTop(true);//取消内部居中放置方式this.setLayout(null);}public void initMenu(){//1.创建一个菜单对象JMenuBar jMenuBar = new JMenuBar();//2.设置菜单的宽高jMenuBar.setSize(514,20);//3.创建一个选项JMenu jMenu = new JMenu("功能");//4.创建一个条目JMenuItem jMenuItem = new JMenuItem("重新游戏");//5.把条目添加到选项当中jMenu.add(jMenuItem);//6.把选项添加到菜单当中jMenuBar.add(jMenu);//7.把菜单添加到最外层的窗体当中this.setJMenuBar(jMenuBar);}public  void initImage(){//添加图片ImageIcon imageIcon1 = new ImageIcon("image\\1.png");//创建一个JLabel对象,利用JLabel对象来设置图片的位置和宽高JLabel jLabel1 = new JLabel(imageIcon1);//设置jLabel的位置和宽高//第一个参数,第二个参数表示位置//第三个参数,第四个参数表示宽高jLabel1.setBounds(0+50,0+90,100,100);//把JLabel添加到整个窗体当中this.add(jLabel1);ImageIcon imageIcon2 = new ImageIcon("image\\2.png");JLabel jLabel2 = new JLabel(imageIcon2);jLabel2.setBounds(100+50,0+90,100,100);this.add(jLabel2);ImageIcon imageIcon3 = new ImageIcon("image\\3.png");JLabel jLabel3 = new JLabel(imageIcon3);jLabel3.setBounds(200+50,0+90,100,100);this.add(jLabel3);//添加背景图ImageIcon background = new ImageIcon("image\\background.png");JLabel backgroundJlabel = new JLabel(background);backgroundJlabel.setBounds(26,30,450,484);this.add(backgroundJlabel);}
}
  • 循环
    通过循环的方式来解决代码冗余;简化代码的书写
import javax.swing.*;
public class MyJFrame extends JFrame{public MyJFrame(){//初始化界面initFrame();//初始化菜单initMenu();//初始化图片initImage();//让整个窗体展示出来this.setVisible(true);}public void initFrame(){//把当前窗体的宽高进行了设置this.setSize(514,595);//把当前窗体的标题进行了设置this.setTitle("石头迷阵单机版 V1.0");//把当前窗体的关闭模式进行了设置this.setDefaultCloseOperation(3);//让当前窗体可以写到屏幕的正中央this.setLocationRelativeTo(null);//让当前窗体可以置顶this.setAlwaysOnTop(true);//取消内部居中放置方式this.setLayout(null);}public void initMenu(){//1.创建一个菜单对象JMenuBar jMenuBar = new JMenuBar();//2.设置菜单的宽高jMenuBar.setSize(514,20);//3.创建一个选项JMenu jMenu = new JMenu("功能");//4.创建一个条目JMenuItem jMenuItem = new JMenuItem("重新游戏");//5.把条目添加到选项当中jMenu.add(jMenuItem);//6.把选项添加到菜单当中jMenuBar.add(jMenu);//7.把菜单添加到最外层的窗体当中this.setJMenuBar(jMenuBar);}public  void initImage(){for (int i = 1; i <=4 ; i++) {for (int j = 1; j <= 4; j++) {//添加图片ImageIcon imageIcon = new ImageIcon("image\\"+i+".png");//创建一个JLabel对象,利用JLabel对象来设置图片的位置和宽高JLabel jLabel = new JLabel(imageIcon);//设置jLabel的位置和宽高//第一个参数,第二个参数表示位置//第三个参数,第四个参数表示宽高jLabel.setBounds(100*(i-1)+50,0+90,100,100);//把JLabel添加到整个窗体当中this.add(jLabel);}}//添加背景图ImageIcon background = new ImageIcon("image\\background.png");JLabel backgroundJlabel = new JLabel(background);backgroundJlabel.setBounds(26,30,450,484);this.add(backgroundJlabel);}
}

打乱顺序

  1. 我们要把这些图片都放在一个容器中,方便管理
  2. 在容器中打乱顺序
    步骤:
    ①、创建对象
Random r = new Random();
//上面这个格式里面,r是变量名,可以改变,其他的都不允许变

②、获取随机数

int number = r.nextInt(10);//获取数据的范围:[0,10] 包括0,不包括10
//上面这个格式里面,number是变量名,可以改变,数字10可以改变,其他的都不允许变

具体实现如下:

public class MyJFrame extends JFrame{//定义一个二维数组方便管理数据int[][] datas = new int[4][4];public MyJFrame(){//初始化数据initData();//让整个窗体展示出来this.setVisible(true);}private void initData() {//创建一个数组int[] temp = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};//打乱一下数组中这些数字的顺序//1.遍历数组,可以依次得到数组中的每一个数for (int i = 0; i <= temp.length-1; i++) {//2.获取数组中的一个随机索引Random r = new Random();int index = r.nextInt(temp.length);//3.将当前遍历到的数字,跟随机索引上的数字两者进行交换int number = temp[i];temp[i] = temp[index];temp[index] = number;}//把打乱后的数据添加到二维数组当中for (int i = 0; i < temp.length; i++) {datas[i/4][i%4]=temp[i];}}
}
  1. 再把容器中打乱的图片展示出来
public class MyJFrame extends JFrame{public MyJFrame(){//初始化图片initImage();//让整个窗体展示出来this.setVisible(true);}public  void initImage(){for (int i = 0; i < datas.length; i++) {for (int j = 0; j < datas[i].length; j++) {int data = datas[i][j];if (data != 0) {//如果data不为0,那么才添加图片ImageIcon imageIcon = new ImageIcon("image\\"+data+".png");JLabel jLabel = new JLabel(imageIcon);jLabel.setBounds(j*100+50,i*100+90,100,100);this.add(jLabel);}}}//添加背景图ImageIcon background = new ImageIcon("image\\background.png");JLabel backgroundJlabel = new JLabel(background);backgroundJlabel.setBounds(26,30,450,484);this.add(backgroundJlabel);}
}

事件机制

事件监听机制
  • 对动作进行监听,可以监听鼠标和键盘的事件
接口
  • Java接口是一系列方法的声明,剩一些方法特征的集合。
  • 用于制定规制。
public class MyJFrame extends JFrame implements KeyListener {//定义一个二维数组方便管理数据int[][] datas = new int[4][4];public MyJFrame(){//初始化界面initFrame();//让整个窗体展示出来this.setVisible(true);}public void initFrame(){//让界面添加键盘监听this.addKeyListener(this);}@Overridepublic void keyTyped(KeyEvent e) {}//按下@Overridepublic void keyPressed(KeyEvent e) {}//松开@Overridepublic void keyReleased(KeyEvent e) {//System.out.println(e.getKeyCode());//获取每一个按键的值//获取按键的数字int keyCode = e.getKeyCode();move(keyCode);}
}

图片移动

public class MyJFrame extends JFrame implements KeyListener {//定义一个二维数组方便管理数据int[][] datas = new int[4][4];//定义两个变量,用来记录空白的位置 0int x0 = 0;int y0 = 0;public MyJFrame(){//初始化界面initFrame();//初始化图片initImage();//让整个窗体展示出来this.setVisible(true);}private void initData() {//创建一个数组int[] temp = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};//打乱一下数组中这些数字的顺序//1.遍历数组,可以依次得到数组中的每一个数for (int i = 0; i <= temp.length-1; i++) {//2.获取数组中的一个随机索引Random r = new Random();int index = r.nextInt(temp.length);//3.将当前遍历到的数字,跟随机索引上的数字两者进行交换int number = temp[i];temp[i] = temp[index];temp[index] = number;}//把打乱后的数据添加到二维数组当中for (int i = 0; i < temp.length; i++) {datas[i/4][i%4]=temp[i];if (temp[i] == 0){x0 = i/4;y0 = i%4;}}}public void initFrame(){//让界面添加键盘监听this.addKeyListener(this);//取消内部居中放置方式this.setLayout(null);}public  void initImage(){//表示将界面中原来的所有的图片全部删除this.getContentPane().removeAll();for (int i = 0; i < datas.length; i++) {for (int j = 0; j < datas[i].length; j++) {int data = datas[i][j];if (data != 0) {//如果data不为0,那么才添加图片ImageIcon imageIcon = new ImageIcon("image\\"+data+".png");JLabel jLabel = new JLabel(imageIcon);jLabel.setBounds(j*100+50,i*100+90,100,100);this.add(jLabel);}}}//将整个界面重新绘制this.getContentPane().repaint();}@Overridepublic void keyTyped(KeyEvent e) { }//按下@Overridepublic void keyPressed(KeyEvent e) {System.out.println("键盘按下了一个键");}//松开@Overridepublic void keyReleased(KeyEvent e) {//System.out.println(e.getKeyCode());//获取每一个按键的值//获取按键的数字int keyCode = e.getKeyCode();move(keyCode);//表示重新绘制界面initImage();}public void move(int keyCode){if (keyCode == 37){//左//表示空格右边的图片要向左移动datas[x0][y0] = datas[x0][y0+1];datas[x0][y0+1] = 0;y0++;}else if (keyCode == 38){//上//表示空格下面的图片向上移动datas[x0][y0] = datas[x0+1][y0];datas[x0+1][y0] = 0;x0++;}else if (keyCode == 39){//右//表示空格在左边的图片要向右移动datas[x0][y0] = datas[x0][y0-1];datas[x0][y0-1] = 0;y0--;}else if (keyCode == 40){//下//表示在空格上面的图片要向上移动datas[x0][y0] = datas[x0-1][y0];datas[x0-1][y0] = 0;x0--;}else {System.out.println("只能按上下左右");}}
}

作弊码

public class MyJFrame extends JFrame implements KeyListener {public void move(int keyCode){if (keyCode == 37){//左//表示空格右边的图片要向左移动datas[x0][y0] = datas[x0][y0+1];datas[x0][y0+1] = 0;y0++;}else if (keyCode == 38){//上//表示空格下面的图片向上移动datas[x0][y0] = datas[x0+1][y0];datas[x0+1][y0] = 0;x0++;}else if (keyCode == 39){//右//表示空格在左边的图片要向右移动datas[x0][y0] = datas[x0][y0-1];datas[x0][y0-1] = 0;y0--;}else if (keyCode == 40){//下//表示在空格上面的图片要向上移动datas[x0][y0] = datas[x0-1][y0];datas[x0-1][y0] = 0;x0--;}else if (keyCode == 87){//w 表示作弊码datas = new int[][]{{1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,0}};}else {System.out.println("只能按上下左右");}}
}

判断胜利

public class MyJFrame extends JFrame implements KeyListener {public  void initImage(){//表示将界面中原来的所有的图片全部删除this.getContentPane().removeAll();//判断游戏是否胜利if (victory()){//如果该方法的结果是true//那么就表示游戏胜利ImageIcon imageIcon = new ImageIcon("image\\win.png");JLabel jLabel = new JLabel(imageIcon);jLabel.setBounds(514/2-266/2,230,266,88);this.add(jLabel);}for (int i = 0; i < datas.length; i++) {for (int j = 0; j < datas[i].length; j++) {int data = datas[i][j];if (data != 0) {//如果data不为0,那么才添加图片ImageIcon imageIcon = new ImageIcon("image\\"+data+".png");JLabel jLabel = new JLabel(imageIcon);jLabel.setBounds(j*100+50,i*100+90,100,100);this.add(jLabel);}}}//将整个界面重新绘制this.getContentPane().repaint();}public boolean victory(){//只要判断两个数组中元素是否相同//datas 和 victoryfor (int i = 0; i < datas.length; i++) {for (int j = 0; j < datas[i].length; j++) {if (datas[i][j] != victory[i][j]){//return --- 可以写在方法当中//1.停止方法//2.将return后面的数据,返回给调用者return false;}}}return  true;}
}

计步功能

public class MyJFrame extends JFrame implements KeyListener {public void initMenu(){//计步功能JLabel label_step = new JLabel("步数:"+step);label_step.setBounds(50,20,100,20);this.add(label_step);}public void move(int keyCode){if (keyCode == 37){datas[x0][y0] = datas[x0][y0+1];datas[x0][y0+1] = 0;y0++;step++;}else if (keyCode == 38){datas[x0][y0] = datas[x0+1][y0];datas[x0+1][y0] = 0;x0++;step++;}else if (keyCode == 39){datas[x0][y0] = datas[x0][y0-1];datas[x0][y0-1] = 0;y0--;step++;}else if (keyCode == 40){datas[x0][y0] = datas[x0-1][y0];datas[x0-1][y0] = 0;x0--;step++;}else if (keyCode == 87){//w 表示作弊码datas = new int[][]{{1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,0}};}else {System.out.println("只能按上下左右");}}
}

重新开始

public class MyJFrame extends JFrame implements KeyListener, ActionListener {//统计走了多少步的变量int step = 0;public void initMenu(){//给重新游戏这个条目绑定一个事件jMenuItem.addActionListener(this);}@Overridepublic void actionPerformed(ActionEvent e) {//重新数据打乱数据的顺序initData();//计步的变量必须清零step = 0;//绘制整个界面initImage();}
}

联系我们

public class MyJFrame extends JFrame implements KeyListener, ActionListener {//定义两个条目JMenuItem jMenuItem;JMenuItem jMenuItem1;public void initMenu(){//创建一个菜单对象JMenuBar jMenuBar = new JMenuBar();//设置菜单的宽高jMenuBar.setSize(514,20);//创建一个选项JMenu jMenu = new JMenu("功能");JMenu jMenu1 = new JMenu("关于");//创建一个条目jMenuItem = new JMenuItem("重新游戏");jMenuItem1 = new JMenuItem("联系我们");//给重新游戏这个条目绑定一个事件jMenuItem.addActionListener(this);jMenuItem1.addActionListener(this);//把条目添加到选项当中jMenu.add(jMenuItem);jMenu1.add(jMenuItem1);//把选项添加到菜单当中jMenuBar.add(jMenu);jMenuBar.add(jMenu1);//把菜单添加到最外层的窗体当中this.setJMenuBar(jMenuBar);}@Overridepublic void actionPerformed(ActionEvent e) {//判断://如果点击的是重新开始,那么才执行下面的代码//如果点击的是关于我们,弹出一个对话框if (e.getSource() == jMenuItem){//重新数据打乱数据的顺序initData();//计步的变量必须清零step = 0;//绘制整个界面initImage();} else if (e.getSource() == jMenuItem1) {//创建了一个弹窗对象JDialog jDialog = new JDialog();//创建了一个图片对象ImageIcon imageIcon = new ImageIcon("image\\about.png");JLabel jlabel = new JLabel(imageIcon);jlabel.setBounds(0,0,344,344);//把图片放到弹窗当中jDialog.add(jlabel);//给弹框设置大小jDialog.setSize(344,344);//要把弹框在设置为置顶的效果jDialog.setAlwaysOnTop(true);//要让jDialog居中jDialog.setLocationRelativeTo(null);//让jDialog显示出来jDialog.setVisible(true);}else {System.out.println("没有这个按键");}}
}

优化代码

有时候当我们按向下、向上、向左、向右的按钮的时候,虽然游戏的界面没有显示什么,但是控制台有时候会报错;因为图片处于最下面,不能再按向下的按钮时候,如果按向下的按钮会出现错误;于是我们可以优化一下代码。

public class MyJFrame extends JFrame implements KeyListener, ActionListener {public void move(int keyCode){if (keyCode == 37){if (y0==3) {return;}//左//表示空格右边的图片要向左移动datas[x0][y0] = datas[x0][y0+1];datas[x0][y0+1] = 0;y0++;step++;}else if (keyCode == 38){if (x0==3) {return;}//上//表示空格下面的图片向上移动datas[x0][y0] = datas[x0+1][y0];datas[x0+1][y0] = 0;x0++;step++;}else if (keyCode == 39){if (y0==0) {return;}//右//表示空格在左边的图片要向右移动datas[x0][y0] = datas[x0][y0-1];datas[x0][y0-1] = 0;y0--;step++;}else if (keyCode == 40){if (x0==0) {return;}//下//表示在空格上面的图片要向上移动datas[x0][y0] = datas[x0-1][y0];datas[x0-1][y0] = 0;x0--;step++;}else if (keyCode == 87){//w 表示作弊码datas = new int[][]{{1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,0}};}else {System.out.println("只能按上下左右");}}
}

完整源代码:

import javax.swing.*;
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 MyJFrame extends JFrame implements KeyListener, ActionListener {//定义一个二维数组方便管理数据int[][] datas = new int[4][4];//定义一个二维数组,元素是最终胜利的元素。int [][] victory = {{1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,0}};//定义两个变量,用来记录空白的位置 0int x0 = 0;int y0 = 0;//统计走了多少步的变量int step = 0;//定义两个条目JMenuItem jMenuItem;JMenuItem jMenuItem1;public MyJFrame(){//初始化界面initFrame();//初始化菜单initMenu();//初始化数据initData();//初始化图片initImage();//让整个窗体展示出来this.setVisible(true);}private void initData() {//创建一个数组int[] temp = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};//打乱一下数组中这些数字的顺序//1.遍历数组,可以依次得到数组中的每一个数for (int i = 0; i <= temp.length-1; i++) {//2.获取数组中的一个随机索引Random r = new Random();int index = r.nextInt(temp.length);//3.将当前遍历到的数字,跟随机索引上的数字两者进行交换int number = temp[i];temp[i] = temp[index];temp[index] = number;}//把打乱后的数据添加到二维数组当中for (int i = 0; i < temp.length; i++) {datas[i/4][i%4]=temp[i];if (temp[i] == 0){x0 = i/4;y0 = i%4;}}}public void initFrame(){//把当前窗体的宽高进行了设置this.setSize(514,595);//把当前窗体的标题进行了设置this.setTitle("石头迷阵单机版 V1.0");//把当前窗体的关闭模式进行了设置this.setDefaultCloseOperation(3);//让当前窗体可以写到屏幕的正中央this.setLocationRelativeTo(null);//让当前窗体可以置顶this.setAlwaysOnTop(true);//让界面添加键盘监听this.addKeyListener(this);//取消内部居中放置方式this.setLayout(null);}public void initMenu(){//创建一个菜单对象JMenuBar jMenuBar = new JMenuBar();//设置菜单的宽高jMenuBar.setSize(514,20);//创建一个选项JMenu jMenu = new JMenu("功能");JMenu jMenu1 = new JMenu("关于");//创建一个条目jMenuItem = new JMenuItem("重新游戏");jMenuItem1 = new JMenuItem("联系我们");//给重新游戏这个条目绑定一个事件jMenuItem.addActionListener(this);jMenuItem1.addActionListener(this);//把条目添加到选项当中jMenu.add(jMenuItem);jMenu1.add(jMenuItem1);//把选项添加到菜单当中jMenuBar.add(jMenu);jMenuBar.add(jMenu1);//把菜单添加到最外层的窗体当中this.setJMenuBar(jMenuBar);}public  void initImage(){//表示将界面中原来的所有的图片全部删除this.getContentPane().removeAll();//设置步数JLabel label_step = new JLabel("步数:"+step);label_step.setBounds(50,20,100,20);this.add(label_step);//判断游戏是否胜利if (victory()){//如果该方法的结果是true//那么就表示游戏胜利ImageIcon imageIcon = new ImageIcon("image\\win.png");JLabel jLabel = new JLabel(imageIcon);jLabel.setBounds(514/2-266/2,230,266,88);this.add(jLabel);}for (int i = 0; i < datas.length; i++) {for (int j = 0; j < datas[i].length; j++) {int data = datas[i][j];if (data != 0) {//如果data不为0,那么才添加图片ImageIcon imageIcon = new ImageIcon("image\\"+data+".png");JLabel jLabel = new JLabel(imageIcon);jLabel.setBounds(j*100+50,i*100+90,100,100);this.add(jLabel);}}}//添加背景图ImageIcon background = new ImageIcon("image\\background.png");JLabel backgroundJlabel = new JLabel(background);backgroundJlabel.setBounds(26,30,450,484);this.add(backgroundJlabel);//将整个界面重新绘制this.getContentPane().repaint();}public boolean victory(){//只要判断两个数组中元素是否相同//datas 和 victoryfor (int i = 0; i < datas.length; i++) {for (int j = 0; j < datas[i].length; j++) {if (datas[i][j] != victory[i][j]){//return --- 可以写在方法当中//1.停止方法//2.将return后面的数据,返回给调用者return false;}}}return  true;}@Overridepublic void keyTyped(KeyEvent e) {}//按下@Overridepublic void keyPressed(KeyEvent e) { }//松开@Overridepublic void keyReleased(KeyEvent e) {//System.out.println(e.getKeyCode());//获取每一个按键的值//获取按键的数字int keyCode = e.getKeyCode();move(keyCode);//表示重新绘制界面initImage();}public void move(int keyCode){if (keyCode == 37){if (y0==3) {return;}//左//表示空格右边的图片要向左移动datas[x0][y0] = datas[x0][y0+1];datas[x0][y0+1] = 0;y0++;step++;}else if (keyCode == 38){if (x0==3) {return;}//上//表示空格下面的图片向上移动datas[x0][y0] = datas[x0+1][y0];datas[x0+1][y0] = 0;x0++;step++;}else if (keyCode == 39){if (y0==0) {return;}//右//表示空格在左边的图片要向右移动datas[x0][y0] = datas[x0][y0-1];datas[x0][y0-1] = 0;y0--;step++;}else if (keyCode == 40){if (x0==0) {return;}//下//表示在空格上面的图片要向上移动datas[x0][y0] = datas[x0-1][y0];datas[x0-1][y0] = 0;x0--;step++;}else if (keyCode == 87){//w 表示作弊码datas = new int[][]{{1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,0}};}else {System.out.println("只能按上下左右");}}@Overridepublic void actionPerformed(ActionEvent e) {//判断://如果点击的是重新开始,那么才执行下面的代码//如果点击的是关于我们,弹出一个对话框if (e.getSource() == jMenuItem){//重新数据打乱数据的顺序initData();//计步的变量必须清零step = 0;//绘制整个界面initImage();} else if (e.getSource() == jMenuItem1) {//创建了一个弹窗对象JDialog jDialog = new JDialog();//创建了一个图片对象ImageIcon imageIcon = new ImageIcon("image\\about.png");JLabel jlabel = new JLabel(imageIcon);jlabel.setBounds(0,0,344,344);//把图片放到弹窗当中jDialog.add(jlabel);//给弹框设置大小jDialog.setSize(344,344);//要把弹框在设置为置顶的效果jDialog.setAlwaysOnTop(true);//要让jDialog居中jDialog.setLocationRelativeTo(null);//让jDialog显示出来jDialog.setVisible(true);}else {System.out.println("没有这个按键");}}
}

测试main方法

public class App {public static void main(String[] args) {//创建一个窗体的对象MyJFrame myJFrame = new MyJFrame();System.out.println("success!!");}
}

《石头迷阵》游戏业务数据设计、游戏功能制作、游戏界面绘制相关推荐

  1. 使用Java完成石头迷阵游戏

    石头迷阵游戏 在一张4X4的地图上,有15个数字方块以及1个空白块. 每局的排序都是随机生成,不重复,如图1所示. 使用键盘的上下左右按键控制空白方块的移动. 记录操作步数. 可以重新开始. 作弊码: ...

  2. python界面制作和unity的有区别吗_由1~4人利用Sratch、Python、Unity或其它游戏开发工具设计与制作一个的教育类游戏。...

    [简答题]1.计划的概念和内容主要是什么? 2.计划的层次主要有哪些方面? [单选题]面向数据结构的设计方法的最终目标是( ) [简答题]名片设计没有问题以后可以上传到这边作为最终定稿. [其它]填充 ...

  3. 五子棋游戏html5界面设计,HTML5制作黑白五子棋游戏教程

    今天分享一个只用css和js代码开发的黑白五子棋游戏,我们把代码进行解析,希望对大家可以有所帮助 先看看效果图: HTML5制作黑白五子棋游戏教程 js代码: 定义canvas及黑白棋变量 var c ...

  4. 基于Java的石头迷阵小游戏的设计与实现

    文章目录 1 搭建游戏主界面 1.1 用JFrame类来创建窗体 (知识点继承) 1.2 菜单制作JMenuBar 1.3 添加图片 1.4 代码 2 添加游戏功能 2.1 事件监听机制 2.2 设计 ...

  5. java制作《石头迷阵》游戏。

    java如何制作小时候玩过的经典游戏<石头迷阵>,打乱数字按方向键进行移动,最终排好序. 下面用到的图片我放在下面了,大家可以先去自行下载. ↓ <石头迷阵>所需的图片 ↑ 提 ...

  6. 自学Java篇之JFrame创建《石头迷阵小游戏》

    自学Java篇之JFrame创建<石头迷阵小游戏> 根据黑马程序员java教程自学完java基础,觉得石头迷阵小游戏案例具有一定的编程练习价值,记录之. 最终效果: 案例主要思想流程: ​ ...

  7. Java石头迷阵小游戏

    //测试类 import javax.swing.*;public class Test {public static void main(String[] args) {new MainFrame( ...

  8. 【微信小游戏实战】零基础制作《欢乐停车场》二、关卡设计

    1.游戏立项 微信小游戏中有一款<欢乐停车场Plus>的小游戏,大家可以搜索玩下.这是一款益智类的小游戏,游戏中有红.黄.绿.蓝.紫5辆豪车6个停车位,玩家通过可行走路线移动小车,最终让各 ...

  9. 电子游戏设计与制作 第一章 计算机游戏概述

    文章目录 1 计算机游戏/游戏设计 2 计算机游戏发展简史 2.1 家用游戏机游戏的发展 2.2 计算机游戏的发展 3 计算机游戏的分类 RPG ACT ARPG FPS AVG 冒险类 STA 策略 ...

最新文章

  1. ios键盘横屏_iOS横竖屏旋转及其基本适配方法 转
  2. 动态规划算法入门---java版
  3. c语言编写程序计算行列式值,新手作品:行列式计算C语言版
  4. 废粉盒在哪里_很想知道打印机废粉盒中的那些废碳粉应该怎么处理?
  5. python windows自动化 爬虫_使用Python实现自动化截取Windows系统屏幕
  6. c#抽取pdf文档标题(1)
  7. 双系统Ubuntu 无 启用wifi选项
  8. 修改hadoop配饰文件文件后导致hive无法找到原有的dfs文件
  9. C语言程序设计——学生学籍管理系统
  10. 计算机无纸化考试合卷答题笔记卡,中级会计职称无纸化答题技巧
  11. Android机顶盒网络地址端口连通性测试
  12. 吴恩达深度学习课程第四章第二周编程作业(pytorch实现)
  13. VMware使用OVFTool导入虚拟机
  14. sqlserver 命令 创建非聚集索引
  15. GprMax2D ——ABC(吸收边界条件)相关命令
  16. 1004.【一维数组】【入门】输出奇数和偶数
  17. Android获取当前应用FPS(帧数)
  18. 一个故事讲完哈希洪荒攻击,看不懂你打我
  19. mysql 利用information_schema库COLUMNS表查看哪些表含有指定字段
  20. Etcd部分常用命令+采坑

热门文章

  1. AD账号导入--dsadd user
  2. Python Opencv-contrib Camshift kalman卡尔曼滤波 KCF算法 CSRT算法 目标跟踪实现
  3. 2019年京东PLUS会员前端开发之路总结
  4. setTimeout()和setInterval()的区别和转换
  5. latex如何设置行间距和段间距
  6. Unity UGUI 背景图片自适应文字内容大小
  7. register关键字的使用
  8. 程序人生——Hello P2P
  9. win10专业版没有触摸板选项_Windows10触控板的正确使用方法
  10. ICPC2017网络赛(西安)B coin (概率计算)