贪吃蛇(Java Swing绘制)

游戏数据类

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 URL downURL=Data.class.getResource("statics/down.png");
    public static URL leftURL=Data.class.getResource("statics/left.png");
    public static URL rightURL=Data.class.getResource("statics/right.png");

    public static ImageIcon up=new ImageIcon(upURL);
    public static ImageIcon down=new ImageIcon(downURL);
    public static ImageIcon left=new ImageIcon(leftURL);
    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 food=new ImageIcon(foodURL);

    public static URL badURL=Data.class.getResource("statics/bad.png");
    public static ImageIcon bad=new ImageIcon(badURL);

    public static URL thinkURL=Data.class.getResource("statics/think.png");
    public static ImageIcon think=new ImageIcon(thinkURL);


}

游戏界面类1

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坐标25*25
    int[]snakeY=new int[600];//蛇的y坐标25*25
    String fx="R";//初始方向向右

    //食物的坐标
    int foodX;
    int foodY;
    int food1X;
    int food1Y;
    Random random=new Random();

    int score;//成绩

    //游戏当前的状态: 开始,停止
    boolean isStart=false;//默认是不开始的

    boolean isFail=false;//游戏失败状态

    boolean isTongGuan=false;

    //定时器,以毫秒为单位
    Timer timer=new Timer(1000-score,this);//100毫秒执行一次


    //构造器
    public GamePanel() {
       init();
       //获得焦点和键盘事件
        this.setFocusable(true);//获得焦点事件
        this.addKeyListener(this);//获得键盘监听事件
        timer.start();//游戏一开始定时器就启动
    }

    //初始化方法
    public void init(){
        length=3;
        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(34);
        foodY=75+25*random.nextInt(24);
        food1X=25+25*random.nextInt(34);
        food1Y=75+25*random.nextInt(24);

        score=0;
    }


    //绘制面板,我们游戏中的所有东西都是用这支画笔来画
    @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.MAGENTA);
        g.setFont(new Font("微软雅黑", Font.BOLD,20));//设置字体
        g.drawString("简单模式",650,50);
        //画积分
        g.setColor(Color.BLUE);
        g.setFont(new Font("微软雅黑", Font.BOLD,18));//设置字体
        g.drawString("长度"+length,750,30);
        g.drawString("分数"+score,750,60);



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


        //把小蛇画上去
        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]);//蛇头初始化向右,需要通过方向来判断
        }
        for (int i=1;i<length;i++) {
            Data.body.paintIcon(this, g, snakeX[i], snakeY[i]);//第一个身体的坐标
        }



        //游戏状态
        if(isStart==false){
            g.setColor(Color.WHITE);
            g.setFont(new Font("微软雅黑", Font.BOLD,40));//设置字体
            g.drawString("按下空格开始游戏",250,350);
        }

        if(isFail){
            g.setColor(Color.RED);
            g.setFont(new Font("微软雅黑",Font.BOLD,40));
            g.drawString("游戏失败,按下空格重新开始",250,350);
        }
        if(isTongGuan){
            g.setColor(Color.WHITE);
            g.setFont(new Font("微软雅黑",Font.BOLD,40));
            g.drawString("恭喜你通关了",250,350);
        }
    }




    //键盘监听事件
    @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(fx.equals("U")){
            if(keyCode==KeyEvent.VK_UP){
                fx="U";
            }else if(keyCode==KeyEvent.VK_LEFT){
                fx="L";
            }else if(keyCode==KeyEvent.VK_RIGHT){
                fx="R";
            }
        }else if(fx.equals("D")){
            if(keyCode==KeyEvent.VK_DOWN){
                fx="D";
            }else if(keyCode==KeyEvent.VK_LEFT){
                fx="L";
            }else if(keyCode==KeyEvent.VK_RIGHT){
                fx="R";
            }
        }else if(fx.equals("R")){
            if(keyCode==KeyEvent.VK_UP){
                fx="U";
            }else if(keyCode==KeyEvent.VK_DOWN){
                fx="D";
            }else if(keyCode==KeyEvent.VK_RIGHT){
                fx="R";
            }
        }else if(fx.equals("L")){
            if(keyCode==KeyEvent.VK_UP){
                fx="U";
            }else if(keyCode==KeyEvent.VK_DOWN){
                fx="D";
            }else if(keyCode==KeyEvent.VK_LEFT){
                fx="L";
            }
        }
    }



    //事件监听---需要通过固定事件来刷新,1s=10次
    @Override
    public void actionPerformed(ActionEvent e) {
        if (isStart&&isFail==false) {//如果游戏是开始状态,就让小蛇动起来

            if(score==1000){
                isTongGuan=true;
            }
            //吃事物
            if(snakeX[0]==foodX&&snakeY[0]==foodY){
                length++;//长度加+1
                //分数加10
                score=score+10;
                //再次随机生成食物
                foodX=25+25*random.nextInt(34);
                foodY=75+25*random.nextInt(24);
                food1X=25+25*random.nextInt(34);
                food1Y=75+25*random.nextInt(24);
                repaint();//重画页面

            }else if(snakeX[0]==food1X&&snakeY[0]==food1Y){
                length++;//长度加+1
                //分数加10
                score=score+10;
                //再次随机生成食物
                foodX=25+25*random.nextInt(34);
                foodY=75+25*random.nextInt(24);
                food1X=25+25*random.nextInt(34);
                food1Y=75+25*random.nextInt(24);
                repaint();//重画页面
            }

            //右移
            for (int i = length - 1; i > 0; i--) {//后一节移到前一节的位置snakeX[1]=snakeX[0];
                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;
                }
            } else if (fx.equals("L")) {
                snakeX[0] = snakeX[0] - 25;
                if (snakeX[0] < 25) {//边界判断
                    snakeX[0] = 850;
                }
            } else if (fx.equals("U")) {
                snakeY[0] = snakeY[0] - 25;
                if (snakeY[0] < 75) {//边界判断
                    snakeY[0] = 650;
                }
            }else if(fx.equals("D")){
                snakeY[0] = snakeY[0] + 25;
                if (snakeY[0] > 650) {//边界判断
                    snakeY[0] = 75;
                }
            }

            //失败判断,撞到自己就算失败
            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) {

    }
    @Override
    public void keyTyped(KeyEvent e) {

    }
}

游戏界面类2

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 GamePanel1 extends JPanel implements KeyListener, ActionListener {

    //定义蛇的数据结构
    int length;//蛇的长度
    int[]snakeX=new int[600];//蛇的x坐标25*25
    int[]snakeY=new int[600];//蛇的y坐标25*25
    String fx="R";//初始方向向右

    //食物的坐标
    int foodX;
    int foodY;
    //有少量毒的食物
    int food1X;
    int food1Y;

    int food2X;
    int food2Y;
    Random random=new Random();



    int score;//成绩

    //游戏当前的状态: 开始,停止
    boolean isStart=false;//默认是不开始的

    boolean isFail=false;//游戏失败状态

    boolean isTongGuan=false;

    //定时器,以毫秒为单位
    Timer timer=new Timer(500-score/2,this);//100毫秒执行一次


    //构造器
    public GamePanel1() {
       init();
       //获得焦点和键盘事件
        this.setFocusable(true);//获得焦点事件
        this.addKeyListener(this);//获得键盘监听事件
        timer.start();//游戏一开始定时器就启动
    }

    //初始化方法
    public void init(){
        length=3;
        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(34);
        foodY = 75 + 25 * random.nextInt(24);
        food2X = 25 + 25 * random.nextInt(34);
        food2Y = 75 + 25 * random.nextInt(24);
        food1X = 25 + 25 * random.nextInt(34);
        food1Y = 75 + 25 * random.nextInt(24);

        score=0;
    }


    //绘制面板,我们游戏中的所有东西都是用这支画笔来画
    @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.MAGENTA);
        g.setFont(new Font("微软雅黑", Font.BOLD,20));//设置字体
        g.drawString("困难模式",650,50);

        //画积分
        g.setColor(Color.BLUE);
        g.setFont(new Font("微软雅黑", Font.BOLD,18));//设置字体
        g.drawString("长度"+length,750,30);
        g.drawString("分数"+score,750,60);



        //画食物
        Data.food.paintIcon(this, g, foodX, foodY);
        Data.think.paintIcon(this, g, food1X, food1Y);
        Data.food.paintIcon(this,g,food2X,food2Y);

        //把小蛇画上去
        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]);//蛇头初始化向右,需要通过方向来判断
        }
        for (int i=1;i<length;i++) {
            Data.body.paintIcon(this, g, snakeX[i], snakeY[i]);//第一个身体的坐标
        }



        //游戏状态
        if(isStart==false){
            g.setColor(Color.WHITE);
            g.setFont(new Font("微软雅黑", Font.BOLD,40));//设置字体
            g.drawString("按下空格开始游戏",250,350);
        }

        if(isFail){
            g.setColor(Color.RED);
            g.setFont(new Font("微软雅黑",Font.BOLD,40));
            g.drawString("游戏失败,按下空格重新开始",250,350);
        }
        if(isTongGuan){
            g.setColor(Color.WHITE);
            g.setFont(new Font("微软雅黑",Font.BOLD,40));
            g.drawString("恭喜你通关了",250,350);
        }
    }




    //键盘监听事件
    @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(fx.equals("U")){
            if(keyCode==KeyEvent.VK_UP){
                fx="U";
            }else if(keyCode==KeyEvent.VK_LEFT){
                fx="L";
            }else if(keyCode==KeyEvent.VK_RIGHT){
                fx="R";
            }
        }else if(fx.equals("D")){
            if(keyCode==KeyEvent.VK_DOWN){
                fx="D";
            }else if(keyCode==KeyEvent.VK_LEFT){
                fx="L";
            }else if(keyCode==KeyEvent.VK_RIGHT){
                fx="R";
            }
        }else if(fx.equals("R")){
            if(keyCode==KeyEvent.VK_UP){
                fx="U";
            }else if(keyCode==KeyEvent.VK_DOWN){
                fx="D";
            }else if(keyCode==KeyEvent.VK_RIGHT){
                fx="R";
            }
        }else if(fx.equals("L")){
            if(keyCode==KeyEvent.VK_UP){
                fx="U";
            }else if(keyCode==KeyEvent.VK_DOWN){
                fx="D";
            }else if(keyCode==KeyEvent.VK_LEFT){
                fx="L";
            }
        }
    }



    //事件监听---需要通过固定事件来刷新,1s=10次
    @Override
    public void actionPerformed(ActionEvent e) {
        if (isStart&&isFail==false) {//如果游戏是开始状态,就让小蛇动起来
            if(length<1){
                isFail=true;
            }
            if(score<0){
                isFail=true;
            }
            if(score==1000){
                isTongGuan=true;
            }
            //吃事物
            if(snakeX[0]==foodX&&snakeY[0]==foodY){
                length++;//长度加+1
                //分数加10
                score=score+10;
                //再次随机生成食物

                foodX = 25 + 25 * random.nextInt(34);
                foodY = 75 + 25 * random.nextInt(24);
                food2X = 25 + 25 * random.nextInt(34);
                food2Y = 75 + 25 * random.nextInt(24);
                food1X = 25 + 25 * random.nextInt(34);
                food1Y = 75 + 25 * random.nextInt(24);
                repaint();//重画页面

            }else if(snakeX[0]==food1X&&snakeY[0]==food1Y){
                length=length-2;
                score=score-20;
                foodX = 25 + 25 * random.nextInt(34);
                foodY = 75 + 25 * random.nextInt(24);
                food2X = 25 + 25 * random.nextInt(34);
                food2Y = 75 + 25 * random.nextInt(24);
                food1X = 25 + 25 * random.nextInt(34);
                food1Y = 75 + 25 * random.nextInt(24);
                repaint();//重画页面

            }else if(snakeX[0]==food2X&&snakeY[0]==food2Y){
                length=length+1;
                score=score+10;
                foodX = 25 + 25 * random.nextInt(34);
                foodY = 75 + 25 * random.nextInt(24);
                food2X = 25 + 25 * random.nextInt(34);
                food2Y = 75 + 25 * random.nextInt(24);
                food1X = 25 + 25 * random.nextInt(34);
                food1Y = 75 + 25 * random.nextInt(24);
                repaint();//重画页面

            }

            //右移
            for (int i = length - 1; i > 0; i--) {//后一节移到前一节的位置snakeX[1]=snakeX[0];
                snakeX[i] = snakeX[i - 1];//向前移动一节
                snakeY[i] = snakeY[i-1];
            }

            //走向
            if (fx.equals("R")) {
                snakeX[0] = snakeX[0] + 25;
            } else if (fx.equals("L")) {
                snakeX[0] = snakeX[0] - 25;
            } else if (fx.equals("U")) {
                snakeY[0] = snakeY[0] - 25;
            }else if(fx.equals("D")){
                snakeY[0] = snakeY[0] + 25;
            }

            //失败判断,撞到自己就算失败
            for(int i=1;i<length;i++){
                if(snakeX[0]==snakeX[i]&&snakeY[0]==snakeY[i]){
                    isFail=true;
                }
            }
            //判断失败,撞到边界
            if(snakeX[0]<25){
                isFail=true;
            }else if(snakeY[0]<75){
                isFail=true;
            }else if (snakeX[0]>850){
                isFail=true;
            }else if (snakeY[0]>650){
                isFail=true;
            }

            repaint();//重画页面
        }

        timer.start();//定时器开始
    }


    @Override
    public void keyReleased(KeyEvent e) {

    }
    @Override
    public void keyTyped(KeyEvent e) {

    }
}

游戏界面三

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 GamePanel2 extends JPanel implements KeyListener, ActionListener {

    //定义蛇的数据结构
    int length;//蛇的长度
    int[]snakeX=new int[600];//蛇的x坐标25*25
    int[]snakeY=new int[600];//蛇的y坐标25*25
    String fx="R";//初始方向向右

    //食物的坐标
    int foodX;
    int foodY;
    //有少量毒的食物
    int food1X;
    int food1Y;

    int food2X;
    int food2Y;

    int food3X;
    int food3Y;

    int food4X;
    int food4Y;

    int food5X;
    int food5Y;

    int food6X;
    int food6Y;

    int food7X;
    int food7Y;

    int food8X;
    int food8Y;
    Random random=new Random();



    int score;//成绩

    //游戏当前的状态: 开始,停止
    boolean isStart=false;//默认是不开始的

    boolean isFail=false;//游戏失败状态

    boolean isTongGuan=false;//通关条件

    //定时器,以毫秒为单位
    Timer timer=new Timer(100-score/10,this);//100毫秒执行一次


    //构造器
    public GamePanel2() {
       init();
       //获得焦点和键盘事件
        this.setFocusable(true);//获得焦点事件
        this.addKeyListener(this);//获得键盘监听事件
        timer.start();//游戏一开始定时器就启动
    }

    //初始化方法
    public void init(){
        length=3;
        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(34);
        foodY = 75 + 25 * random.nextInt(24);
        food1X = 25 + 25 * random.nextInt(34);
        food1Y = 75 + 25 * random.nextInt(24);
        food2X = 25 + 25 * random.nextInt(34);
        food2Y = 75 + 25 * random.nextInt(24);
        food3X = 25 + 25 * random.nextInt(34);
        food3Y = 75 + 25 * random.nextInt(24);
        food4X = 25 + 25 * random.nextInt(34);
        food4Y = 75 + 25 * random.nextInt(24);
        food5X = 25 + 25 * random.nextInt(34);
        food5Y = 75 + 25 * random.nextInt(24);
        food6X = 25 + 25 * random.nextInt(34);
        food6Y = 75 + 25 * random.nextInt(24);
        food7X = 25 + 25 * random.nextInt(34);
        food7Y = 75 + 25 * random.nextInt(24);
        food8X = 25 + 25 * random.nextInt(34);
        food8Y = 75 + 25 * random.nextInt(24);


        score=0;
    }


    //绘制面板,我们游戏中的所有东西都是用这支画笔来画
    @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.MAGENTA);
        g.setFont(new Font("微软雅黑", Font.BOLD,20));//设置字体
        g.drawString("地狱模式",650,50);

        //画积分
        g.setColor(Color.BLUE);
        g.setFont(new Font("微软雅黑", Font.BOLD,18));//设置字体
        g.drawString("长度"+length,750,30);
        g.drawString("分数"+score,750,60);



        //画食物
        Data.food.paintIcon(this, g, foodX, foodY);
        Data.think.paintIcon(this, g, food1X, food1Y);
        Data.bad.paintIcon(this,g,food2X,food2Y);
        Data.food.paintIcon(this, g, food3X, food3Y);
        Data.think.paintIcon(this, g, food4X, food4Y);
        Data.think.paintIcon(this, g, food5X, food5Y);
        Data.think.paintIcon(this, g, food6X, food6Y);
        Data.bad.paintIcon(this,g,food7X,food7Y);
        Data.food.paintIcon(this,g,food8X,food8Y);

        //把小蛇画上去
        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]);//蛇头初始化向右,需要通过方向来判断
        }
        for (int i=1;i<length;i++) {
            Data.body.paintIcon(this, g, snakeX[i], snakeY[i]);//第一个身体的坐标
        }



        //游戏状态
        if(isStart==false){
            g.setColor(Color.WHITE);
            g.setFont(new Font("微软雅黑", Font.BOLD,40));//设置字体
            g.drawString("按下空格开始游戏",250,350);
        }

        if(isFail){
            g.setColor(Color.RED);
            g.setFont(new Font("微软雅黑",Font.BOLD,40));
            g.drawString("游戏失败,按下空格重新开始",250,350);
        }
        if(isTongGuan){
            g.setColor(Color.WHITE);
            g.setFont(new Font("微软雅黑",Font.BOLD,40));
            g.drawString("恭喜你通关了",250,350);
        }
    }




    //键盘监听事件
    @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(fx.equals("U")){
            if(keyCode==KeyEvent.VK_UP){
                fx="U";
            }else if(keyCode==KeyEvent.VK_LEFT){
                fx="L";
            }else if(keyCode==KeyEvent.VK_RIGHT){
                fx="R";
            }
        }else if(fx.equals("D")){
            if(keyCode==KeyEvent.VK_DOWN){
                fx="D";
            }else if(keyCode==KeyEvent.VK_LEFT){
                fx="L";
            }else if(keyCode==KeyEvent.VK_RIGHT){
                fx="R";
            }
        }else if(fx.equals("R")){
            if(keyCode==KeyEvent.VK_UP){
                fx="U";
            }else if(keyCode==KeyEvent.VK_DOWN){
                fx="D";
            }else if(keyCode==KeyEvent.VK_RIGHT){
                fx="R";
            }
        }else if(fx.equals("L")){
            if(keyCode==KeyEvent.VK_UP){
                fx="U";
            }else if(keyCode==KeyEvent.VK_DOWN){
                fx="D";
            }else if(keyCode==KeyEvent.VK_LEFT){
                fx="L";
            }
        }
    }



    //事件监听---需要通过固定事件来刷新,1s=10次
    @Override
    public void actionPerformed(ActionEvent e) {
        if (isStart&&isFail==false) {//如果游戏是开始状态,就让小蛇动起来
            if(length<1){
                isFail=true;
            }
            if(score<0){
                isFail=true;
            }
            if(score==1000){
                isTongGuan=true;
            }
            //吃事物
            if(snakeX[0]==foodX&&snakeY[0]==foodY){
                length++;//长度加+1
                //分数加10
                score=score+10;
                //再次随机生成食物

                foodX = 25 + 25 * random.nextInt(34);
                foodY = 75 + 25 * random.nextInt(24);
                food1X = 25 + 25 * random.nextInt(34);
                food1Y = 75 + 25 * random.nextInt(24);
                food2X = 25 + 25 * random.nextInt(34);
                food2Y = 75 + 25 * random.nextInt(24);
                food3X = 25 + 25 * random.nextInt(34);
                food3Y = 75 + 25 * random.nextInt(24);
                food4X = 25 + 25 * random.nextInt(34);
                food4Y = 75 + 25 * random.nextInt(24);
                food5X = 25 + 25 * random.nextInt(34);
                food5Y = 75 + 25 * random.nextInt(24);
                food6X = 25 + 25 * random.nextInt(34);
                food6Y = 75 + 25 * random.nextInt(24);
                food7X = 25 + 25 * random.nextInt(34);
                food7Y = 75 + 25 * random.nextInt(24);
                food8X = 25 + 25 * random.nextInt(34);
                food8Y = 75 + 25 * random.nextInt(24);
                repaint();//重画页面

            }else if(snakeX[0]==food1X&&snakeY[0]==food1Y){
                length=length-2;
                score=score-20;
                foodX = 25 + 25 * random.nextInt(34);
                foodY = 75 + 25 * random.nextInt(24);
                food1X = 25 + 25 * random.nextInt(34);
                food1Y = 75 + 25 * random.nextInt(24);
                food2X = 25 + 25 * random.nextInt(34);
                food2Y = 75 + 25 * random.nextInt(24);
                food3X = 25 + 25 * random.nextInt(34);
                food3Y = 75 + 25 * random.nextInt(24);
                food4X = 25 + 25 * random.nextInt(34);
                food4Y = 75 + 25 * random.nextInt(24);
                food5X = 25 + 25 * random.nextInt(34);
                food5Y = 75 + 25 * random.nextInt(24);
                food6X = 25 + 25 * random.nextInt(34);
                food6Y = 75 + 25 * random.nextInt(24);
                food7X = 25 + 25 * random.nextInt(34);
                food7Y = 75 + 25 * random.nextInt(24);
                food8X = 25 + 25 * random.nextInt(34);
                food8Y = 75 + 25 * random.nextInt(24);
                repaint();//重画页面

            }else if(snakeX[0]==food3X&&snakeY[0]==food3Y){
                length++;//长度加+1
                //分数加10
                score=score+10;
                //再次随机生成食物

                foodX = 25 + 25 * random.nextInt(34);
                foodY = 75 + 25 * random.nextInt(24);
                food1X = 25 + 25 * random.nextInt(34);
                food1Y = 75 + 25 * random.nextInt(24);
                food2X = 25 + 25 * random.nextInt(34);
                food2Y = 75 + 25 * random.nextInt(24);
                food3X = 25 + 25 * random.nextInt(34);
                food3Y = 75 + 25 * random.nextInt(24);
                food4X = 25 + 25 * random.nextInt(34);
                food4Y = 75 + 25 * random.nextInt(24);
                food5X = 25 + 25 * random.nextInt(34);
                food5Y = 75 + 25 * random.nextInt(24);
                food6X = 25 + 25 * random.nextInt(34);
                food6Y = 75 + 25 * random.nextInt(24);
                food7X = 25 + 25 * random.nextInt(34);
                food7Y = 75 + 25 * random.nextInt(24);
                food8X = 25 + 25 * random.nextInt(34);
                food8Y = 75 + 25 * random.nextInt(24);
                repaint();//重画页面

            }else if(snakeX[0]==food2X&&snakeY[0]==food2Y){
                isFail=true;
                repaint();//重画页面
            }else if(snakeX[0]==food7X&&snakeY[0]==food7Y){
                isFail=true;
                repaint();//重画页面
            }else if(snakeX[0]==food8X&&snakeY[0]==food8Y){
                length++;//长度加+1
                //分数加10
                score=score+10;
                //再次随机生成食物

                foodX = 25 + 25 * random.nextInt(34);
                foodY = 75 + 25 * random.nextInt(24);
                food1X = 25 + 25 * random.nextInt(34);
                food1Y = 75 + 25 * random.nextInt(24);
                food2X = 25 + 25 * random.nextInt(34);
                food2Y = 75 + 25 * random.nextInt(24);
                food3X = 25 + 25 * random.nextInt(34);
                food3Y = 75 + 25 * random.nextInt(24);
                food4X = 25 + 25 * random.nextInt(34);
                food4Y = 75 + 25 * random.nextInt(24);
                food5X = 25 + 25 * random.nextInt(34);
                food5Y = 75 + 25 * random.nextInt(24);
                food6X = 25 + 25 * random.nextInt(34);
                food6Y = 75 + 25 * random.nextInt(24);
                food7X = 25 + 25 * random.nextInt(34);
                food7Y = 75 + 25 * random.nextInt(24);
                food8X = 25 + 25 * random.nextInt(34);
                food8Y = 75 + 25 * random.nextInt(24);
                repaint();//重画页面
            }else if(snakeX[0]==food4X&&snakeY[0]==food4Y){
                length=length-2;
                score=score-20;
                foodX = 25 + 25 * random.nextInt(34);
                foodY = 75 + 25 * random.nextInt(24);
                food1X = 25 + 25 * random.nextInt(34);
                food1Y = 75 + 25 * random.nextInt(24);
                food2X = 25 + 25 * random.nextInt(34);
                food2Y = 75 + 25 * random.nextInt(24);
                food3X = 25 + 25 * random.nextInt(34);
                food3Y = 75 + 25 * random.nextInt(24);
                food4X = 25 + 25 * random.nextInt(34);
                food4Y = 75 + 25 * random.nextInt(24);
                food5X = 25 + 25 * random.nextInt(34);
                food5Y = 75 + 25 * random.nextInt(24);
                food6X = 25 + 25 * random.nextInt(34);
                food6Y = 75 + 25 * random.nextInt(24);
                food7X = 25 + 25 * random.nextInt(34);
                food7Y = 75 + 25 * random.nextInt(24);
                food8X = 25 + 25 * random.nextInt(34);
                food8Y = 75 + 25 * random.nextInt(24);
                repaint();//重画页面

            }else if(snakeX[0]==food5X&&snakeY[0]==food5Y){
                length=length-2;
                score=score-20;
                foodX = 25 + 25 * random.nextInt(34);
                foodY = 75 + 25 * random.nextInt(24);
                food1X = 25 + 25 * random.nextInt(34);
                food1Y = 75 + 25 * random.nextInt(24);
                food2X = 25 + 25 * random.nextInt(34);
                food2Y = 75 + 25 * random.nextInt(24);
                food3X = 25 + 25 * random.nextInt(34);
                food3Y = 75 + 25 * random.nextInt(24);
                food4X = 25 + 25 * random.nextInt(34);
                food4Y = 75 + 25 * random.nextInt(24);
                food5X = 25 + 25 * random.nextInt(34);
                food5Y = 75 + 25 * random.nextInt(24);
                food6X = 25 + 25 * random.nextInt(34);
                food6Y = 75 + 25 * random.nextInt(24);
                food7X = 25 + 25 * random.nextInt(34);
                food7Y = 75 + 25 * random.nextInt(24);
                food8X = 25 + 25 * random.nextInt(34);
                food8Y = 75 + 25 * random.nextInt(24);
                repaint();//重画页面

            }else if(snakeX[0]==food6X&&snakeY[0]==food6Y){
                length=length-2;
                score=score-20;
                foodX = 25 + 25 * random.nextInt(34);
                foodY = 75 + 25 * random.nextInt(24);
                food1X = 25 + 25 * random.nextInt(34);
                food1Y = 75 + 25 * random.nextInt(24);
                food2X = 25 + 25 * random.nextInt(34);
                food2Y = 75 + 25 * random.nextInt(24);
                food3X = 25 + 25 * random.nextInt(34);
                food3Y = 75 + 25 * random.nextInt(24);
                food4X = 25 + 25 * random.nextInt(34);
                food4Y = 75 + 25 * random.nextInt(24);
                food5X = 25 + 25 * random.nextInt(34);
                food5Y = 75 + 25 * random.nextInt(24);
                food6X = 25 + 25 * random.nextInt(34);
                food6Y = 75 + 25 * random.nextInt(24);
                food7X = 25 + 25 * random.nextInt(34);
                food7Y = 75 + 25 * random.nextInt(24);
                food8X = 25 + 25 * random.nextInt(34);
                food8Y = 75 + 25 * random.nextInt(24);
                repaint();//重画页面

            }

            //右移
            for (int i = length - 1; i > 0; i--) {//后一节移到前一节的位置snakeX[1]=snakeX[0];
                snakeX[i] = snakeX[i - 1];//向前移动一节
                snakeY[i] = snakeY[i-1];
            }

            //走向
            if (fx.equals("R")) {
                snakeX[0] = snakeX[0] + 25;
            } else if (fx.equals("L")) {
                snakeX[0] = snakeX[0] - 25;
            } else if (fx.equals("U")) {
                snakeY[0] = snakeY[0] - 25;
            }else if(fx.equals("D")){
                snakeY[0] = snakeY[0] + 25;
            }

            //失败判断,撞到自己就算失败
            for(int i=1;i<length;i++){
                if(snakeX[0]==snakeX[i]&&snakeY[0]==snakeY[i]){
                    isFail=true;
                }
            }
            //判断失败,撞到边界
            if(snakeX[0]<25){
                isFail=true;
            }else if(snakeY[0]<75){
                isFail=true;
            }else if (snakeX[0]>850){
                isFail=true;
            }else if (snakeY[0]>650){
                isFail=true;
            }

            repaint();//重画页面
        }

        timer.start();//定时器开始
    }


    @Override
    public void keyReleased(KeyEvent e) {

    }
    @Override
    public void keyTyped(KeyEvent e) {

    }
}

启动类

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

//游戏的主启动类
public class StartGame {
    public static void main(String[] args)  {
        JFrame frame=new JFrame("贪吃蛇小游戏");


        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

        JButton jButton1=new JButton("简单模式");
        JButton jButton2=new JButton("困难模式");
        JButton jButton3=new JButton("地狱模式");
        frame.setBounds(100,100,300,200);
        frame.setLayout(new GridLayout(3,1));
        frame.add(jButton1);
        frame.add(jButton2);
        frame.add(jButton3);

        //简单模式
        jButton1.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
              JDialog jDialog=new JDialog();
              jDialog.setBounds(10,10,900,720);
              jDialog.setResizable(false);
              jDialog.add(new GamePanel());
              jDialog.setVisible(true);
            }
        });
        //困难模式
        jButton2.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                JDialog jDialog=new JDialog();
                jDialog.setBounds(10,10,900,720);
                jDialog.setResizable(false);
                jDialog.add(new GamePanel1());
                jDialog.setVisible(true);
            }
        });

        //地狱模式
        jButton3.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                JDialog jDialog=new JDialog();
                jDialog.setBounds(10,10,900,720);
                jDialog.setResizable(false);
                jDialog.add(new GamePanel2());
                jDialog.setVisible(true);
            }
        });

        frame.setVisible(true);
    }
}
游戏图片

自己找图片,小蛇的生体和头部大小为25*25的,食物也是25*25的,顶部为633*87的

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我要学好编程

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值