//复制粘贴警告

GUI编程入门到游戏实践

GUI编程入门到游戏实践


建议不要直接在container或者frame中直接添加文本框等组件,先add面板,再进行操作

1. 简介

GUI的核心技术:Swing , AWT

* 即将淘汰
	* 界面不美观
	* 需要jre 环境
* 需要学习
	* 可以写出自己心中想要的一些小工具
	* 工作时候,也可能需要维护到Swing界面,概率极小
	* 了解MVC机构,了解监听!

视频链接


2. AWT


2.1 Awt介绍

* 包含了很多类和接口
* 元素:窗口、按钮、文本框
* java.awt

* 包含了很多类和接口
* 元素:窗口、按钮、文本框
* java.awt

image-20210929082301349
视频链接


2.2 组件和容器

想偷个懒就用到了Swing包下的JFrame


2.2.1 Frame:窗体

* setVisible
* setResizable
* setBackground
* setLoaction
* setSize
* setBBounds

2.2.2 Panel:面板

不能单独存在,需要放到Frame中
frame.add(panel);
//监听器:适配者模式 
frame.addWindowListener(new WindowAdapter() {        
	public void windowClosing(WindowEvent e) {            
		System.exit(0);     
	}
})

Java JFrame窗口关闭方法总结需要继承JFrame类


2.3 布局管理器

* 流式布局
* 东西南北中
* 表格式布局

Java GUI编程的几种常用布局管理器
image-20210929082324346

package lesson01;

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

public class TestLayout02{
    public static void main(String[] args) {
        //窗体初始化
        Frame frame = new Frame();
        frame.setLayout(new GridLayout(2,1));
        frame.setVisible(true);
        frame.setBounds(300,400,300,400);
        frame.setBackground(Color.CYAN);

        //四个面板
        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));

        //基本框架确立
        p1.add(new Button("West-1"), BorderLayout.WEST);
        p1.add(p2, BorderLayout.CENTER);
        p1.add(new Button("East-1"), BorderLayout.EAST);
        p3.add(new Button("West-2"),BorderLayout.WEST);
        p3.add(p4,BorderLayout.CENTER);
        p3.add(new Button("East-2"),BorderLayout.EAST);

        //添加按钮和面板
        p2.add(new Button("p2-btn-1"));
        p2.add(new Button("p2-btn-2"));
        for (int i = 1; i < 5; i++){
            p4.add(new Button("p4-btn-" + i));
        }
        frame.add(p1);
        frame.add(p3);
        //监听器,关闭动作
        frame.addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });

    }
}

2.4 事件监听

package lesson01;

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class Demo01 {
    public static void main(String[] args) {
        //初始化窗体
        JFrame frame = new JFrame();
        frame.setBounds(400,400,400,400);
        frame.setVisible(true);
        //创建按钮
        Button button1 = new Button("start");
        Button button2 = new Button("stop");

        //为按钮添加事件反馈信息,默认为按钮label信息
        button1.setActionCommand("开始");
        MyMonitor myMonitor = new MyMonitor();
        button1.addActionListener(myMonitor);
        button2.addActionListener(myMonitor);
        frame.add(button1, BorderLayout.EAST);
        frame.add(button2, BorderLayout.WEST);
        //窗口关闭事件
        frame.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
    }
}

class MyMonitor implements ActionListener{

    @Override
    public void actionPerformed(ActionEvent e) {
        System.out.println("按钮被点击了--->" + e.getActionCommand());
        //可以实现精确定位,避免重复建立监听器
        if ("开始".equals(e.getActionCommand())){
            System.out.println("恭喜");
        }
    }
}

2.5 输入框 TextField 监听

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class Demo02 {
    public static void main(String[] args) {
        new MyFrame().setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
        //仅用来启动
    }
}

class MyFrame extends JFrame{
    public MyFrame() throws HeadlessException {
        TextField textField = new TextField();
        add(textField);
        //监听这个文本框的文字,按下回车启动
        MyActionListener myActionListener = new MyActionListener();
        textField.addActionListener(myActionListener);
        setVisible(true);
        //自适应
        pack();
        //设置替换编码
        textField.setEchoChar('*');
    }
}


class MyActionListener implements ActionListener{

    @Override
    public void actionPerformed(ActionEvent e) {
        TextField field = (TextField) e.getSource();
        System.out.println(field.getText());
        //清空文本框
        field.setText("");
    }
}

2.6 简易计算器,组合+内部类

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class Demo03 {
    public static void main(String[] args) {
        new Calculator();
    }
}
//计算机类
class Calculator extends JFrame{
    public Calculator() throws HeadlessException {
        //3个文本框
        TextField textField1 = new TextField(10);
        TextField textField2 = new TextField(10);
        TextField textField3 = new TextField(10);
        //1个按钮
        Button button = new Button("=");
        //1个标签
        Label label = new Label("+");
        //布局
        setLayout(new FlowLayout());
        add(textField1);
        add(label);
        add(textField2);
        add(button);
        add(textField3);
        setVisible(true);
        pack();
        //关闭窗体
        setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
        //监听事件
        CalculatorListener calculatorListener = new CalculatorListener(textField1, textField2, textField3);
        button.addActionListener(calculatorListener);

    }
}
//监听器类
class CalculatorListener implements ActionListener{
    //获取三个变量
    private TextField textField1, textField2, textField3;
    public CalculatorListener(TextField textField1, TextField textField2, TextField textField3) {
        this.textField1 = textField1;
        this.textField2 = textField2;
        this.textField3 = textField3;
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        //1.获得加数和被加数
        int num1 = Integer.parseInt(textField1.getText());
        int num2 = Integer.parseInt(textField2.getText());
        //2.将结果放到第三个文本框
        textField3.setText("" + (num1 + num2));
        //3.清楚前两个框
        textField1.setText("");
        textField2.setText("");
    }
}

代码优化1(完全面向对象):

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class Demo03 {
    public static void main(String[] args) {
        new Calculator().start();
    }
}
//计算机类
class Calculator extends JFrame{
    TextField textField1 = null;
    TextField textField2 = null;
    TextField textField3 = null;
    public void start(){
        textField1 = new TextField(10);
        textField2 = new TextField(10);
        textField3 = new TextField(10);
        Button button = new Button("=");
        Label label = new Label("+");

        setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
        button.addActionListener(new CalculatorListener(this));

        setLayout(new FlowLayout());
        add(textField1);
        add(label);
        add(textField2);
        add(button);
        add(textField3);
        setVisible(true);
        pack();
    }
}
//监听器类
class CalculatorListener implements ActionListener{
    private final Calculator calculator;
    public CalculatorListener(Calculator calculator) {
        this.calculator = calculator;
    }

    @Override
    public void actionPerformed(ActionEvent e) {

        int num1 = Integer.parseInt(this.calculator.textField1.getText());
        int num2 = Integer.parseInt(this.calculator.textField2.getText());
        calculator.textField3.setText("" + (num1 + num2));
        calculator.textField1.setText("");
        calculator.textField2.setText("");
    }
}

代码优化2(内部类,更好的包装):
原本外部类的内容可以直接访问,大大降低代码成本

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class Demo03 {
    public static void main(String[] args) {
        new Calculator().start();
    }
}
//计算机类
class Calculator extends JFrame{
    TextField textField1 = null;
    TextField textField2 = null;
    TextField textField3 = null;
    public void start(){
        textField1 = new TextField(10);
        textField2 = new TextField(10);
        textField3 = new TextField(10);
        Button button = new Button("=");
        Label label = new Label("+");

        setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
        button.addActionListener(new CalculatorListener());

        setLayout(new FlowLayout());
        add(textField1);
        add(label);
        add(textField2);
        add(button);
        add(textField3);
        setVisible(true);
        pack();
    }
    private  class CalculatorListener implements ActionListener{

        @Override
        public void actionPerformed(ActionEvent e) {

            int num1 = Integer.parseInt(textField1.getText());
            int num2 = Integer.parseInt(textField2.getText());
            textField3.setText("" + (num1 + num2));
            textField1.setText("");
            textField2.setText("");
        }
}

}

2.7 画笔paint

package paint;

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

public class Demo01 {
    public static void main(String[] args) {
        //组件中自动调用print方法,且只调用一次
        MyPaint myPaint = new MyPaint();
        myPaint.start();
        myPaint.close();

    }
}

class MyPaint extends JFrame{
    public void start(){
        setBounds(200,200,600,500);
        setVisible(true);
    }

    //画笔
    @Override
    public void paint(Graphics g) {
        g.setColor(Color.BLUE);
        g.drawOval(100,100,100,100);
        g.setColor(Color.CYAN);
        g.fillOval(200,200,100,100);
        g.fillRect(300,300,100,100);
    }

    public void close(){
        setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
    }
}

2.7.1 鼠标监听

package lesson02;

import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
import java.util.Iterator;

public class TestMouseListener {
    public static void main(String[] args) {
        MyFrame myFrame = new MyFrame("画板");
        myFrame.close();
    }
}

class MyFrame extends JFrame{
    ArrayList points;
    public MyFrame(String title) throws HeadlessException {
        super(title);
        setBounds(200,200,400,300);
        setVisible(true);

        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.CYAN);
            g.fillOval(point.x, point.y, 10, 10);
        }
    }

    private class MyMouseListener extends MouseAdapter{
        @Override
        public void mousePressed(MouseEvent e) {
            points.add(new Point(e.getX(), e.getY()));
            repaint();
        }
    }
    protected void close(){
        setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
    }
}

2.7.2 窗口监听

package lesson03;

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

public class TestWindow {
    public static void main(String[] args) {
        new MyFrame();
    }
}
class MyFrame extends Frame{
    public MyFrame(){
        setBounds(300,300,500,600);
        setVisible(true);
        this.addWindowListener(new MyWindowListener());
    }

    private class MyWindowListener extends WindowAdapter {
        @Override
        public void windowClosing(WindowEvent e) {
            System.exit(0);
        }

        @Override
        public void windowActivated(WindowEvent e) {
            Frame frame = (Frame) e.getSource();
            frame.setTitle("Hello!");
        }
    }
}

2.8 键盘监听

package lesson04;

import java.awt.*;
import java.awt.event.*;

public class TestKeyListener {
    public static void main(String[] args) {
        new MyFrame();
    }

}
class MyFrame extends Frame{
    public MyFrame(){
        setBounds(300,300,300,300);
        setVisible(true);
        this.addKeyListener(new Listener());
        this.addWindowListener(new close());
    }

    private class Listener extends KeyAdapter {
        @Override
        public void keyPressed(KeyEvent e) {
            System.out.println(e.getKeyChar());
            if (e.getKeyCode() == KeyEvent.VK_3)
                System.out.println("hhh");
        }
    }
    private class close extends WindowAdapter {
        @Override
        public void windowClosing(WindowEvent e) {
            System.exit(0);
        }
    }

}

3. Swing


3.1 窗口

//居中方法
label.setHorizontalAlignment(SwingConstants.CENTER);

JFrame是Frame的子类,但依赖于容器

package lesson05;

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

public class JFrameDemo {
    public static void main(String[] args) {
        //init();初始化
        new MyFrame().init();
    }

}

class MyFrame extends JFrame{
    public void init(){
        //获得容器
        Container contentPane = getContentPane();
        contentPane.setBackground(Color.CYAN);

        setVisible(true);
        setBounds(100,100,200,200);
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    }

    public MyFrame() throws HeadlessException {
        add(new JLabel("欢迎来到对抗路", SwingConstants.CENTER));
    }
}

3.2 弹窗

package lesson06;

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class DialogDemo {
    public static void main(String[] args) {
        new MyJFrame().init();
    }
}

class MyJFrame extends JFrame{
    public  void init(){
        Container container = getContentPane();
        container.setBackground(Color.CYAN);
        setVisible(true);
        setBounds(500,500,500,800);

        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    }

    public MyJFrame() throws HeadlessException {
        JButton button = new JButton("点击弹出对话框");
        button.setBounds(0,0,100,100);
        JLabel jlabel = new JLabel("Hello!");
        jlabel.setBounds(200,300,200,100);
        jlabel.setHorizontalAlignment(SwingConstants.CENTER);
        add(button);
        add(jlabel);



        button.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                new MyDialog().init();
            }
        });

    }

}
class MyDialog extends JDialog{
    public void init(){
        Container container = getContentPane();
        container.setBackground(Color.BLUE);
        setBounds(400,400,300,550);
        setVisible(true);
    }

    public MyDialog() {
        JLabel jLabel = new JLabel("OK");
        jLabel.setBounds(10,20,50,40);
        add(jLabel);

    }
}

3.3 Icon、ImageIcon标签

package lesson07;

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

public class IconDemo extends JFrame implements Icon {

    public IconDemo() throws HeadlessException {
        setBounds(100,100,100,100);
    }

    private int width;
    private int height;

    public IconDemo(int width, int height) throws HeadlessException {
        this.width = width;
        this.height = height;
    }
    public void init(){
        Container container = getContentPane();
        container.add(new JLabel("hello", new IconDemo(15,15), SwingConstants.CENTER));
        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 width;
    }

    @Override
    public int getIconHeight() {
        return width;
    }

    public static void main(String[] args) {
        new IconDemo().init();
    }
}
package lesson08;

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

public class ImageDemo extends JFrame {
    public ImageDemo() throws HeadlessException {
        JLabel hello = new JLabel("hello");
        //图片放到out的对应文件夹下
        URL url = ImageDemo.class.getResource("头像01.jpg");
        hello.setIcon(new ImageIcon(url));
        hello.setHorizontalAlignment(SwingConstants.CENTER);

        Container container = getContentPane();
        container.add(hello);
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        pack();
        setVisible(true);
    }

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

3.4 Pannel面板

package lesson09;

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

public class JPanelDemo extends JFrame {
    public JPanelDemo() throws HeadlessException {
        Container container = getContentPane();
        container.setLayout(new GridLayout(2, 1, 10 ,10));//后两个参数代表间距

        JPanel panel = new JPanel();
        panel.add(new JButton("01"));
        panel.add(new JButton("02"));
        panel.add(new JButton("03"));
        container.add(panel);

        setVisible(true);
        pack();
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    }

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

JScroll面板(带滚动条)

package lesson09;

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


public class JScrollDemo extends JFrame {
    public JScrollDemo() {
        Container container = getContentPane();
        //文本域
        JTextArea textArea = new JTextArea();
        textArea.setText("欢迎学习wqwqrrqwrqrqrwqrqwrq" +'\n'+
                "qwerqrqrqrw" +'\n'+
                "wrqrqwrqrwrw!");

        //JScroll面板(滚动条)
        JScrollPane pane = new JScrollPane(textArea);
        container.add(pane);
        this.setVisible(true);
        this.setBounds(100,100,300,350);
        this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

    }

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

3.5 按钮


3.5.1 普通按钮

package lesson10;

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

public class JButtonDemo extends JFrame {
    public JButtonDemo(){
        Container container = getContentPane();
        //将一个图片变为图标
        URL url = JButtonDemo.class.getResource("头像01.jpg");
        ImageIcon icon = new ImageIcon(url);
        //创建按钮
        JButton jButton = new JButton(icon);
        jButton.setToolTipText("这是提示语");
        container.add(jButton);

        this.setVisible(true);
        this.pack();
        this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

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

3.5.2 单选框按钮

package lesson11;

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

public class JRadioButtonDemo extends JFrame {
    public JRadioButtonDemo(){
        Container container = getContentPane();
        //单选框,分组,只能选择一个
        JRadioButton jButton01 = new JRadioButton("01");
        JRadioButton jButton02 = new JRadioButton("02");
        JRadioButton jButton03 = new JRadioButton("03");
        ButtonGroup group = new ButtonGroup();
        group.add(jButton01);
        group.add(jButton02);
        group.add(jButton03);
        container.add(jButton01,BorderLayout.CENTER);
        container.add(jButton02, BorderLayout.NORTH);
        container.add(jButton03, BorderLayout.SOUTH);
        
        this.setVisible(true);
        this.setBounds(100,100,500,300);
        this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

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

3.5.3 复选框

package lesson11;

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

public class JCheckBoxDemo extends JFrame {
    public JCheckBoxDemo(){
        Container container = getContentPane();
        //多选框
        JCheckBox checkBox01 = new JCheckBox("01");
        JCheckBox checkBox02 = new JCheckBox("02");
        JCheckBox checkBox03 = new JCheckBox("03");
        container.add(checkBox01,BorderLayout.CENTER);
        container.add(checkBox02,BorderLayout.NORTH);
        container.add(checkBox03,BorderLayout.SOUTH);

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

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

3.6 列表


3.6.1 下拉框

package lesson12;

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class JComboBoxDemo extends JFrame {
    public JComboBoxDemo() throws HeadlessException {

        Container container = this.getContentPane();
        JComboBox<Object> status = new JComboBox<>();
        status.addItem("null");
        status.addItem("正在热映");
        status.addItem("已下架");
        status.addItem("即将上映");
        status.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                System.out.println(status.getSelectedIndex());//获取项序数
                System.out.println(status.getSelectedItem());//获取内容
            }
        });
        container.add(status);


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

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

3.6.2 列表框

String[]静态添加数据,Vector可动态调整数据

package lesson12;

import javax.swing.*;
import java.awt.*;
public class JComboBoxDemo extends JFrame {
    public JComboBoxDemo() throws HeadlessException {

        Container container = this.getContentPane();
        
        String[] content = {"1","2","3"};
        JList<Object> status = new JList<>(content);
        container.add(status);
        this.setVisible(true);
        this.setBounds(100,100,300,500);
        this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    }

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

3.7 文字组件


3.7.1 文本框

package lesson12;

import javax.swing.*;
import java.awt.*;
public class JComboBoxDemo extends JFrame {
    public JComboBoxDemo() throws HeadlessException {

        Container container = this.getContentPane();
        JTextField textField = new JTextField("hello");
        JTextField textField2 = new JTextField("world",10);
        container.add(textField,BorderLayout.NORTH);
        container.add(textField2,BorderLayout.SOUTH);
        this.setVisible(true);
        this.setBounds(100,100,300,500);
        this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    }

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

3.7.2 密码框

package lesson12;

import javax.swing.*;
import java.awt.*;
public class JComboBoxDemo extends JFrame {
    public JComboBoxDemo() throws HeadlessException {

        Container container = this.getContentPane();
        JPasswordField passwordField = new JPasswordField();
        passwordField.setEchoChar('*');
        container.add(passwordField);
        this.setVisible(true);
        this.setBounds(100,100,300,500);
        this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    }

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

3.7.3 文本域

package lesson09;

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


public class JScrollDemo extends JFrame {
    public JScrollDemo() {
        Container container = getContentPane();
        //文本域
        JTextArea textArea = new JTextArea();
        textArea.setText("欢迎学习wqwqrrqwrqrqrwqrqwrq" +'\n'+
                "qwerqrqrqrw" +'\n'+
                "wrqrqwrqrwrw!");

        //JScroll面板(滚动条)
        JScrollPane pane = new JScrollPane(textArea);
        container.add(pane);
        this.setVisible(true);
        this.setBounds(100,100,300,350);
        this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

    }

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

4. 贪吃蛇

StartGame

package snake;


import javax.swing.*;


//游戏中的主启动类
public class StartGame extends JFrame{
    public StartGame() {
        super("贪吃蛇");

        this.setBounds(10,10,900,720);
        this.setResizable(false);//设置窗体大小不可变
        this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        this.setVisible(true);
    }
    public void init(){
        this.add(new GamePanel());
    }

    public static void main(String[] args) {
        new StartGame().init();
    }
}

GamePanel

package snake;

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.util.Random;

//游戏的面板
public class GamePanel extends JPanel implements ActionListener {
    boolean isStart = false;//游戏状态参数
    boolean isFail = false;

    SnakeStructure snakeStructure = new SnakeStructure();
    Food food = new Food();
    Timer timer = new Timer(100,this);

    public GamePanel(){
        snakeStructure.init();
        food.init();
        //获得焦点和键盘事件
        this.setFocusable(true);
        this.addKeyListener(new MyKeyListener());
        //游戏一开始,定时器启动
        timer.start();
    }

    //定义蛇的数据结构
    class SnakeStructure {
        int score;//得分
        int length;//蛇的长度
        int[] snakeX = new int[600]; // 蛇的x坐标
        int[] snakeY = new int[500]; // 蛇的y坐标
        String fx;//方向
        //初始化方法
        public void init(){
            length = 3;
            score = 0;
            snakeX[0] = 100;snakeY[0] = 100;//脑袋的坐标
            snakeX[1] = 75;snakeY[1] = 100;//第一个身体的坐标
            snakeX[2] = 50;snakeY[2] = 100;//第二个身体的坐标
            fx = "R";//初始化方向为右
        }
    }


    //定义食物位置
    class Food{
        int foodX, foodY;
        Random random = new Random();
        //把食物随机分布在界面上
        public void init(){
            foodX = 25 + 25 * random.nextInt(34);
            foodY = 75 + 25 * random.nextInt(24);
        }
    }

    //键盘监听器
    class MyKeyListener extends KeyAdapter {
        @Override
        public void keyPressed(KeyEvent e) {
            int keyCode = e.getKeyCode();
            if (keyCode == KeyEvent.VK_SPACE) {
                if (isFail){
                    isFail = false;
                    snakeStructure.init();
                }
                else
                    isStart = !isStart;
            }
            repaint();
            //小蛇移动
            if (keyCode == KeyEvent.VK_UP){
                snakeStructure.fx = "U";
            }else if (keyCode == KeyEvent.VK_DOWN){
                snakeStructure.fx = "D";
            }else if (keyCode == KeyEvent.VK_LEFT){
                snakeStructure.fx = "L";
            }else if (keyCode == KeyEvent.VK_RIGHT){
                snakeStructure.fx = "R";
            }
        }
    }


    //事件监听---通过定时器实现,刷新
    public void actionPerformed(ActionEvent e) {
        if (isStart && !isFail){
            //吃食物
            if (snakeStructure.snakeX[0] == food.foodX && snakeStructure.snakeY[0] == food.foodY) {
                snakeStructure.length ++;
                snakeStructure.score += 10;
                food.init();//再次初始化食物
            }
            //身体移动
            for (int i = snakeStructure.length - 1; i > 0; i--) {
                snakeStructure.snakeX[i] = snakeStructure.snakeX[i-1];
                snakeStructure.snakeY[i] = snakeStructure.snakeY[i-1];
            }
            //走向
            if ("R".equals(snakeStructure.fx)){
                snakeStructure.snakeX[0] += 25;
                if (snakeStructure.snakeX[0] > 850)
                    snakeStructure.snakeX[0] = 25;
            }
            else if ("L".equals(snakeStructure.fx)){
                snakeStructure.snakeX[0] -= 25;
                if (snakeStructure.snakeX[0] < 25)
                    snakeStructure.snakeX[0] = 850;
            }
            else if ("U".equals(snakeStructure.fx)){
                snakeStructure.snakeY[0] -= 25;
                if (snakeStructure.snakeY[0] < 75)
                    snakeStructure.snakeY[0] = 650;
            }
            else if ("D".equals(snakeStructure.fx)){
                snakeStructure.snakeY[0] += 25;
                if (snakeStructure.snakeY[0] > 650)
                    snakeStructure.snakeY[0] = 75;
            }
            //失败判断,装到自己就算失败
            for (int i = 1; i < snakeStructure.length; i++){
                if (snakeStructure.snakeX[0] == snakeStructure.snakeX[i] && snakeStructure.snakeY[0] == snakeStructure.snakeY[i])
                    isFail = true;
            }
            repaint();
        }
        timer.start();
    }

    //绘制面板
    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);//清屏,避免闪烁
        //绘制静态面板
        this.setBackground(Color.WHITE);
        Date.header.paintIcon(this,g,25,11);//广告栏
        g.fillRect(25,75,850,600);//默认的游戏界面
        //计分板
        g.setColor(Color.CYAN);
        g.setFont(new Font("微软雅黑", Font.BOLD,18));
        g.drawString("长度" + snakeStructure.length, 750,35);
        g.drawString("分数" + snakeStructure.score, 750,60);
        //画出食物
        Date.food.paintIcon(this,g,food.foodX,food.foodY);
        //画出小蛇
        switch (snakeStructure.fx){
            case "R":   Date.right.paintIcon(this,g,snakeStructure.snakeX[0],snakeStructure.snakeY[0]);break;
            case "L":   Date.left.paintIcon(this,g,snakeStructure.snakeX[0],snakeStructure.snakeY[0]);break;
            case "U":   Date.up.paintIcon(this,g,snakeStructure.snakeX[0],snakeStructure.snakeY[0]);break;
            case "D":   Date.down.paintIcon(this,g,snakeStructure.snakeX[0],snakeStructure.snakeY[0]);break;
        }
        for (int i = 1; i < snakeStructure.length;i++){
            Date.body.paintIcon(this,g,snakeStructure.snakeX[i],snakeStructure.snakeY[i]);//身体初始化
        }

        //游戏状态
        if (isStart == false){
            g.setColor(Color.WHITE);
            g.setFont(new Font("微软雅黑", Font.BOLD,40));
            g.drawString("按下空格开始游戏",300,300);
        }
        if (isFail == true){
            g.setColor(Color.red);
            g.setFont(new Font("微软雅黑", Font.BOLD,40));
            g.drawString("按下空格开始游戏",300,300);
        }
    }
}

Date

package snake;

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

public class Date {
    private static URL headerURl = Date.class.getResource("/statics/header.png");
    private static URL upURL = Date.class.getResource("/statics/up.png");
    private static URL downURL = Date.class.getResource("/statics/down.png");
    private static URL leftURl = Date.class.getResource("/statics/left.png");
    private static URL rightURL = Date.class.getResource("/statics/right.png");
    private static URL bodyURL = Date.class.getResource("/statics/body.png");
    private static URL foodURL = Date.class.getResource("/statics/food.png");
    public static ImageIcon header = new ImageIcon(headerURl);
    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 ImageIcon body = new ImageIcon(bodyURL);
    public static ImageIcon food = new ImageIcon(foodURL);
}
posted @ 2021-07-22 19:49  Jezer  阅读(73)  评论(0)    收藏  举报