贪吃蛇小游戏

使用IDEA开发工具,用java开发的贪吃蛇小游戏
效果图:image

游戏主界面

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

/** 贪吃蛇小游戏的开发
 * @author Big_Small
 * @version 2021-07-19
 * @since jdk16
 */

public class StartGame extends JFrame {
    public StartGame(){
        setTitle("贪吃蛇游戏");
        setBounds(10,10,900,720);
        setResizable(false);

        Container container=this.getContentPane();
        container.add(new GamePanel());

        setVisible(true);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
    public static void main(String[] args) {
        new StartGame();
    }
}

游戏面板以及对事件的监听

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 {
    private int length; //蛇身体的长度
    private int[] snakeX=new int[34];   //蛇的X坐标
    private int[] snakeY=new int[24];   //蛇的Y坐标
    private String direction;   //初始方向
    private int foodX;  //食物的X坐标
    private int foodY;  //食物的Y坐标
    private Random random=new Random();//随机数

    private int score;//分数

    private Timer timer=new Timer(100,this);//定时器,初始执行一次的时间为100ms

    private boolean isStart=false;  //游戏默认状态是没开始
    private boolean isFail=false;   //游戏失败状态,初始为没有失败

    public GamePanel(){
        init();//初始化游戏界面数据
        this.setFocusable(true);//获取焦点事件开启
        this.addKeyListener(this);//键盘事件监听
        timer.start();//定时器开启
    }

    public void init(){
        length=3;   //初始化蛇长度为3
        score=0;    //初始分数为0
        //蛇初始的位置
        for (int i = 0; i < length; i++) {
            snakeX[i]=100-i*25;
            snakeY[i]=100;
        }
        //初始化头的方向向右
        direction="R";

        //初始化随机出食物的位置
        foodX=25+25* random.nextInt(34);
        foodY=75+25*random.nextInt(24);
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);//清屏作用
        Data.head.paintIcon(this,g,25,11);  //画出游戏的头部广告位
        g.setColor(Color.WHITE);
        g.setFont(new Font("微软雅黑",Font.ITALIC,18));
        g.drawString("长度:"+length,750,35);  //显示蛇的当前长度
        g.drawString("分数:"+score,750,50);   //显示目前获得的分数
        g.setColor(Color.BLACK);
        g.fillRect(25,75,850,600);//游戏区域

        Data.food.paintIcon(this,g,foodX,foodY);//画出食物的位置

        //头如果未越界,画出头的位置
        if(snakeX[0]>=25&&snakeX[0]<=850&&snakeY[0]>=75&&snakeY[0]<=650){
            switch (direction){
                case "R":
                    Data.right.paintIcon(this,g,snakeX[0],snakeY[0]);
                    break;
                case "L":
                    Data.left.paintIcon(this,g,snakeX[0],snakeY[0]);
                    break;
                case "U":
                    Data.up.paintIcon(this,g,snakeX[0],snakeY[0]);
                    break;
                case "D":
                    Data.down.paintIcon(this,g,snakeX[0],snakeY[0]);
                    break;
            }
        }
        //画出身体的位置
        for (int i = 1; i < length; i++) {
            Data.body.paintIcon(this,g,snakeX[i],snakeY[i]);
        }
        //判断游戏是否开始
        if(!isStart){
            g.setColor(Color.PINK);
            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("游戏,失败按下空格键重新开始",200,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_RIGHT&&!direction.equals("L")){
            direction="R";
        }else if(keyCode==KeyEvent.VK_LEFT&&!direction.equals("R")){
            direction="L";
        }else if(keyCode==KeyEvent.VK_UP&&!direction.equals("D")){
            direction="U";
        }else if(keyCode==KeyEvent.VK_DOWN&&!direction.equals("U")){
            direction="D";
        }
    }
    @Override
    public void keyReleased(KeyEvent e) {}
    @Override
    public void keyTyped(KeyEvent e) {}

    @Override
    public void actionPerformed(ActionEvent e) {
        if(isStart&&!isFail){//游戏是开始状态
            if(snakeX[0]==foodX&&snakeY[0]==foodY){//判断蛇是否吃到食物
                length++;//蛇身体长度加1
                score+=10;//分数加10
                //再次随机生成食物
                foodX=25+25* random.nextInt(34);
                foodY=75+25* random.nextInt(24);
            }
            //移动
            for (int i = length; i > 0; i--) {
                snakeX[i]=snakeX[i-1];
                snakeY[i]=snakeY[i-1];
            }
            //头的方向移动
            if(direction.equals("R")){
                snakeX[0]=snakeX[0]+25;
            }else if(direction.equals("L")){
                snakeX[0]=snakeX[0]-25;
            }else if(direction.equals("U")){
                snakeY[0]=snakeY[0]-25;
            }else if(direction.equals("D")){
                snakeY[0]=snakeY[0]+25;
            }
            if(snakeX[0]>850||snakeX[0]<25||snakeY[0]<75||snakeY[0]>650){//判断蛇是否出界
                isFail=true;
            }
            for (int i = 1; i < length; i++) {//判断蛇是否吃到自身
                if(snakeX[0]==snakeX[i]&&snakeY[0]==snakeY[i]){
                    isFail=true;
                }
            }

            repaint();//重绘贪吃蛇的位置
        }
        timer.start();//定时器开启
    }
}

用于存取图片

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

//放置游戏用到的图片
public class Data {
    private static URL headURL=Data.class.getResource("/Image/img.png");
    private static URL bodyURL=Data.class.getResource("/Image/body.png");
    private static URL downURL=Data.class.getResource("/Image/down.png");
    private static URL upURL=Data.class.getResource("/Image/up.png");
    private static URL leftURL=Data.class.getResource("/Image/left.png");
    private static URL rightURL=Data.class.getResource("/Image/right.png");
    private static URL foodURL=Data.class.getResource("/Image/food.png");

    public static ImageIcon head=new ImageIcon(headURL);
    public static ImageIcon body=new ImageIcon(bodyURL);
    public static ImageIcon down=new ImageIcon(downURL);
    public static ImageIcon up=new ImageIcon(upURL);
    public static ImageIcon left=new ImageIcon(leftURL);
    public static ImageIcon right=new ImageIcon(rightURL);
    public static ImageIcon food=new ImageIcon(foodURL);
}

注:在src文件夹下创建Image文件夹用来放置图片素材,注意图片的命名要跟Data类中相同
body.png
down.png
left.png
right.png
up.png
food.png
image

posted @ 2021-07-20 15:50  Big_Small  阅读(162)  评论(0)    收藏  举报