手把手教你用Java写一个贪吃蛇游戏,简简单单的三个类,其中有详细的注释

手把手教你用Java写一个贪吃蛇游戏

1. 项目结构

新建工程Snake,在src下建好放源代码的包,如,com.itlxs.snake
在这里插入图片描述
只需要关注上面打箭头的,其中statics包用于放置图片信息。若要图片资源,或者你想要将其扩展,都可以私信我

2. 主函数

任何程序都只有一个主函数(主类),它是程序的入口。如我的主函数是 StartGame,到时候只需要启动该类,程序就可以运行起来了。

package com.itlxs.snake;

import javax.swing.*;

public class StartGame {
    
    
    public static void main(String[] args) {
    
    
        //生成窗口
        JFrame frame = new JFrame();
        //设置窗口,出现位置,边界大小
        frame.setBounds(10,10,900,620);
        //不可放大缩小
        frame.setResizable(false);
        //点击右上角的X,程序结束
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        //添加游戏面板
        frame.add(new GamePanel());
        //设置可见
        frame.setVisible(true);

    }
}

3. 图片数据初始化

新建一个Data类,该类用于初始化图像数据,创建图像实现图像的加载。

package com.itlxs.snake;

import javax.swing.*;
import java.net.URL;

public class Data {
    
    
    //创建图像实现图像的加载
    public static URL headerURL = Data.class.getResource("/statics/header.png");
    public static ImageIcon header = new ImageIcon(headerURL);
	//朝不同方向的头
    public static URL upURL = Data.class.getResource("/statics/up.png");
    public static ImageIcon up = new ImageIcon(upURL);
    public static URL downURL = Data.class.getResource("/statics/down.png");
    public static ImageIcon down = new ImageIcon(downURL);
    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 bodyURL = Data.class.getResource("/statics/body.png");
    public static ImageIcon body = new ImageIcon(bodyURL);
    public static URL foodURL = Data.class.getResource("/statics/food.png");
    public static ImageIcon foot = new ImageIcon(foodURL);

}

4. 绘制游戏画板

新建一个画板类:Gamepanel ,这是核心类,在上面进行相应的操作。

  1. 设置游戏相关的属性
  2. 初始化数据
  3. 在画板上画画
  4. 监听键盘
  5. 实现动画效果
package com.itlxs.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 {
    
    
//1.设置游戏相关的属性
    //1.1小蛇的初始長度
    int length = 3;
	//1.2小蛇的身体的最大个数
    int[] snakeX = new int[600];
    int[] snakeY = new int[500];
	//1.3方向
    String fx;
    //1.4游戏是否开始
    boolean isstart = false;
	//1.5游戏是否结束
    boolean isFail = false;
	//1.6积分变量
    int score;
    //1.7定时器100毫秒执行一次,this:执行的对象
    Timer timer = new Timer(100,this);
    //1.8食物坐标
    int foodx;
    int foody;
    //1.9随机数生成器
    Random random = new Random();

//2.构造函数进行初始化
    public GamePanel(){
    
    
        //2.1调用初始化函数进行初始化工作
        init();
        //2.3给该对象添加监听器
        this.addKeyListener(this);
		//2.2集中键盘焦点,也就是按下键盘按钮,能被游戏监听到
        this.setFocusable(true);
        //2.4计时器
        timer.start();
    }

	//2.5初始化游戏数据的方法:init()
    public void init(){
    
    
        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(30);
        foody = 75 + 25 * random.nextInt(20);
        length = 3;
        score = 0;
    }

//3.在画板上画画
    @Override
    protected void paintComponent(Graphics g) {
    
    
        //3.1清屏
        super.paintComponent(g);
        this.setBackground(Color.white);
		//3.2画标题
        Data.header.paintIcon(this,g,25,11);
		//3.3填充矩形
        g.fillRect(25,75,850,500);
		//3.4脑袋变向
        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]);
        }
		//3.5画身体
        for(int i = 1; i<length;i++){
    
    
            Data.body.paintIcon(this,g,snakeX[i],snakeY[i]);
        }
		//3.6画食物
        Data.foot.paintIcon(this,g,foodx,foody);

		//3.7画关于文字的信息
        g.setColor(Color.white);
        g.setFont(new Font("微软雅黑",Font.BOLD,18));
        g.drawString("长度:" + length,750,30);
        g.drawString("当前分数:" + score,750,50);
        if(isstart == false){
    
       //游戏未开始
            g.setColor(Color.white);
            g.setFont(new Font("微软雅黑",Font.BOLD,18));
            g.drawString("按下空格游戏开始",300,300);
        }
        if(isFail == true){
    
         //游戏失败时
            g.setColor(Color.red);
            g.setFont(new Font("微软雅黑",Font.BOLD,40));
            g.drawString("游戏失败",300,300);
        }
    }

//4.监听键盘
    @Override
    public void keyPressed(KeyEvent e) {
    
      //实现KeyListenner,才能重写该方法
        int keyCode = e.getKeyCode();     //获取键盘对应的一个数值
		//4.1监听空格
        if (keyCode == KeyEvent.VK_SPACE){
    
    //相当于敲击了空格键盘
            if(isFail == true){
    
    
                isFail = false;
                init();
            }else{
    
    
                isstart = !isstart;
            }
            repaint();
        }
		//4.2监听上下左右
        if(keyCode == KeyEvent.VK_LEFT ){
    
    
            if(fx != "R"){
    
    
                fx = "L";
            }
        }else if(keyCode == KeyEvent.VK_RIGHT){
    
    
            if(fx != "L"){
    
    
                fx = "R";
            }
        }else if(keyCode == KeyEvent.VK_UP){
    
    
            if(fx != "D"){
    
    
                fx = "U";
            }
        }else if(keyCode == KeyEvent.VK_DOWN){
    
    
            if(fx != "U"){
    
    
                fx = "D";
            }
        }
    }

//5.实现动画效果,动画表演具体执行的方法
    @Override
    public void actionPerformed(ActionEvent e) {
    
     //实现ActionListenner,才能重写该方法
		//5.1小蛇到达尽头后从另一端出来
        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;
                }
            }
            if(fx.equals("L")){
    
    
                snakeX[0] = snakeX[0]-25;
                if(snakeX[0] < 25){
    
    
                    snakeX[0] = 850;
                }
            }
            if(fx.equals("U")){
    
    
                snakeY[0] = snakeY[0]-25;
                if(snakeY[0] <75){
    
    
                    snakeY[0] = 500;
                }
            }
            if(fx.equals("D")){
    
    
                snakeY[0] = snakeY[0]+25;
                if(snakeY[0] > 550){
    
    
                    snakeY[0] = 75;
                }
            }
		//5.2食物被吃后再次出现的位置
            if(snakeX[0] == foodx && snakeY[0] == foody){
    
    
                length = length+1;
                score = score + 10;
                foodx = 25 + 25 * random.nextInt(30);
                foody = 75 + 25 * random.nextInt(20);
            }
            for(int i = 1;i<length;i++){
    
    
                if(snakeX[0] == snakeX[i]&&snakeY[0] == snakeY[i]){
    
    
                    isFail = true;
                }
            }
            //相当于不断刷新画面,从而实现动画效果
            repaint();
        }
        //若游戏开始,开始计时
        timer.start();
    }



    @Override
    public void keyReleased(KeyEvent e) {
    
      //实现KeyListenner,必须重写的方法

    }
    @Override
    public void keyTyped(KeyEvent e) {
    
    		//实现KeyListenner,必须重写的方法

    }

}

猜你喜欢

转载自blog.csdn.net/qq_37795916/article/details/115277758