各个功能的实现总的来说就是如下几步:

  1. 定义数据

  2. 画上去

  3. 监听事件(键盘、事件)

    具体代码如下:

    Data.java

    public class Data {
        public static URL bodyUrl = Data.class.getResource("statics/body.png");
        public static ImageIcon body = new ImageIcon(bodyUrl);
        public static URL downUrl = Data.class.getResource("statics/down.png");
        public static ImageIcon down = new ImageIcon(downUrl);
        public static URL foodUrl = Data.class.getResource("statics/food.png");
        public static ImageIcon food = new ImageIcon(foodUrl);
        public static URL headerUrl = Data.class.getResource("statics/header.png");
        public static ImageIcon header = new ImageIcon(headerUrl);
        public static URL leftUrl = Data.class.getResource("statics/left.png");
        public static ImageIcon left = new ImageIcon(leftUrl);
        public static URL rightUrl = Data.class.getResource("statics/right.png");
        public static ImageIcon right = new ImageIcon(rightUrl);
        public static URL upUrl = Data.class.getResource("statics/up.png");
        public static ImageIcon up = new ImageIcon(upUrl);
    }
    
    

    GamePanel.java

    //游戏的面板
    public class GamePanel  extends JPanel implements KeyListener, ActionListener {
        //定义蛇的数据结构
        int length;//蛇的长度
        int[] snakeX = new int[600];//蛇的X坐标 25*25
        int[] snakeY = new int[500];//蛇的Y坐标 25*25
        String fx;
    
        //食物的坐标
        int foodx;
        int foody;
        Random random = new Random();
    
        int score;//成绩
    
    
        //游戏当前的状态:开始/停止
        boolean isStart = false;//默认是不开始
    
        boolean isfail = false;//游戏失败状态
    
        //定时器 以ms为单位 1000ms = 1s
        Timer timer = new Timer(150,this);//100ms执行一次
    
        //构造器
        public GamePanel() {
            init();
            //获得焦点和键盘事件
            this.setFocusable(true);//获得焦点事件
            this.addKeyListener(this);//获得键盘监听事件
            timer.start();//游戏一开始就启动
        }
    
        //初始化方法
        public void init(){
            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);
    
            score = 0;
    
        }
    
    
    
    
        //绘制画板,所有东西都是用这个画笔来画
        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);//清屏
    
            //绘制静态的面板
            this.setBackground(Color.WHITE);
            Data.header.paintIcon(this, g, 25, 11);//头部广告栏
            g.fillRect(25,75,850,600);//默认的游戏界面
    
            //把蛇画上去
            if (fx.equals("R")){
                Data.right.paintIcon(this,g,snakeX[0],snakeY[0]);
            }else if(fx.equals("L")){
                Data.left.paintIcon(this,g,snakeX[0],snakeY[0]);
            }else if(fx.equals("U")){
                Data.up.paintIcon(this,g,snakeX[0],snakeY[0]);
            }else if(fx.equals("D")){
                Data.down.paintIcon(this,g,snakeX[0],snakeY[0]);
            }
    
            for (int i = 1; i < length; i++) {
                Data.body.paintIcon(this,g,snakeX[i],snakeY[i]);
            }
    
            //画食物
            Data.food.paintIcon(this,g,foodx,foody);
    
            //画积分
            g.setColor(Color.WHITE);
            g.setFont(new Font("微软雅黑", Font.BOLD, 18));
            g.drawString("长度"+length,750,35);
            g.drawString("分数"+score,750,50);
    
    
            //游戏状态
            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);
            }
    
        }
    
        //键盘监听事件
        @Override
        public void keyPressed(KeyEvent e) {
            int keyCode = e.getKeyCode();//获得键盘按键是哪一个
            if (keyCode == KeyEvent.VK_SPACE) {//如果按下的是空格键
                if (isfail) {
                    //重新开始
                    isfail = false;
                    init();
                } else {
                    isStart = !isStart;//取反
                }
                repaint();
            }
    
            //小蛇移动
            if (keyCode == KeyEvent.VK_UP) {
                fx = "U";
            } else if (keyCode == KeyEvent.VK_DOWN) {
                fx = "D";
            } else if (keyCode == KeyEvent.VK_LEFT) {
                fx = "L";
            } else if (keyCode == KeyEvent.VK_RIGHT) {
                fx = "R";
    
            }
        }
    
        //事件监听
        @Override
        public void actionPerformed(ActionEvent e) {
            if(isStart && isfail==false){//符合条件就让蛇动起来
                //右移
                for (int i = length-1; i >  0; i--) {
                    snakeX[i] = snakeX[i-1];
                    snakeY[i] = snakeY[i-1];
                }
    
                //走向
                if (fx.equals("R")){
                    snakeX[0] = snakeX[0]+25;
                    if (snakeX[0]>850){ snakeX[0] = 25;}//边界判断
                }else if (fx.equals("L")){
                    snakeX[0] = snakeX[0]-25;
                    if (snakeX[0]<25){ snakeX[0] = 850;}//边界判断
                } else if (fx.equals("U")){
                    snakeY[0] = snakeY[0]-25;
                    if (snakeY[0]<75){ snakeY[0] = 650;}//边界判断
                } else if (fx.equals("D")){
                    snakeY[0] = snakeY[0]+25;
                    if (snakeY[0]>650){ snakeY[0] = 75;}//边界判断
                }
    
                //吃食物
                if(snakeX[0] == foodx && snakeY[0] ==foody){
                    //长度1
                    length++;
                    //分数加10
                    score = score +10;
                    //再次随机食物
                    foodx = 25 + 25*random.nextInt(34);
                    foody = 75 +25*random.nextInt(24);
                }
    
                //失败判断(撞到自己算失败)
                for (int i = 1; i < length; i++) {
                    if (snakeX[0] == snakeX[i] && snakeY[0] == snakeY[i]){
                        isfail = true;
                    }
                }
    
    
                repaint();//重画页面
            }
            timer.start();//定时器开启
        }
    
        @Override
        public void keyTyped(KeyEvent e) {
    
        }
    
    
        @Override
        public void keyReleased(KeyEvent e) {
    
        }
    
    }
    

StartGame.java

//游戏的主启动类
public class StartGame {
    public static void main(String[] args) {
        JFrame frame = new JFrame();
        frame.setBounds(10, 10, 900, 720);
        frame.setResizable(false);
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

        frame.add(new GamePanel());
        frame.setVisible(true);
    }
}

效果图:

版权声明:本文为hellowen原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/hellowen/p/12852790.html