快捷搜索: 长连接 前端 源码 pan

贪吃蛇代码(详细注解)

主程序类

package com.qiu.snake;

import javax.swing.*;

//主程序
public class GamesStart {
          
   

    public static void main(String[] args) {
          
   
        //创建窗口
        JFrame jFrame=new JFrame();
        //设置窗口的名字
        jFrame.setTitle("贪吃蛇(简易版)");
        //设置窗口的大小与位置
        jFrame.setBounds(160,140,900,720);
        //设置窗口的不可以改变
        jFrame.setResizable(false);
        //设置窗口的关闭
        jFrame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        //添加面板
        jFrame.add(new GamePanel());
        //设置窗口的可见性
        jFrame.setVisible(true);
    }
}

面板类

package com.qiu.snake;

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

//游戏的面板
public class GamePanel extends JPanel implements KeyListener, ActionListener {
          
   
    //定义蛇的数据
    int length;//蛇的长度
    int[] snakeX=new int[600];//蛇的x坐标
    int[] snakeY=new int[500];//蛇的y坐标
    String direction;//蛇头部的方向
    boolean start;//判断开始文字

    //定义食物的X和Y轴体
    int foodX; int foodY;
    //定义随机数
    Random random=new Random();

    //定义失败后的结果
    boolean finish=false;

    //定义分数
    int score;

    int speed=100;

    //以毫秒为单位ms 100ms  1000ms=1s
    Timer timer=new Timer(speed,this);//创建定时器对象

    public GamePanel(){
          
   
        init();//初始化
        this.setFocusable(true);//获取焦点
        this.addKeyListener(this);//添加键盘监听事件
        timer.start();//初始化定时器
    }

    //蛇初始化
    public void init(){
          
   
        length=3;//蛇现在的长度

        snakeX[0]=100;snakeY[0]=100;//蛇的头部坐标 125
        snakeX[1]=75;snakeY[1]=100;//蛇的身体坐标 100
        snakeX[2]=50;snakeY[2]=100;//蛇的身体坐标 75

        direction="R";//蛇头部方向
        //随机给食物的X轴和Y轴.nextInt(边界),随机数小于或者等于边界数
        foodX=25+ (25*random.nextInt(34));
        foodY=75+ (25*random.nextInt(24));
        //分数初始化
        score=0;

    }

    @Override
    public void paintComponent(Graphics g) {
          
   
        super.paintComponent(g);
        this.setBackground(Color.WHITE);//设置面板颜色
        Data.header.paintIcon(this,g,25,11);
        g.fillRect(25,75,850,600);

        //分数长度
        g.setColor(Color.WHITE);
        g.setFont(new Font("微软雅黑",Font.BOLD,18));
        g.drawString("长度:"+length+"",750,35);
        g.drawString("分数:"+score+"",750,55);

        //食物
        Data.food.paintIcon(this,g,foodX,foodY);

        //判断蛇的头部方向
        if(direction.equals("R")){
          
   
            Data.right.paintIcon(this,g,snakeX[0],snakeY[0]);
        }else if (direction.equals("L")){
          
   
            Data.left.paintIcon(this,g,snakeX[0],snakeY[0]);
        }else if (direction.equals("U")){
          
   
            Data.up.paintIcon(this,g,snakeX[0],snakeY[0]);
        }else if (direction.equals("D")){
          
   
            Data.down.paintIcon(this,g,snakeX[0],snakeY[0]);
        }


        for (int i = 1; i < length; i++) {
          
   
            Data.budy.paintIcon(this,g,snakeX[i],snakeY[i]);//蛇身体的坐标
        }

        //判断开始
        if (start==false){
          
   
            g.setColor(Color.WHITE);//设置字体颜色
            g.setFont(new Font("微软雅黑",Font.BOLD,35));//设置字体
            g.drawString("按下空格开始游戏",300,300);//设置字
        }

        //判断结束
        if(finish==true){
          
   
            g.setColor(Color.red);
            g.setFont(new Font("微软雅黑",Font.BOLD,35));
            g.drawString("游戏结束,按下空格继续游戏",290,300);
        }
    }



    @Override
    public void keyPressed(KeyEvent e) {
          
   
        int key = e.getKeyCode();//获取输入键盘的Code码

        if(key == KeyEvent.VK_SPACE){
          
   //判断
            if(finish==true){
          
   
                finish=false;
                init();//初始化
            }else{
          
   

            start=!start;//取反true则false,false则true;
            }
            repaint();//刷新
        }

        //控制头部方向
        if(key==KeyEvent.VK_UP){
          
   
            direction="U";
        }else if(key==KeyEvent.VK_DOWN){
          
   
            direction="D";
        }else if(key==KeyEvent.VK_LEFT){
          
   
            direction="L";
        }else if(key==KeyEvent.VK_RIGHT){
          
   
            direction="R";
        }
    }
    @Override
    public void actionPerformed(ActionEvent e) {
          
   
        //头部的X坐标和头部的Y坐标和食物的foodX和foodY相同的话
        if (snakeX[0]==foodX && snakeY[0]==foodY){
          
   
            //长度加1
            length++;
            //分数
            score=score+10;
            //在随机数赋值给foodX和foodY坐标
            foodX=25+ (25*random.nextInt(34));
            foodY=75+ (25*random.nextInt(24));

            speed+=10;
            System.out.println("速度:"+speed+"ms");

        }


        if(start==true&&finish==false){
          
   //判断游戏开始
            for(int i=length-1;i>0;i--){
          
   //身体的移动
                snakeX[i]=snakeX[i-1];//snakeX[2]=snakeX[2-1];把蛇的身体坐标从二移动到1
                snakeY[i]=snakeY[i-1];//snakeY[2]=snakeY[2-1];
            }
            /*System.out.println("--------------------------------");
            for(int i=1;i<length;i++){

                System.out.println("身体:"+snakeX[i]+"X"+"-----"+snakeY[i]+"Y");

            }
            System.out.println("--------------------------------");*/

            if(direction.equals("R")){
          
   
                snakeX[0]=snakeX[0]+25;//让头部向X轴体向右走动25,
                if(snakeX[0]>850){
          
   //如果头部超过850
                    snakeX[0]=25;//就让头部等于25
                }
            }else  if(direction.equals("L")){
          
   
                snakeX[0]=snakeX[0]-25;//让头部向X轴体向左走动25,
                if(snakeX[0]<25){
          
   //如果头部小于25
                    snakeX[0]=850;//就让头部等于850
                }
            }else  if(direction.equals("U")){
          
   
                snakeY[0]=snakeY[0]-25;//让头部向Y轴体向上走动25,
                if(snakeY[0]<75){
          
   //如果头部小于75
                    snakeY[0]=675;//就让头部等于675
                }
            }else  if(direction.equals("D")){
          
   
                snakeY[0]=snakeY[0]+25;//让头部向Y轴体走动下25,
                if(snakeY[0]>670){
          
   //如果头部超过670
                    snakeY[0]=75;//就让头部等于75
                }
            }
            //for循环获取所以身体
            for(int i=1;i<length;i++){
          
   
                //比较头的X和身体的X如果一样就失败并且头的Y和身体的Y一样
                if(snakeX[0]==snakeX[i]&&snakeY[0]==snakeY[i]){
          
   
                    finish=true;//返回true;出现失败字幕程序初始化
                }
            }
            repaint();//重绘
        }
        timer.start();//刷新
    }

    @Override
    public void keyReleased(KeyEvent e) {
          
   
    }
    @Override
    public void keyTyped(KeyEvent e) {
          
   

    }
}

图片类

经验分享 程序员 微信小程序 职场和发展