贪吃蛇

贪吃蛇

package GUI.SnakeEating.Code;

import javax.swing.*;

public class Index extends JFrame {
    public static void main(String[] args) {
        JFrame frame = new JFrame();
        frame.setBounds(10,10,900,720);
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        frame.setResizable(false);      //窗口大小不可变

        frame.add(new GamePanel());

        frame.setVisible(true);
    }
}


package GUI.SnakeEating.Code;

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

//存放数据的东西
public class Data {
    public static URL urlHeader=Data.class.getResource("/statics/header.png");
    public static ImageIcon header = new ImageIcon(urlHeader);

    public static URL urlUp=Data.class.getResource("/statics/up.png");
    public static ImageIcon up = new ImageIcon(urlUp);
    public static URL urlDown=Data.class.getResource("/statics/down.png");
    public static ImageIcon down = new ImageIcon(urlDown);
    public static URL urlLeft=Data.class.getResource("/statics/left.png");
    public static ImageIcon left = new ImageIcon(urlLeft);
    public static URL urlRight=Data.class.getResource("/statics/right.png");
    public static ImageIcon right = new ImageIcon(urlRight);

    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 food = new ImageIcon(foodURL);

}


package GUI.SnakeEating.Code;


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[] bodyX = new int[500];     //存放小蛇身体X轴的坐标
    int[] bodyY = new int[500];     //存放小蛇身体Y轴的坐标
    String fx ;                     //蛇头方向
    boolean isFlag;                 //游戏状态
    boolean isFail;                 //游戏是否失败
    Timer timer = new Timer(100,this);      //定时器,单位为毫秒     100毫秒一次
    //食物坐标
    int foodX;
    int foodY;
    Random random = new Random();   //生成一个随机数
    //分数
    int score;



    //构造器
    public GamePanel(){
        init();
        this.setFocusable(true);    //获取焦点
        this.addKeyListener(this);      //给这个类增加键盘监听事件
        timer.start();
    }

    //小蛇的初始化数据
    public void init(){
        length=3;
        bodyX[0] = 100; bodyY[0] = 100;
        bodyX[1] = 75;  bodyY[1] = 100;
        bodyX[2] = 50;  bodyY[2] = 100;
        foodX = 25+25*random.nextInt(34);       //随机生成一个数字,上限时34,超出边界会导致小蛇吃不到食物
        foodY = 75+25*random.nextInt(24);
        score=0;
        fx="R";
        isFlag = false;
        isFail = false;

    }

    //画笔g,可以以此来绘制所有的东西
    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);    //清屏
        Data.header.paintIcon(this,g,25,11);
        g.fillRect(15,75,850,600);

//        //绘制初始化的小蛇
//        Data.right.paintIcon(this,g,bodyX[0],bodyY[0]);
//        Data.body.paintIcon(this,g,bodyX[1],bodyY[1]);
//        Data.body.paintIcon(this,g,bodyX[2],bodyY[1]);

        //绘制分数
        g.setColor(Color.white);
        g.setFont(new Font("微软雅黑",Font.BOLD,18));
        g.drawString("分数"+score,350,40);

        //当游戏未开始时
        if(isFlag==false){
            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("游戏结束,你的分数是:"+score,300,300);
        }

        //绘制小蛇的身体
        for (int i = 1; i <length ; i++) {
            Data.body.paintIcon(this,g,bodyX[i],bodyY[i]);
        }
        if(fx.equals("R")){Data.right.paintIcon(this,g,bodyX[0],bodyY[0]);}
        else if(fx.equals("L")){Data.left.paintIcon(this,g,bodyX[0],bodyY[0]);}
        else if(fx.equals("U")){Data.up.paintIcon(this,g,bodyX[0],bodyY[0]);}
        else if(fx.equals("D")){Data.down.paintIcon(this,g,bodyX[0],bodyY[0]);}

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

    @Override
    public void keyTyped(KeyEvent e) {
    }

    @Override
    public void keyPressed(KeyEvent e) {
        int keyCode = e.getKeyCode();           //获取按键编码
        if(keyCode==32){
            if(isFail){
                isFail=false;
                init();
            }else {
                isFlag=!isFlag;
            }
            repaint();
        }
        //小蛇移动头部方向
        if (keyCode==37){fx="L";}
        else if(keyCode==38){fx="U";}
        else if(keyCode==39){fx="R";}
        else if(keyCode==40){fx="D";}
    }

    @Override
    public void keyReleased(KeyEvent e) {
    }

    //事件监听
    @Override
    public void actionPerformed(ActionEvent e) {
        if(isFlag && isFail==false){     //当游戏开始时,让小蛇运动

            //吃食物长大
            if(bodyX[0]==foodX && bodyY[0]==foodY){
                length++;
                score+=1;      //吃食物增加分数
                foodX = 25+25*random.nextInt(34);       //随机生成一个数字,上限时34,超出边界会导致小蛇吃不到食物
                foodY = 75+25*random.nextInt(24);
            }

            //身体仅需要跟着头部移动即可
            for (int i = length-1; i > 0; i--) {
                bodyX[i]=bodyX[i-1];
                bodyY[i]=bodyY[i-1];
            }

            //头部运动方向
            if(fx.equals("R")){
                bodyX[0]=bodyX[0]+25;
                if(bodyX[0]>850){bodyX[0]=25;}
            }else if(fx.equals("L")){
                bodyX[0]=bodyX[0]-25;
                if(bodyX[0]<25){bodyX[0]=850;}
            }else if(fx.equals("U")){
                bodyY[0]=bodyY[0]-25;
                if(bodyY[0]<75){bodyY[0]=650;}
            }else if(fx.equals("D")){
                bodyY[0]=bodyY[0]+25;
                if(bodyY[0]>650){bodyY[0]=75;}
            }

            //判断失败的条件,当身体与头重合时,失败
            for (int i =1 ; i <length ; i++) {
                if(bodyX[0]==bodyX[i] && bodyY[0]==bodyY[i]){isFail=true;}
            }
            if (bodyX[0]==850 || bodyX[0]==0 || bodyY[0]==0 || bodyY[0]==650){isFail=true;}

            repaint();
        }
        timer.start();
    }
}

图片资源
链接:https://pan.baidu.com/s/17ZzvjnmGu3zwPDtVpWAbVw
提取码:5bjb
复制这段内容后打开百度网盘手机App,操作更方便哦

posted @ 2021-03-29 16:46  2月2日  阅读(51)  评论(0)    收藏  举报