GUI编程

GUI编程

简介

GUI 是图形用户界面的首字母缩写,即允许用户通过图形元素与电子设备(如计算机、笔记本电脑、智能手机和平板电脑)进行交互的界面。在人机交互方面,它是软件应用程序编程的重要组成部分,用用户友好的操作取代基于文本的命令。它的目标是为用户提供易于查找、理解和使用的决策点。换句话说,GUI允许您使用鼠标,笔甚至手指控制设备。

为什么要学习

  1. 可以写出自己心中想要的一些小工具
  2. 工作时候,也可能需要维护到swing界面,概率极小!
  3. 了解MVC架构,了解监听!

核心技术

Swing

AWT

组件

窗口弹窗面板文本框列表框
按钮图片监听事件鼠标键盘事件

AWT

AWT介绍

  1. 包含了很多类和接口!GUI!
  2. 元素:窗口,按钮,文本框
  3. java.awt

组件和容器

万物皆对象

窗口

创建一个窗口对象创建一个窗口对象

Frame frame = new Frame(title);		//title是标题名称

设置窗口可见性

frame.setVisible(true)	//参数填是否

设置窗口大小

frame.setSize(width,height);	//宽,高

设置背景颜色

Color color = new Color(r,g,b,a)	//rgb颜色和a透明度,可以进入Color中看一些颜色
frame.setBackground(Color)	//参数是color类中颜色,左侧会标注出颜色

窗口弹出初始位置

frame.setLocation(x,y);

设置窗口调整大小固定

frame.setResizable(true);	//参数填是否

设置窗口大小及其初始位置

frame.setBounds(x,y,w,h);

设置布局

frame.setLayout(null);	//布局管理器

添加组件

frame.add(组件,位置)

自适应设置

frame.pack();

面板

Panel

在容器内,可以看成一个空间,但是不能单独存在

创建面板

Panel panel = new Panel();

Panel设置坐标,相对于Frame

panel.setBounds(x,y,w,h)

Panel设置背景色

panle.setBackground(color)

布局管理器
  • 流式布局(从左到右)
  • 东西南北中
  • 表格布局

布局之间可以嵌套


设置为流式布局

frame.setLayout(new FlowLayout())	
    FlowLayout.CENTER
    //默认在中间出现,从左到右,CENTER | LEFT | LEADING | RIGHT | TRAILING

设置为东西南北中布局

frame.setLayout(new BorderLayout())
    BorderLayout.CENTER
    //默认中间出现,CENTER | EAST | WEST | SOUTH | NORTH

设置为表格(Grid)布局

frame.setLayout(new GridLayout(行,列,上间距,下间距))

按钮
Button button = new Button(label);	//参数为按钮名称

文字性标签提示
Lable lable = new Lable(提示文本);

小作业(布局设计)

在这里插入图片描述

//完成代码
package Qin_text_1;


import java.awt.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

public class main {
    public static void main(String[] args) {
        //新建一个窗口
        java.awt.Frame frame = new java.awt.Frame("测试用例1");
        //显示窗口
        frame.setVisible(true);
        //窗口大小
        frame.setBounds(500,500,640,500);

        //窗口总体为表格布局
        GridLayout grid = new GridLayout(2, 1);
        frame.setLayout(grid);

        //需要四个面板
        Panel p1 = new Panel(new BorderLayout()); //东西南北中
        Panel p2 = new Panel(new GridLayout(2,1)); //表格
        Panel p3 = new Panel(new BorderLayout()); //东西南北中
        Panel p4 = new Panel(new GridLayout(2,2)); //表格

        //窗口加两个面板进来
        frame.add(p1);
        frame.add(p3);


        //上半部分创作
        //填入左右两个按钮
        p1.add(new Button("b1"),BorderLayout.EAST);
        p1.add(new Button("b2"),BorderLayout.WEST);
        //中间再加一个表格面板
        p1.add(p2,BorderLayout.CENTER);
        //p2加两个按钮
        p2.add(new Button("b3"));
        p2.add(new Button("b4"));

        //下半部分创作
        //左右两个按钮
        p3.add(new Button("b5"),BorderLayout.EAST);
        p3.add(new Button("b6"),BorderLayout.WEST);
        //p3中间加一个面板
        p3.add(p4,BorderLayout.CENTER);
        //加四个按钮
        p4.add(new Button("b7"));
        p4.add(new Button("b8"));
        p4.add(new Button("b9"));
        p4.add(new Button("b10"));
        
        //关闭窗口
        frame.addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });
    }


事件监听

窗口关闭事件
frame.addWindowListener(new WindowAdapter() {
    //关闭窗口操作
    @Override
    public void windowClosing(WindowEvent e) {
        System.exit(0);
    }
});//适配器模式选中单独要用的方法

动作监听
button1.setActionCommand("按钮信息");
class MyactionListener implements ActionListener{
	//因为,addActionListener()需要一个ActionListener,所以我们需要构造一个ActionListener
    @Override
    public void actionPerformed(ActionEvent e) {
        //操作
        System.out.println("动作监听返回");
        //获得按钮的信息
        if(e.getActionCommand().equals("对比信息"){
            //可以多个按钮一个实例动作
        }
    }
}
//通常创作一个类来实现ActionListener接口 


输入框事件监听(TextField)
TextField textField = new TextField(最大能填的字符数)//新建单行输入框
TextArea textArea = new TextArea();		//新建文本域
textField.addActionListener();    //监听这个文本框输入的文字
class MyActionListener2 implements ActionListener{
    @Override
    public void actionPerformed(ActionEvent e){
    	TextField field = (TextField)e.getSource();//获得一些资源,返回一个对象
        if(field.getText().equals("白鸽")){
            System.out.println("文本提交成功!");
        };
}

设置字符替换编码

.setEchoChar(‘字符’) //通常用于密码,替换字符显示,字符为char类型

字符串转换int

Integer.parseInt(“对象”)


小作业(小型计算器)

在这里插入图片描述

面向过程

package Qin_text_1;

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

public class Calc {
    public static void main(String[] args) {
        new MyFrame();
    }
}
class  MyFrame extends Frame {
    public MyFrame(){
        new Frame("计算器");
        setLayout(new FlowLayout(FlowLayout.LEFT));
        setVisible(true);

        //一个lable
        Label label = new Label("+");

        //三个输入框
        TextField textField1 = new TextField(10);
        TextField textField2 = new TextField(10);
        TextField textField3 = new TextField(20);


        //一个按钮
        Button button = new Button("=");
        button.setActionCommand("结果输出:");
        button.addActionListener(new MyAction(textField1,textField2,textField3));


        add(textField1);
        add(label);
        add(textField2);
        add(button);
        add(textField3);
        pack();


        //关闭窗口
        addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });
    }
}

class MyAction implements ActionListener{
    private TextField num1,num2,num3;
    public MyAction(TextField textField1,TextField textField2,TextField textField3){
        this.num1 = textField1;
        this.num2 = textField2;
        this.num3 = textField3;
    }
    public MyAction(){}
    @Override
    public void actionPerformed(ActionEvent e) {
        if(e.getActionCommand().equals("结果输出:")){
            int text1 = Integer.parseInt(num1.getText());
            int text2 = Integer.parseInt(num2.getText());
            int text3 = text1+text2;
            //转换字符显示到第三个框
            num3.setText("" + text3);
            num2.setText("");
            num1.setText("");
            System.out.println(text1+"+"+text2+"="+text3);
        }
    }
}

纯面向对象

package Qin_text_1;

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

public class Calc_object_oriented {
    public static void main(String[] args) {
        new MyFrame1().loadFrame();
    }
}
class  MyFrame1 extends Frame {
    TextField textField1,textField2,textField3;
    public void loadFrame(){
        new Frame("计算器");
        setLayout(new FlowLayout(FlowLayout.LEFT));
        setVisible(true);

        //一个lable
        Label label = new Label("+");

        //三个输入框
        textField1 = new TextField(10);
        textField2 = new TextField(10);
        textField3 = new TextField(20);


        //一个按钮
        Button button = new Button("=");
        button.setActionCommand("结果输出:");
        button.addActionListener(new MyAction1(this));

		//流式布局组合起来
        add(textField1);
        add(label);
        add(textField2);
        add(button);
        add(textField3);
        pack();


        //关闭窗口
        addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });
    }
    //内部类直接调用
    //最大好处:畅通无阻的访问外部类!!!!!!
    private class MyAction1 implements ActionListener{
        public MyAction1(MyFrame1 myFrame1){}
        @Override
        public void actionPerformed(ActionEvent e) {
            if(e.getActionCommand().equals("结果输出:")){		//判断按钮组件
                
                //获取输入数字
                int n1 = Integer.parseInt(textField1.getText());
                int n2 = Integer.parseInt(textField2.getText());
				//转换字符显示到第三个框
                textField3.setText("" + (n1+n2));
                //前两个框制空
                textField1.setText("");
                textField2.setText("");
                System.out.println(n1+"+"+n2+"="+(n1+n2));
            }
        }
    }
}

鼠标监听
//鼠标监听器相对于窗口
frame.addMouseListener()
//存鼠标点击的点
points new ArrayList<>();
//适配器模式
private class MyMouseListener extends MouseAdapter{
	//鼠标按下,弹起,按住不放
		@Override
		public void mousePressed(MouseEvent e){
			
        }
}

窗口监听
//重写方法
class  MyWindowLintener extends WindowAdapter{
        @Override
        public void windowClosing(WindowEvent e) {
            setVisible(false)	//隐藏窗口
            System.exit(0);
        }
    }
//WindowAdapter()	窗口打开时
//windowClosed()	窗口关闭后
//windowActivated()	窗口被激活时

键盘监听
//匿名内部类
addKeyListener(new KeyAdapter() {
            @Override
            public void keyPressed(KeyEvent e) {	//键盘按下出现事件
                int keycode = e.getKeyCode();
                if (keycode==KeyEvent.VK_UP){		
                    System.out.println("您点击了上键");
                }else{
                    System.out.println("您点击的不是上键");
                }
            }
        });
//e.getCode() 获取当前键盘ASCII码
//KeyEvent.	//对应按键码

画笔(paint)
//重写方法
@Override
    public void paint(Graphics g) {
        g.setColor(Color.red);
        g.drawOval(100,100,100,100);	//画一个圆
        //养成习惯,画笔用完还原颜色(黑色)
    }

Frame.repaint() //刷新重画

在这里插入图片描述

//左键点击绘画

package Qin_text_1;

import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.ArrayList;
import java.util.Iterator;

public class ClickPaint {
    public static void main(String[] args) {
        new MyPaintFrame("画布");
    }
}

class MyPaintFrame extends Frame {
    //新建迭代器
    ArrayList points;
    public MyPaintFrame(String title){
        super(title);
        setVisible(true);
        setBounds(100,100,600,500);
        addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });
        points= new ArrayList<>();
        this.addMouseListener(new MyMouseListener());
    }
    @Override
    public void paint(Graphics g) {
        //判断迭代器是否还有东西
        Iterator iterator = points.iterator();
        while (iterator.hasNext()) {
            //如果有就进行画画
            Point point = (Point) iterator.next();
            g.setColor(Color.BLUE);
            g.fillOval(point.x, point.y, 10, 10);
        }
    }
    public void addPaint(Point point){
        //加入迭代器
        points.add(point);
        //刷新绘画
        repaint();
    }

    //一个鼠标监听
    private class MyMouseListener extends MouseAdapter
    {
        @Override
        public void mousePressed(MouseEvent e) {
            //转换为MyPaintFrame类型来访问addPaint方法
            MyPaintFrame frame = (MyPaintFrame) e.getSource();
            frame.addPaint(new Point(e.getX(),e.getY()));
        }
    }
}

定时器
class TimerText implements ActionListener {
    //以毫秒为单位
    Timer timer = new  Timer(100,this); //定时器   100ms执行一次
	//事件监听---需要通过固定事件米刷新,1s~10次
    @Override
    public void actionPerformed(ActionEvent e) {
		timer.start();	//定时器开启
    }   
}

Swing

组件和容器

大体操作和AWT中一样

窗口
//窗口一般是初始化出来的,利用init()方法
public void init(){
    JFrame frame = new JFrame("title")
    frame.setVisible(true)	//可见
    frame.setBounds(100,100,600,500)	//大小及初始位置
}

关闭事件

frame.setDefaultCloseOperation(WindowConstants.EXIT ON CLOSE) //关闭窗口
//DISPOSE_ON_CLOSE关闭后丢弃
//DO_NOTHING_ON_CLOSE仅关闭
//HIDE_ON_CLOSE关闭后隐藏

容器
//获得一个容器
Container container = JFrame.getContentPane()
container.setBackgtound(Color)	//设置背景色
container.setLayout(null)	//绝对定位布局

面板
JPanel panel1= new JPanel(new GridLayout(1,3));	//设置面板表格布局1行3列

滚动条面板

JScrollPane scrollPane = new JScrollPane();

标签

lable

//文字标签
JLable lable = new JLable(text,SwingConstants.CENTER)	//设置文本居中
label.setHorizontalAlignment(SwingConstants.CENTER)	//设置文本水平对齐

图标

//Icon
public class IconDemo extends JFrame implements Icon{
    private int width;
    private int height;
    public IconDemo(){}
    public IconDemo(int width,int height){ 	//有参构造
        this.width = width;
        this.height = height;
    }	
    
    public void init(){	//初始化
        IconDemo iconDemo = new IconDemo(10,10);
        //图标放在标签,也可以放在按钮上!
        JLabel icon = new JLabel("icontest", iconDemo, SwingConstants.CENTER);//参数(文本,icon,位置)
        Container container = getContentPane();	//创建容器
        container.add(icon);	//添加icon
        this.setVisible(true);	//窗口可视化
        this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);	//窗口关闭
    }
    
    @Override
    public void paintIcon(Component c, Graphics g, int x, int y) {
        g.fillOval(x,y,width,height);	//用画笔画一个圆
    }

    @Override
    public int getIconWidth() {
        return this.width;
    }

    @Override
    public int getIconHeight() {
        return this.height;
    }
}


//传图片----------------------------------------------------------------


public class ImageIconDemo extends JFrame {
    public ImageIconDemo(){
        JLabel label = new JLabel("白鸽");
        //获取图片地址
        URL imgurl = ImageIconDemo.class.getResource("tx.jpg");//通过这个类获取当前文件夹内同级资源
        ImageIcon imageIcon = new ImageIcon(imgurl);
        label.setIcon(imageIcon);   //标签设置
        label.setHorizontalAlignment(SwingConstants.CENTER);    //剧中显示

        Container container = getContentPane();
        container.add(label);

        this.setVisible(true);
        this.setBounds(100,100,600,500);
        this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    }

    public static void main(String[] args) {
        new ImageIconDemo();
    }
}

按钮
JButton button = new JButton(text)
butto.setBounds()	//设置绝对定位,相对于容器

图片按钮

URL url = JButtonText.class.getResource("tx.jpg");
Icon icon = new ImageIcon(url);
//把这个图标放在按钮伤感
JButton button1 = new JButton();
button1.setIcon(icon);	//设置按钮图标
button1.setToolTipText("提示");   //鼠标放上去的提示

单选按钮

//单选框
JRadioButton radioButton01 = new JRadioButton("按钮01");
JRadioButton radioButton02 = new JRadioButton("按钮02");
JRadioButton radioButton03 = new JRadioButton("按钮03");
//由于单选框只能选一个所以要分组
ButtonGroup buttonGroup = new ButtonGroup();
buttonGroup.add(radioButton01);
buttonGroup.add(radioButton02);
buttonGroup.add(radioButton03);

container.add(radioButton01,BorderLayout.NORTH);
container.add(radioButton02,BorderLayout.CENTER);
container.add(radioButton03,BorderLayout.SOUTH);

复选按钮(多选)

//多选框
        JCheckBox jCheckBox01 = new JCheckBox("按钮01");
        JCheckBox jCheckBox02 = new JCheckBox("按钮02");

        container.add(jCheckBox01,BorderLayout.SOUTH);
        container.add(jCheckBox02,BorderLayout.NORTH);

JDialog弹窗
//弹窗也是一个窗口,默认可以关闭
class MyDialogDemo extends JDialog{
	public MyDialogDemo(){
            this.setVisible(true);	//弹窗可见
            this.setBounds(100,100,500,500);	//弹窗大小
            Container container = this.getContentPane();	//创建容器
            container.setLayout(null);	//绝对布局
        }
}

文本框
JTextField textField01 = new JTextField("hello");
        JTextField textField02 = new JTextField("文本",20);   // 限定长度

文本域

JTextArea textArea = new JTextArea(20,50);	//每行每列能写的数字
JScrollPane scrollPane = new JScrollPane(jTextArea);	//将文本域添加进入滚动条面板中
textArea,setText("文本");		//设置文本

密码框

JPasswordField passwordField = new JPasswordField();//***
passwordField.setEchoChar('*');     //设置显示内容

列表

下拉框

JComboBox combobox = new JComboBox();	//新建列表
combobox.addItem("选项1");
combobox.addItem("选项2");
combobox.addItem("选项3");
combobox.addItem("选项4");

container.add(status);

列表框

//生成列表内容
String[] contents = {"1","2","3"};
//列表中需要放内容
JList jList = new JList(contents);

container.add(jList);

应用场景:

  • 选择地区,或者一些单个选项
  • 列表, 展示信息,一般是动态扩容

贪吃蛇游戏设计

帧——就是影像动画中最小单位的单幅影像画面,相当于电影胶片上的每一格镜头。 一帧就是一幅静止的画面,连续的帧就形成动画,如电视图象等。 我们通常说帧数,简单地说,就是在1秒钟时间里传输的图片的帧数,也可以理解为图形处理器每秒钟能够刷新几次,通常用fps(Frames Per Second)表示。

在原始基础上添加了无敌

主启动类

package Snake;

import javax.swing.*;
import java.awt.*;

//游戏的主启动类
public class StartGame {
    public void init(){
        JFrame frame = new JFrame("白鸽的贪吃蛇~");
        frame.add(new GamePanel());

        frame.setVisible(true);
        frame.setBounds(100,100,915, 745);
        frame.setResizable(false);  //窗口大小不可变
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    }
    public static void main(String[] args) {
        new StartGame().init();
    }
}

游戏面板

package Snake;

import com.sun.org.apache.bcel.internal.generic.SWITCH;

import javax.swing.*;
import java.awt.*;
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 GamePanel extends JPanel implements KeyListener, ActionListener {    //键盘监听接口,定时器接口
    int gamePanelWidth = 850;   //游戏面板宽度
    int gamePanelHeight = 600;  //游戏面板高度
    //定义蛇的数据结构
    int length; //蛇的长度

    boolean waiG;   //外挂
    int[] snakeX = new int[600];    //蛇的x坐标
    int[] snakeY = new int[500];    //蛇的y坐标

    int Integral = 0;   //积分
    String fx;      //初始化方向

    boolean isFail = false;     //游戏是否失败状态

    //食物的坐标
    int foodX;
    int foodY;
    Random random = new Random();

    Timer timer = new  Timer(100,this); //定时器   100ms执行一次


    //构造器
    public GamePanel() {
        initLocation();
        //获得焦点和键盘事件
        this.setFocusable(true);    //获得焦点事件
        this.addKeyListener(this);  //获得键盘监听事件
        timer.start();      //游戏开始定时器开启
    }
    //游戏状态
    boolean isStart = false;    //默认未开启

    //初始化蛇
    public void initLocation(){
        length = 3; //初始长度为三节
        snakeX[0] = 100;snakeY[0] = 100;    //蛇头坐标
        snakeX[1] = 75;snakeY[1] = 100;    //第一个身体坐标
        snakeX[2] = 50;snakeY[2] = 100;    //第二个身体坐标
        fx = "R";       //初始化方向向右
        //把食物随机分布
        foodX = 25+25*random.nextInt(34);
        foodY = 75+25*random.nextInt(24);
        Integral = 0;   //初始积分为0
        waiG = false;   //默认外挂未开启
    }

    //绘制面板,画组件,游戏中的所有东西这个画笔来画出来
    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);    //清屏
        //绘制静态面板
        this.setBackground(Color.WHITE);
        //计分面板
        g.fillRect( 25, 11,850,50);
        //游戏面板
        g.fillRect(25,75,gamePanelWidth,gamePanelHeight);
        //画食物
        Data.food.paintIcon(this,g,foodX,foodY);
        //画积分榜单
        g.setColor(Color.WHITE);
        g.setFont(new Font("微软雅黑",Font.BOLD,35));      //字体 样式 大小
        g.drawString("长度:"+length,40,47);
        g.setFont(new Font("微软雅黑",Font.BOLD,35));      //字体 样式 大小
        g.drawString("积分:"+Integral,300,47);
        //把小蛇画上去,蛇头初始化向右,需要通过方向判断
        switch (fx) {
            case "R":   Data.right.paintIcon(this, g, snakeX[0], snakeY[0]);break;   //画在哪个组件,用什么画,坐标
            case "L":   Data.left.paintIcon(this, g, snakeX[0], snakeY[0]);break;   //画在哪个组件,用什么画,坐标
            case "U":   Data.up.paintIcon(this, g, snakeX[0], snakeY[0]);break;   //画在哪个组件,用什么画,坐标
            case "D":   Data.down.paintIcon(this, g, snakeX[0], snakeY[0]);break;   //画在哪个组件,用什么画,坐标
        }
        //身体从第一节开始变化,小于身体长度
        for (int i = 1; i < length; i++) {
            Data.body.paintIcon(this,g,snakeX[i],snakeY[i]);   //画在哪个组件,用什么画,坐标
        }


        //游戏状态
        if (isStart == false){
            g.setColor(Color.WHITE);
            //设置字体
            g.setFont(new Font("微软雅黑",Font.BOLD,40));      //字体 样式 大小
            g.drawString("按下空格开始游戏~",270,300);      //文本 坐标
            g.drawString("按X开启外挂",320,350);      //文本 坐标
        }

        if (waiG){
            g.setColor(Color.RED);
            g.setFont(new Font("微软雅黑",Font.BOLD,35));
            g.drawString("外挂已开启!!!",600,47);
        }else {
            g.setColor(Color.white);
            g.setFont(new Font("微软雅黑",Font.BOLD,35));
            g.drawString("外挂暂未开启",600,47);
        }

        if(isFail){
            g.setColor(Color.RED);
            //设置字体
            g.setFont(new Font("微软雅黑",Font.BOLD,40));      //字体 样式 大小
            g.drawString("失败,按下空格重新开始",220,300);
        }
    }
    //键盘按下监听
    @Override
    public void keyPressed(KeyEvent e) {
        int KeyCode = e.getKeyCode();    //获取按下键值

        if (KeyCode == KeyEvent.VK_SPACE){      //按下空格开始游戏
            if(isFail){
               //重新开始
                isFail=false;
                initLocation();
            }else {
                isStart=!isStart;//取反操作控制游戏状态
            }
            repaint();  //值已经变化重新绘制
        }
        //小蛇移动
        switch (KeyCode){
            case KeyEvent.VK_UP:    fx="U"; break;
            case KeyEvent.VK_DOWN:  fx="D"; break;
            case KeyEvent.VK_LEFT:  fx="L"; break;
            case KeyEvent.VK_RIGHT: fx="R"; break;
            case KeyEvent.VK_X: waiG=!waiG;break;   //小蛇无敌
        }
    }
    //事件监听---需要通过固定事件米刷新,1s~10次
    @Override
    public void actionPerformed(ActionEvent e) {
        if (isStart && isFail==false){       //如果游戏是开始的状态,就让小蛇动起来
            //吃食物
            if (snakeX[0]==foodX&&snakeY[0]==foodY) {
                length++;   //长度+1
                Integral+=5;    //没吃一个食物 积分+5
                //再次随机食物
                foodX = 25+25*random.nextInt(34);
                foodY = 75+25*random.nextInt(24);
            }
            //移动
            for (int i = length-1; i > 0 ; i--) {
                snakeX[i] = snakeX[i-1];        //向前移动一节
                snakeY[i] = snakeY[i-1];
            }
            //走向
            switch (fx){
                case "R":snakeX[0]=snakeX[0]+25; if (snakeX[0]>850){snakeX[0]=25;}break;//蛇肉向右移动
                case "L":snakeX[0]=snakeX[0]-25; if (snakeX[0]<25){snakeX[0]=850;}break;//蛇肉向左移动
                case "U":snakeY[0]=snakeY[0]-25; if (snakeY[0]<75){snakeY[0]=650;}break;//蛇肉向右移动
                case "D":snakeY[0]=snakeY[0]+25; if (snakeY[0]>650){snakeY[0]=75;}break;//蛇肉向右移动
            }
            
            //失败判定,撞到自己就算失败
            for (int i = 1; i < length ;i++) {
                if (snakeX[0] == snakeX[i] && snakeY[0] == snakeY[i]) {
                    isFail = !waiG;
                }
            }
            repaint();  //重画页面
        }
        timer.start();
    }

    @Override
    public void keyReleased(KeyEvent e) {

    }
    @Override
    public void keyTyped(KeyEvent e) {

    }
}

数据类

package Snake;

import javax.swing.*;
import java.net.URL;

//素材数据中心
public class Data {
    //绝对路径 相当于当前的顶目
    //上下左右
    public static URL upURL = Data.class.getResource("material/up.png");
    public static URL downURL = Data.class.getResource("material/down.png");
    public static URL leftURL = Data.class.getResource("material/left.png");
    public static URL rightURL = Data.class.getResource("material/right.png");
    public static ImageIcon up = new ImageIcon(upURL);
    public static ImageIcon down = new ImageIcon(downURL);
    public static ImageIcon left = new ImageIcon(leftURL);
    public static ImageIcon right = new ImageIcon(rightURL);

    //身体
    public static URL bodyURL = Data.class.getResource("material/body.png");
    public static ImageIcon body = new ImageIcon(bodyURL);

    //食物
    public static URL foodURL = Data.class.getResource("material/food.png");
    public static ImageIcon food = new ImageIcon(foodURL);
}

游戏实图

在这里插入图片描述


本篇笔记学习视频来自b站**【狂神说Java】GUI编程入门到游戏实战**

  • 29
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值