Schreiben Sie ein Schlangenspiel in Java

Inhaltsverzeichnis

Formular erstellen

Erstellen Sie ein Spielbrett

Erstellen Sie den Schlangenknoten

Erstellen Sie einen Schlangenkörper

Bringe die Schlange in Bewegung

Tastaturüberwachung hinzufügen

Grenzverarbeitung hinzufügen

Zeichnen Sie Essen auf die Tafel

Essen essen


Formular erstellen

Erstellen Sie eine MainFrame-Klasse, die JFrame erbt, um das Hauptformular darzustellen.

public class MainFrame extends JFrame {
    //创建窗体对象时,初始化船体参数
    public MainFrame(){
        initFrame();
    }
}

Schreiben Sie eine initFrame-Methode in die MainFrame-Klasse, um die Formularparameter zu initialisieren

//1.初始化窗体参数
private void initFrame() {
    //设置窗体标题
    setTitle("黑马贪吃蛇");
    //设置窗体大小
    setSize(610, 640);
    //设置窗体位置
    setLocation(400, 400);
    //设置窗体大小不能改变
    setResizable(false);
    //设置窗体关闭按钮的作用,是正常退出
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}

Fügen Sie eine Hauptmethode in MainFrame hinzu, erstellen Sie das Formular und führen Sie es aus, und Sie können das Formular sehen

//主方法
public static void main(String[] args) {
    //创建窗体,并显示在屏幕上
    new MainFrame().setVisible(true);
}

Erstellen Sie ein Spielbrett

Schreiben Sie eine initGamePanel-Methode in die JFrame-Klasse, um das Spielbrett zu initialisieren

//初始化游戏面板
private void initGamePanel() {
    JPanel jPanel = new JPanel() {
        //paint是用来绘制面板中的内容
        @Override
        public void paint(Graphics g) {
            //设置画笔颜色
            g.setColor(Color.black); //设置画笔颜色是黑色
            //绘制40条横线(起点横坐标,起点纵坐标,终点横坐标,终点纵坐标)
            for(int i=1;i<=40;i++){
                g.drawLine(0,15*i,600,15*i);
            }

            //绘制40条竖线
            for (int i=1;i<=40;i++){
                g.drawLine(15*i,0,15*i,600);
            }
        }
    };
    add(jPanel);
}

Erstellen Sie den Schlangenknoten

Erstellen Sie eine Node-Klasse, um den Knoten darzustellen. Eine Schlange besteht aus mehreren Knoten. Jeder Knoten ist eigentlich ein kleines Quadrat. Wir verwenden Zeilen und Spalten, um die Position des Knotens auf dem Schachbrett zu definieren.

public class Node {
    private int x; //横坐标
    private int y; //纵坐标

    public int getX() {
        return x;
    }

    public void setX(int x) {
        this.x = x;
    }

    public int getY() {
        return y;
    }

    public void setY(int y) {
        this.y = y;
    }
}

Erstellen Sie einen Schlangenkörper

Erstellen Sie eine Snake-Klasse, um eine Schlange darzustellen. Eine Schlange hat mehrere Knoten und verwendet eine LinkedList-Sammlung zum Speichern von Node-Knoten. Wenn eine Schlange geboren wird, hat sie 3 Knoten.

public class Snake {
    //body
    private LinkedList<Node> body;
    
    //创建蛇对象时,初始化蛇身
    public Snake() {
        initSnake();
    }

    //初始化蛇身 3个节点
    public void initSnake(){
        //创建蛇的躯体
        body=new LinkedList<>();
        //给蛇添加3个节点,在棋盘的中心位置横向排列
        body.add(new Node(20,20));
        body.add(new Node(21,20));
        body.add(new Node(22,20));
    }
  
    //获取蛇蛇身
    public LinkedList<Node> getBody(){
        return body;
    }
}

Zeichne die Schlange auf die Tafel

Fügen Sie eine Mitgliedsvariable hinzu, um eine Schlange im MainFrame zu erstellen und anzuzeigen, dass das Formular eine Schlange enthält

public class MainFrame extends JFrame {
    //定义成员变量
    private Snake snake=new Snake();
	....
}

Fügen Sie in der Malmethode, mit der das Schachbrett gezeichnet wird, den folgenden Code hinzu, um die Schlange auf das Schachbrett zu zeichnen.

//绘制横线
...
//绘制竖线
...

//绘制蛇,根据每一个节点的坐标在棋盘上绘制矩形
for (Node node : snake.getBody()) {
    //每一个节点的宽度和高度是15
    g.fillRect(node.getX()*15,node.getY()*15,15,15);
} 

 Führen Sie es erneut aus und Sie werden eine Schlange sehen, die ruhig in der Mitte des Schachbretts liegt.

Bringe die Schlange in Bewegung

Definieren Sie einen Aufzählungstyp zur Darstellung der vier Bewegungsrichtungen

public enum  Direction {
    UP,DOWN,LEFT,RIGHT
}

Definieren Sie eine Mitgliedsvariable für die Bewegungsrichtungsvariable und eine Bewegungsmethode in der Snake-Klasse.

public class Snake{
    //蛇头运动的方向
    private Direction direction;
    
    //移动的方法: 每次移动在蛇头运动方向添加一个节点,再删除最后一个节点
    public void move(){
        //获取蛇头的节点
        Node head = body.getFirst();
        //新的蛇头节点
        Node newHead=null;
        //检查移动的方向
        switch (direction){
            //如果向左移动
            case LEFT:
                //创建一个新的蛇头节点
                 newHead=new Node(head.getX()-1,head.getY());
                //把心得蛇头节点添加到body的第一个元素
                body.addFirst(newHead);
                //删除蛇尾
                body.removeLast();
                break;
            case RIGHT:
                //创建一个新的蛇头节点
                newHead=new Node(head.getX()-1,head.getY());
                //把心得蛇头节点添加到body的第一个元素
                body.addFirst(newHead);
                //删除蛇尾
                body.removeLast();
                break;
            case UP:
                //创建一个新的蛇头节点
                newHead=new Node(head.getX(),head.getY()-1);
                //把心得蛇头节点添加到body的第一个元素
                body.addFirst(newHead);
                //删除蛇尾
                body.removeLast();
                break;
            case DOWN:
                //创建一个新的蛇头节点
                newHead=new Node(head.getX(),head.getY()+1);
                //把心得蛇头节点添加到body的第一个元素
                body.addFirst(newHead);
                //删除蛇尾
                body.removeLast();
                break;
        }
    }
}

 Erstellen Sie in der MainFrame-Klasse einen Timer, um das Spielbrett alle 100 Millisekunden neu zu zeichnen.

public class MainFrame extends JFrame {
    ...
    //游戏棋盘面板
    JPanel jPanel=null;
    //定义定时器
    private Timer timer;
    
    public MainFrame() throws HeadlessException {
        //初始化窗体参数
        initFrame();
        //初始化窗体中的游戏面板
        initGamePanel();
        //初始化定时器
        initTimer();
    }
    
    //2.初始化游戏棋盘
    private void initGamePanel() {
         jPanel = new JPanel() {
            //paint是用来绘制面板中的内容
            @Override
            public void paint(Graphics g) {
				//每次重绘时清空面板中的内容
                g.clearRect(0,0,getWidth(),getHeight());
               	....
            }
        };
        add(jPanel);
    }

    //3.初始化定时器
    private void initTimer() {
        TimerTask task=new TimerTask() {
            @Override
            public void run() {
                //调用蛇移动的方法
                snake.move();
                //每次移动重绘游戏棋盘,会自动调用jPanel的paint方法
                jPanel.repaint();
            }
        };
        timer=new Timer();
        timer.scheduleAtFixedRate(task,0,100);
    }
}

Tastaturüberwachung hinzufügen

Fügen Sie in der MainFrame-Klasse eine setKeyListener-Methode hinzu, um auf die vier Tasten oben, unten, links und rechts zu warten

public class MainFrame extends JFrame {
    ...
    public MainFrame() throws HeadlessException {
       	...
        //添加键盘监听
        setkeyListener();
    }
    
    //添加键盘监听
    private void setkeyListener() {
        //对上下左右键进行监听
        addKeyListener(new KeyAdapter() {
            @Override
            public void keyPressed(KeyEvent e) {
                switch (e.getKeyCode()){
                    //按下上键
                    case KeyEvent.VK_UP:
                        //蛇头方向改为上
                        snake.setDirection(Direction.UP);
                        break;
                    //按下下键
                    case KeyEvent.VK_DOWN:
                        //蛇头方向改为下
                        snake.setDirection(Direction.DOWN);
                        break;
                    //按下左键
                    case KeyEvent.VK_LEFT:
                        //蛇头方向改为左
                        snake.setDirection(Direction.LEFT);
                        break;
                    //按下右键
                    case KeyEvent.VK_RIGHT:
                        //蛇头方向改为右
                        snake.setDirection(Direction.RIGHT);
                        break;
                }
            }
        });
    }
}

Jetzt kann die Schlange der Tastaturbewegung folgen

Grenzverarbeitung hinzufügen

Das Spiel endet, wenn die Schlange die Grenze erreicht. Ändern Sie die Flagge auf „falsch“.

public class Snake{
    ...
    //定义一个标记true表示蛇是活的,可以运动
    private boolean isLive=true;
    
    //检查蛇是否碰壁
    private void checkOver() {
        //获取蛇头
        Node head = body.getFirst();
        int x=head.getX();
        int y=head.getY();
        if(x<0||y<0||x>=40||y>=40){
            isLive=false;
        }
    }
}

Rufen Sie die checkOver()-Methode im Timer auf

//3.初始化定时器
private void initTimer() {
    TimerTask task=new TimerTask() {
        @Override
        public void run() {
            //移动
            snake.move();
            //检查是否碰壁
            snake.checkOver();
        }
    };
    timer=new Timer();
    timer.scheduleAtFixedRate(task,0,100);
}

Zeichnen Sie Essen auf die Tafel

Erstellen Sie eine Food-Klasse, um Lebensmittel darzustellen. Tatsächlich ist Essen auch ein Knoten, also lassen Sie Food den Knoten erben.

public class Food extends Node {
    //创建食物的时候,随机产生一个位置
    public Food() {
        reset();
    }
    //随产生位置
    public void reset(){
        //随机生成食物的坐标
        Random r=new Random();
        setX(r.nextInt(40));
        setY(r.nextInt(40));
    }
}

Definieren Sie im MainFrame ein Mitglied „Food“, um Lebensmittel darzustellen, und zeichnen Sie die Lebensmittel auf dem Schachbrett

public class MainFrame extends JFrame {
    //定义食物
    private Node food=new Node();
    
    public MainFrame() throws HeadlessException {
        //初始化窗体参数
        initFrame();
        //初始化窗体中的游戏面板
        initGamePanel();
        //初始化定时器
        initTimer();
        //添加键盘监听
        setkeyListener();
    }
    
    //2.初始化游戏棋盘
    private void initGamePanel() {
         jPanel = new JPanel() {
            //paint是用来绘制面板中的内容
            @Override
            public void paint(Graphics g) {
                //清空棋盘
                g.clearRect(0,0,600,600);
                
                //绘制横线、绘制竖线、绘制蛇

                //绘制食物
                g.fillRect(food.getX()*15,food.getY()*15,15,15);
            }
        };
        add(jPanel);
    }
}

Essen essen

Fügen Sie der Snake-Klasse eine eatFood-Methode hinzu

//吃食物
public void eatFood() {
    //获取蛇头
    Node head = body.getFirst();
    //如果蛇头和食物的位置重合,就在蛇头添加一个元素
  	if(head.getX()==MainFrame.food.getX()
     	&&head.getY()==MainFrame.food.getY()){
        //沿着蛇头运动方向创建一个节点
        //新的蛇头节点
        Node newHead=null;
        //检查移动的方向
        switch (direction){
                //如果向左移动
            case LEFT:
                //创建一个新的蛇头节点
                newHead=new Node(head.getX()-1,head.getY());
                //把心得蛇头节点添加到body的第一个元素
                body.addFirst(newHead);
                break;
            case RIGHT:
                //创建一个新的蛇头节点
                newHead=new Node(head.getX()+1,head.getY());
                //把心得蛇头节点添加到body的第一个元素
                body.addFirst(newHead);
                break;
            case UP:
                //创建一个新的蛇头节点
                newHead=new Node(head.getX(),head.getY()-1);
                //把心得蛇头节点添加到body的第一个元素
                body.addFirst(newHead);
                break;
            case DOWN:
                //创建一个新的蛇头节点
                newHead=new Node(head.getX(),head.getY()+1);
                //把心得蛇头节点添加到body的第一个元素
                body.addFirst(newHead);
                break;
        }
        //每次吃完食物,让食物重置
        MainFrame.food.reset();
    }
}

Rufen Sie die Art und Weise des Essens im Timer auf

//2.初始化游戏棋盘
private void initGamePanel() {
    jPanel = new JPanel() {
        //paint是用来绘制面板中的内容
        @Override
        public void paint(Graphics g) {
            //清空棋盘
            g.clearRect(0,0,600,600);

            //绘制横线、绘制竖线、绘制蛇

            //绘制食物
            g.fillRect(food.getX()*15,food.getY()*15,15,15);
        }
    };
    add(jPanel);
}

Supongo que te gusta

Origin blog.csdn.net/2301_76549195/article/details/134489845
Recomendado
Clasificación