贪吃蛇----java

贪吃蛇

语言:java
知识点:gui
环境:jdk8

注:文章末尾有图片资源 & 源代码 链接

大概界面

在这里插入图片描述

相关类(只有5个)

1、游戏启动类

package com.xiejiaqi.snakeGame;

import javax.swing.*;

/**
 * 游戏主启动类
 */
public class StartGame {
    public static void main(String[] args) {
        JFrame jFrame = new JFrame();
        GamePanel gamePanel = new GamePanel();
        jFrame.setFocusable(true);//获取键盘焦点事件
        // 特别注意:setFocusable方法在setVisible方法之前,要不然监听事件可能监听不到

        jFrame.setBounds(10, 10, 920, 720);
        jFrame.setVisible(true);
        jFrame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        jFrame.setResizable(false);


        jFrame.add(gamePanel);
        jFrame.addKeyListener(gamePanel);

        Thread thread = new Thread(gamePanel);
        thread.start();


    }
}

2、游戏的面板

package com.xiejiaqi.snakeGame;

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;

/**
 * 游戏面板
 */
public class GamePanel extends JPanel implements KeyListener, Runnable{

    //游戏状态
    boolean isStart = false;  //游戏的开始
    boolean isFail = false;   //游戏的结束
    Snack snack = null;
    SnackFood snackFood = null;


    public GamePanel(){
        snack = new Snack();
        snackFood = new SnackFood();

    }

    //绘制面板,游戏中的所有东西,都是用一个画笔画上去
    @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);

        //画积分
        g.setColor(Color.white);
        g.setFont(new Font("隶书 常规", Font.BOLD, 18));
        g.drawString("长度 " + snack.length, 750, 35);
        g.drawString("分数 " + snack.score, 750, 50);


        //食物
        Data.food.paintIcon(this, g, snackFood.foodX, snackFood.foodY);
        //初始小蛇画上去
        switch(snack.direction){
            case 0:
                Data.up.paintIcon(this, g, snack.snackX[0], snack.snackY[0]);
            case 1:
                Data.right.paintIcon(this, g, snack.snackX[0], snack.snackY[0]);
            case 2:
                Data.down.paintIcon(this, g, snack.snackX[0], snack.snackY[0]);
            case 3:
                Data.left.paintIcon(this, g, snack.snackX[0], snack.snackY[0]);

        }
        for(int i = 1; i < snack.length; i++){
            Data.body.paintIcon(this, g, snack.snackX[i], snack.snackY[i]);
        }

        //游戏状态
        if(!isStart){
            g.setColor(Color.white);
            g.setFont(new Font("隶书 常规", Font.BOLD, 40));
            g.drawString("按下空格开始游戏", 300, 300);
        }
        if(isFail){
            g.setColor(Color.red);
            g.setFont(new Font("隶书 常规", Font.BOLD, 40));
            g.drawString("gameOver空格重新开始", 300, 300);
        }
    }

    @Override
    public void keyTyped(KeyEvent e) {

    }
    @Override
    public void keyReleased(KeyEvent e) {

    }
    @Override
    public void keyPressed(KeyEvent e) {
        int keyCode = e.getKeyCode();
        if(keyCode == KeyEvent.VK_SPACE){
            if(isFail){
                //重新开始
                isFail = false;
                snack = new Snack();
                snackFood = new SnackFood();
            }else{
                //只是暂停
                isStart = !isStart;
            }
            this.repaint();
        }

        if(keyCode == KeyEvent.VK_UP){
            snack.direction = 0;
        }else if(keyCode == KeyEvent.VK_RIGHT){
            snack.direction = 1;
        }else if(keyCode == KeyEvent.VK_DOWN){
            snack.direction = 2;
        }else if(keyCode == KeyEvent.VK_LEFT){
            snack.direction = 3;
        }

    }


    public void move(){
        if(isStart && !isFail){
            //撞到自己死掉
            for(int i = 1; i < snack.length; i++){
                if(snack.snackX[0] == snack.snackX[i] && snack.snackY[0] == snack.snackY[i]){
                    isFail = true;
                }
            }

            //吃到食物
            if(snack.snackX[0] == snackFood.foodX && snack.snackY[0] == snackFood.foodY){
                //长度加1
                snack.length++;
                //score加1
                snack.score++;
                //再次投放食物
                snackFood.makeFood();
            }
            for(int i = snack.length - 1; i > 0; i--){  //尾巴跟着头走
                snack.snackX[i] = snack.snackX[i - 1];
                snack.snackY[i] = snack.snackY[i - 1];
            }
            //头的走向
            if(snack.direction == 0){
                snack.snackY[0] -= 25;  //都得等尾巴跟上来再走
                // 边界判断
                if(snack.snackY[0] < 75){snack.snackY[0] = 600;}
            }else if(snack.direction == 1){
                snack.snackX[0] += 25;  //都得等尾巴跟上来再走
                // 边界判断
                if(snack.snackX[0] > 850){snack.snackX[0] = 25;}
            }else if(snack.direction == 2){
                snack.snackY[0] += 25;  //都得等尾巴跟上来再走
                // 边界判断
                if(snack.snackY[0] > 650){snack.snackY[0] = 75;}
            }else if(snack.direction == 3){
                snack.snackX[0] -= 25;  //都得等尾巴跟上来再走
                // 边界判断
                if(snack.snackX[0] < 25){snack.snackX[0] = 850;}
            }
            this.repaint();
        }
    }

    @Override
    public void run() {     //用来重绘

        while (true) {
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
            this.move();
            this.repaint();
        }
    }
}

3、snack类

package com.xiejiaqi.snakeGame;

public class Snack {

    int length;
    int score;
    int[] snackX = new int[600];
    int[] snackY = new int[600];

    int direction;  //0上1右2下3左

    public Snack(){
        score = 0;
        length = 3;
        snackX[0] = 100; snackY[0] = 100;
        snackX[1] = 75; snackY[1] = 100;
        snackX[2] = 50; snackY[2] = 100;
        direction = 1;
    }


}

4、食物类

package com.xiejiaqi.snakeGame;

import java.util.Random;

public class SnackFood {
    int foodX;
    int foodY;
    Random random = new Random();

    public SnackFood(){
        makeFood();
    }
    public void makeFood(){
        this.foodX = 25 + 25 * random.nextInt(34);
        this.foodY = 75 + 25 * random.nextInt(25);
    }
}

5、数据资源类

package com.xiejiaqi.snakeGame;

import javax.swing.*;

/**
 * 数据中心
 */
public class Data {

    //public static URL headerURL = Data.class.getResource("header.png");
    public static ImageIcon header = new ImageIcon(Data.class.getResource("/header.jpg"));
    //public static URL headURL = Data.class.getResource("head.png");
    public static ImageIcon up = new ImageIcon(Data.class.getResource("/head.png"));
    public static ImageIcon down = new ImageIcon(Data.class.getResource("/head.png"));
    public static ImageIcon left = new ImageIcon(Data.class.getResource("/head.png"));
    public static ImageIcon right = new ImageIcon(Data.class.getResource("/head.png"));

    //public static URL bodyURL = Data.class.getResource("body.png");
    public static ImageIcon body = new ImageIcon(Data.class.getResource("/body.png"));

    //public static URL foodURL = Data.class.getResource("body.png");
    public static ImageIcon food = new ImageIcon(Data.class.getResource("/food.png"));

}

相关资源及源文件

图片文件放在默认位置:源文件的根目录下
链接:百度网盘链接
提取码:0000

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值