0
点赞
收藏
分享

微信扫一扫

贪吃蛇(Java实现)

一葉_code 2022-03-12 阅读 72

本人纯纯java入门,目前所发文章大部分参考其他大佬文章或视频所写

-----文章少文字,纯代码--------

-----有问题欢迎私信--------------

import javax.swing.*;
import java.awt.*;
import java.awt.Graphics;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.util.LinkedList;
import java.util.TimerTask;
import java.util.Timer;



public class MainFrame extends JFrame {

    //蛇
    private Snake snake;
    private JPanel jPanel;
    private Timer timer;//定时器,在指定的时间调用蛇移动的方法
    private Node food;//食物

    public MainFrame() throws HeadlessException {
        //初始化窗体参数
        initFrame();
        //初始化游戏棋盘
        initGamePanel();
        //食物
        initFood();
        //初始化蛇
        initSnake();
        //初始化定时器
        initTimer();
        //设置键盘监听
        setKeyListener();
    }

    private void initFood(){
        food=new Node();
        food.random();
    }

    private void setKeyListener(){
        addKeyListener(new KeyAdapter() {
            //当键盘按下时,会自动调用此方法
            @Override
            public void keyPressed(KeyEvent e){
               //键盘中的每一个键都有一个编号
                switch (e.getKeyCode()){
                    case KeyEvent.VK_UP :
                        if(snake.getDirection()!=Direction.DOWN){
                        //修改蛇的运动方向
                        snake.setDirection(Direction.UP);
                        }
                        break;
                    case KeyEvent.VK_DOWN:
                        if(snake.getDirection()!=Direction.UP) {
                            snake.setDirection(Direction.DOWN);
                        }
                        break;
                    case KeyEvent.VK_LEFT:
                        if(snake.getDirection()!=Direction.RIGHT) {
                            snake.setDirection(Direction.LEFT);
                        }
                        break;
                    case KeyEvent.VK_RIGHT:
                        if(snake.getDirection()!=Direction.LEFT) {
                            snake.setDirection(Direction.RIGHT);
                        }
                        break;
                }
            }
        });
    }

    //初始化定时器
    private void initTimer(){
        timer =new Timer();

        //初始化定时任务
        TimerTask timerTask=new TimerTask() {
            @Override
            public void run() {
                snake.move();
                //判断蛇头是否和食物重合
                Node head=snake.getBody().getFirst();
                if(head.getX()== food.getX()&&head.getY()==food.getY()){
                    snake.eat(food);
                    food.random();
                }

                //重绘游戏棋盘
                jPanel.repaint();
            }
        };

        //每100ms,执行一次定时任务
        timer.scheduleAtFixedRate(timerTask,0,100);
    }

    public static void main(String[] args) {
        //创建窗体对象,并显示
        new MainFrame().setVisible(true);
    }

    private void initSnake() {
        snake = new Snake();
    }

    private void initGamePanel() {
        jPanel=new JPanel(){

            //Graphics g 可以看成一支画笔(绘制一些基本的图形)

            @Override
            public void paint(Graphics g) {

                //清空棋盘
                g.clearRect(0,0,600,600);

                //绘制40条横线

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

                //绘制蛇
                LinkedList<Node> body = snake.getBody();
                for(Node node:body){
                    g.fillRect(node.getX()*15, node.getY()*15,15,15 );
                    g.setColor(Color.BLACK);
                }

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


            }
        };

    //把棋盘加入到窗体中
        add(jPanel);

}


    //初始化窗体参数
    private void initFrame() {
        //设置窗体宽高
        setSize(618, 640);
        //设置窗体的位置
        setLocation(400, 400);
        //设置关闭按钮的作用()退出程序
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        //设置窗体大小可变
        setResizable(false);
    }
}

采用节点类绘制蛇

/*节点类:
每一条蛇是由若干个节点组成的,每一个节点有横坐标来确定位置
* */
public class Node {
    private int x;
    private int y;

    public Node(){

    }

    public Node(int x,int y){
        this.x=x;
        this.y=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;
    }

    //随机生成位置的方法
    public void random(){
        //创建一个random对象
        Random r=new Random();
        //随机生成横坐标
        this.x=r.nextInt(40);
        //随机生成纵坐标
        this.y=r.nextInt(40);

    }
}

采用枚举确定方向

/*枚举:就是几个固定的常量*/

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

 

 蛇类

/*Snake类表示蛇:
一条蛇有多个节点使用LinkedList集合存储Node节点,蛇出生时有9个节点
 */

public class Snake {
    //body
    private LinkedList<Node>body;
    //蛇的运动方向,默认向左
    private Direction direction=Direction.LEFT;
    //蛇是否活着
    private boolean isLiving=true;

    public Snake (){
        //初始化蛇
        initSnake();
    }

    private void initSnake(){
        //创建结合
        body=new LinkedList<>();
        //创建9个节点
        body.add(new Node(10,20));
        body.add(new Node(11,20));
        body.add(new Node(12,20));
        body.add(new Node(13,20));
        body.add(new Node(14,20));
        body.add(new Node(15,20));
        body.add(new Node(16,20));
        body.add(new Node(17,20));
        body.add(new Node(18,20));
    }

    //蛇沿着头部方向运动
    //控制蛇的移动:在蛇头的运动方向添加一个节点,然后把蛇尾的节点删除
    public void move() {
        if (isLiving) {
            //获取蛇头
            Node head = body.getFirst();
            switch (direction) {
                case UP:
                    body.addFirst(new Node(head.getX(), head.getY() - 1));
                    break;
                case DOWN:
                    body.addFirst(new Node(head.getX(), head.getY() + 1));
                    break;
                case LEFT:
                    body.addFirst(new Node(head.getX() - 1, head.getY()));
                    break;
                case RIGHT:
                    body.addFirst(new Node(head.getX() + 1, head.getY()));
                    break;
            }
            //删除最后的节点
            body.removeLast();

            //判断蛇是否撞墙
            head=body.getFirst();
            if(head.getX()<0||head.getY()<0||head.getX()>=40||head.getY()>=40){
                isLiving=false;
            }

            //判断蛇是否碰到自己的身体
            for(int i=1;i<body.size();i++){
                Node node=body.get(i);
                if(head.getX()== node.getX()&&head.getY()== node.getY()){
                    isLiving=false;
                }
            }
        }
        else{

        }
    }


    public LinkedList<Node> getBody() {
        return body;
    }

    public void setBody(LinkedList<Node> body) {
        this.body = body;
    }

    public Direction getDirection() {
        return direction;
    }

    public void setDirection(Direction direction) {
        this.direction = direction;
    }

    //蛇吃食物:沿着蛇的移动方向添加一个节点
    public void eat(Node food) {
        Node head = body.getFirst();
        switch (direction) {
            case UP:
                body.addFirst(new Node(head.getX(), head.getY() - 1));
                break;
            case DOWN:
                body.addFirst(new Node(head.getX(), head.getY() + 1));
                break;
            case LEFT:
                body.addFirst(new Node(head.getX() - 1, head.getY()));
                break;
            case RIGHT:
                body.addFirst(new Node(head.getX() + 1, head.getY()));
                break;
        }
    }
}
举报

相关推荐

0 条评论