JAVAswing实现贪吃蛇

//游戏主体

package com.anlong.贪吃蛇;

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

/**
 * @author bujiasisuo
 * @create 2020-05-09-10:18
 * @Version 1.0
 * 功能:贪吃蛇小游戏
 * 蛇的身体位置存放在数组中,移动即只改变第一个,数组元素以此后移。
 * 通过实现ActionListener接口使用时钟事件
 * new Timer(时间(毫秒),this(用于那个窗口));
 *
 */
//主界面
public class GreedySnake extends JFrame implements ActionListener {
    
    

    public MyPanel panel = new MyPanel();
    public Timer timer = new Timer(200,this);
    public Snake snake = new Snake();
    public Ball ball = new Ball();

    public void init(){
    
    

        this.setLocation(300,300);
        this.setSize(816,639);
        this.setResizable(false);
        this.add(panel);
        this.setVisible(true);
        this.setDefaultCloseOperation(3);

        KayListener(panel);
//        Insets insets = getInsets();// 得到窗口的边界区域。
//        System.out.println("窗口边框上"+insets.top);//上
//        System.out.println("窗口边框下"+insets.bottom);//下
//        System.out.println("窗口边框左"+insets.left);//左
//        System.out.println("窗口边框右"+insets.right);//右
//
//        Dimension di = getContentPane().getSize();//内容面板的大小
//        System.out.println("内容面板宽度"+di.width);//宽
//        System.out.println("内容面板的高度"+di.height);//高
    }

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

    //时钟事件
    @Override
    public void actionPerformed(ActionEvent e) {
    
    
//        System.out.println("X:"+snake.getX()[0]+",Y"+snake.getY()[0]);

        if(!ball.isStatus())
        {
    
    
            ball.init();
//            System.out.println("1111111111111111111111");
        }
        if(ball.getX()==snake.getX()[0] && ball.getY()==snake.getY()[0])
        {
    
    
            panel.setScore(1);
            snake.setLength();
            ball.setStatus();
        }

        for (int i = snake.getLength(); i > 0 ; i--) {
    
    
            snake.getX()[i] = snake.getX()[i-1];
            snake.getY()[i] = snake.getY()[i-1];
        }
        snake.getX()[0] = snake.getX()[0] + panel.getXvalue();
        snake.getY()[0] = snake.getY()[0] + panel.getYvalue();

//        System.out.println("X:"+snake.getX()[0]+",Y"+snake.getY()[0]);
//        System.out.println("-X:"+snake.getX()[2]+",Y"+snake.getY()[2]);
        if(snake.getX()[0] < 35 || snake.getX()[0] > 755 || snake.getY()[0] < 85 || snake.getY()[0] > 565)
        {
    
    
            new MyJDialog();
            timer.stop();
        }

        for (int i = 2; i < snake.getLength(); i++) {
    
    
            if(snake.getX()[0]==snake.getX()[i] && snake.getY()[0]==snake.getY()[i])
            {
    
    
                new MyJDialog();
                timer.stop();
            }
        }

        panel.repaint();
    }

    //键盘事件
    public void KayListener(MyPanel panel){
    
    
        this.addKeyListener(new KeyAdapter() {
    
    
            @Override
            public void keyPressed(KeyEvent e) {
    
    

                if(e.getKeyCode()==32)
                {
    
    
                    panel.setStatus();
                    if(panel.getStatus())
                    {
    
    
                        timer.start();
                    }
                    else
                    {
    
    
                        timer.stop();
                    }

                }else if(e.getKeyCode()==37)
                {
    
    
                    //左
                    panel.setYValue(0);
                    panel.setXValue(-10);
                }else if(e.getKeyCode()==38){
    
    
                    //上
                    panel.setXValue(0);
                    panel.setYValue(-10);
                }else if(e.getKeyCode()==39){
    
    
                    //右
                    panel.setYValue(0);
                    panel.setXValue(10);
                }else if(e.getKeyCode()==40){
    
    
                    //下
                    panel.setXValue(0);
                    panel.setYValue(10);
                }
                panel.repaint();
            }
        });
    }

    //游戏面板
    class MyPanel extends JPanel{
    
    
        private boolean status = false;
        private int score = 0;
        private int Xvalue = 10;
        private int Yvalue = 0;

        @Override
        protected void paintComponent(Graphics g) {
    
    
            super.paintComponent(g);
            g.setColor(Color.blue);
            g.setFont(new Font("微软雅黑",Font.BOLD,40));
            g.drawString("贪吃蛇小游戏",25,40);
            g.setFont(new Font("微软雅黑",Font.BOLD,20));
            g.drawString("长度:" + snake.getLength(),280,23);
            g.drawString("得分:" + score,280,43);
            g.setColor(Color.RED);
            g.fillRect(25,75,750,510);
            g.setColor(Color.black);
            g.fillRect(35,85,730,490);

            if(!status)
            {
    
    
                g.setColor(Color.white);
                g.setFont(new Font("微软雅黑",Font.BOLD,40));
                g.drawString("点击空格开始游戏。",200,300);
            }

            g.setColor(Color.pink);
            g.fillOval(ball.getX(),ball.getY(),10,10);
//            System.out.println(ball.getX()+","+ball.getY());
            for(int i=snake.getLength()-1;i>=0;i--)
            {
    
    
                if(i==0)
                {
    
    
                    g.setColor(Color.orange);
                    g.fillOval(snake.getX()[i],snake.getY()[i],10,10);
                }
                else
                {
    
    
                    g.setColor(Color.yellow);
                    g.fillRect(snake.getX()[i],snake.getY()[i],10,10);
                }
            }

        }

        public void setStatus(){
    
    
            this.status = !this.status;
        }

        public boolean getStatus(){
    
    
            return this.status;
        }

        public void setXValue(int v){
    
    
            this.Xvalue = v;
        }

        public void setYValue(int v){
    
    
            this.Yvalue = v;
        }

        public int getXvalue() {
    
    
            return Xvalue;
        }

        public int getYvalue() {
    
    
            return Yvalue;
        }

        public void setScore(int n) {
    
    
            this.score += n;
        }

        public int getScore(){
    
    
            return this.score;
        }
    }

    //弹窗
    class MyJDialog extends JDialog{
    
    

        public MyJDialog(){
    
    
            this.setTitle("温馨提示");
            this.setBounds(400,400,200,150);

            JLabel label = new JLabel("游戏结束。");
            label.setHorizontalAlignment(0);
            this.add(label);

            this.setVisible(true);

            addWindowListener(new WindowAdapter() {
    
    

                @Override
                public void windowClosing(WindowEvent e) {
    
    
                    snake = new Snake();
                    panel.repaint();
                    panel.setStatus();
                    panel.setYValue(0);
                    panel.setXValue(10);
                    panel.setScore(-panel.score);
                }
            });
        }

    }

}

小球

package com.anlong.贪吃蛇;

/**
 * @author bujiasisuo
 * @create 2020-05-09-17:00
 * @Version 1.0
 * 功能:小球
 */
public class Ball {
    
    
    private boolean status = false;
    private int x=0;
    private int y=0;

    public void init(){
    
    
        this.status = true;
        this.x = (int)((Math.random()*730)/10)*10+35;
        this.y = (int)((Math.random()*480)/10)*10+85;

        System.out.println(x+","+y);
    }

    public boolean isStatus() {
    
    
        return status;
    }

    public void setStatus() {
    
    
        this.status = !status;
    }

    public int getX() {
    
    
        return x;
    }

    public int getY() {
    
    
        return y;
    }
}

蛇的身体

package com.anlong.贪吃蛇;

/**
 * @author bujiasisuo
 * @create 2020-05-09-15:16
 * @Version 1.0
 * 功能:贪吃蛇身体
 */
public class Snake {
    
    
    private int length = 0;
    private int[] x;
    private int[] y;

    public Snake(){
    
    
        this.length = 3;
        this.x = new int[500];
        this.y = new int[500];

        for (int i = 0; i < 3; i++) {
    
    
            x[i] = 55-(i*10);
            y[i] = 95;
        }
    }

    public int getLength() {
    
    
        return length;
    }

    public void setLength() {
    
    
        this.length++;
    }

    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;
    }

}

猜你喜欢

转载自blog.csdn.net/DRAGON_ranhou/article/details/108765926