前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >转载+自己改进 Java 贪吃蛇简易程序「建议收藏」

转载+自己改进 Java 贪吃蛇简易程序「建议收藏」

作者头像
Java架构师必看
发布2022-06-20 09:11:59
1.3K0
发布2022-06-20 09:11:59
举报
文章被收录于专栏:Java架构师必看

大家好,我是架构君,一个会写代码吟诗的架构师。今天说一说转载+自己改进 Java 贪吃蛇简易程序「建议收藏」,希望能够帮助大家进步!!!

Java 贪吃蛇简易程序

视频地址:https://www.bilibili.com/video/BV1HE41127CV?p=3&spm_id_from=pageDriver

需求分析

  1. 界面设置
  2. 静态页面绘制
  3. 小蛇设置
  4. 吃食物
  5. 积分系统

素材文件:https://wwa.lanzoui.com/izIXjriydtg

link

1.主界面绘制

代码语言:javascript
复制
package Tanchishe;

import javax.swing.*;

public class StartGame { 
   
    public static void main(String[] args) { 
   
        //绘制一个静态窗口 JFrame
        JFrame frame = new JFrame("贪吃蛇小游戏");

        frame.setBounds(10,10,900,720);//设置大小
        frame.setResizable(false);//窗口不可变
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);


        frame.setVisible(true);

    }
}

只听到从架构师办公室传来架构君的声音:

佳期大堤下,泪向南云满。有谁来对上联或下联?

2.绘制游戏面板

代码语言:javascript
复制
此代码由Java架构师必看网-架构君整理
package Tanchishe;

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

public class GamePanel extends JPanel { 
   
    //画板 , 画蛇

    @Override
    //g就是画笔,画画
    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);
    }
}

在主界面加入游戏面板Jpanel

package Tanchishe;

import javax.swing.*;

public class StartGame {public static void main(String[] args) {

//1.绘制一个静态窗口 JFrame

JFrame frame = new JFrame(“贪吃蛇小游戏”);

frame.setBounds(10,10,900,720);//设置大小

frame.setResizable(false);//窗口不可变

frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

代码语言:javascript
复制
    //2.添加游戏面板
    frame.add(new GamePanel());

    frame.setVisible(true);

}}

数据存放部分类

代码语言:javascript
复制
此代码由Java架构师必看网-架构君整理
package Tanchishe;

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

//存放外部数据
public class Data { 
   
    //头部的图片 URL:定位图片地址 ImageIcon:图片
    public static URL headreurl= Data.class.getResource("/statics/header.png");
    public static ImageIcon header= new ImageIcon(headreurl);

    //蛇头部
    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);
}

3.画小蛇

代码语言:javascript
复制
package Tanchishe;

import javax.swing.*;
import java.awt.*;
//画板 , 画蛇
public class GamePanel extends JPanel { 
   

    int length;//蛇的长度
    int [] snakeX=new int[600];//蛇的坐标X
    int [] snakeY=new int[500];//蛇的坐标Y
    String fx="U";//R:右 L:左 U:上 D:下


    //构造器调用初始化
    public GamePanel(){ 
   
        init();
    }
    //初始化
    public void init()
    { 
   
        length=3;
        snakeX[0]=100;snakeY[0]=100;//头部坐标
        snakeX[1]=75;snakeY[1]=100;//第一个身体坐标
        snakeX[2]=50;snakeY[2]=100;//第二个身体坐标

    }

    @Override
    //g就是画笔,画画
    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);

        //画一条小蛇
        //判断蛇头方向
        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]);
        }
    }
}

4.让小蛇动起来 键盘监听 定时器

代码语言:javascript
复制
package Tanchishe;

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, ActionListener { 
   

    int length;//蛇的长度
    int [] snakeX=new int[600];//蛇的坐标X
    int [] snakeY=new int[500];//蛇的坐标Y
    String fx="R";//R:右 L:左 U:上 D:下
    boolean isStart=false; //游戏是否开始

    Timer timer =new Timer(100,this);//定时器
        

    //构造器调用初始化
    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;//第二个身体坐标

    }

    @Override
    //g就是画笔,画画
    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);

        //画一条小蛇
        //判断蛇头方向
        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)
        { 
   
            //画一个文字 string
            g.setColor(Color.WHITE);//设置画笔颜色
            g.setFont(new Font("微软雅黑",Font.BOLD,40));//设置字体
            g.drawString("按下空格开始游戏",300,300);

        }
    }


    //接收键盘的输入 监听
    @Override
    public void keyPressed(KeyEvent e) { 
   
        //键盘按下,未释放

        //获取按下的键盘是哪个键
        int keycode=e.getKeyCode();

        if(keycode==KeyEvent.VK_SPACE){ 
   
            //如果按下的是空格键
            isStart=!isStart;
            repaint();//重新绘制界面 刷新界面
        }

    }

    //定时器,监听时间,帧: 执行定时操作
    @Override
    public void actionPerformed(ActionEvent e) { 
   
        //如果游戏处于开始状态
        if (isStart) { 
   
            //右移
            for (int i = length - 1; i > 0; i--) { 
   
                //除了脑袋,身体都向前面移动
                snakeX[i] = snakeX[i - 1];
                snakeY[i] = snakeY[i - 1];
            }

            snakeX[0] = snakeX[0] + 25;//头部移动
            //边界判断
            if (snakeX[0] > 850) { 
   
                snakeX[0] = 25;
            }

            repaint();//重新绘制界面 刷新界面

        }

        timer.start();//让时间动起来
    }

    @Override
    public void keyReleased(KeyEvent e) { 
   
        //释放某个键
    }

    @Override
    public void keyTyped(KeyEvent e) { 
   
        //键盘按下 弹起 ,敲击键盘
    }


}

5 小蛇通过键盘控制走向

代码语言:javascript
复制
//通过控制方向让头部移动
            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;
                }
            }
代码语言:javascript
复制
package Tanchishe;

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, ActionListener { 
   

    int length;//蛇的长度
    int [] snakeX=new int[600];//蛇的坐标X
    int [] snakeY=new int[500];//蛇的坐标Y
    String fx="R";//R:右 L:左 U:上 D:下
    boolean isStart=false; //游戏是否开始

    Timer timer =new Timer(100,this);//定时器


    //构造器调用初始化
    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;//第二个身体坐标

    }

    @Override
    //g就是画笔,画画
    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);

        //画一条小蛇
        //判断蛇头方向
        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)
        { 
   
            //画一个文字 string
            g.setColor(Color.WHITE);//设置画笔颜色
            g.setFont(new Font("微软雅黑",Font.BOLD,40));//设置字体
            g.drawString("按下空格开始游戏",300,300);

        }
    }


    //接收键盘的输入 监听
    @Override
    public void keyPressed(KeyEvent e) { 
   
        //键盘按下,未释放

        //获取按下的键盘是哪个键
        int keycode=e.getKeyCode();

        if(keycode==KeyEvent.VK_SPACE){ 
   
            //如果按下的是空格键
            isStart=!isStart;
            repaint();//重新绘制界面 刷新界面
        }

        //键盘控制走向
        if(keycode==KeyEvent.VK_LEFT) { 
   
            fx="L";
        }
        if(keycode==KeyEvent.VK_RIGHT) { 
   
            fx="R";
        }
        if(keycode==KeyEvent.VK_UP) { 
   
            fx="U";
        }
        if(keycode==KeyEvent.VK_DOWN) { 
   
            fx="D";
        }

    }

    //定时器,监听时间,帧: 执行定时操作
    @Override
    public void actionPerformed(ActionEvent e) { 
   
        //如果游戏处于开始状态
        if (isStart) { 
   
            //右移
            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;
                }
            }
            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;
                }
            }



            repaint();//重新绘制界面 刷新界面

        }

        timer.start();//让时间动起来
    }

    @Override
    public void keyReleased(KeyEvent e) { 
   
        //释放某个键
    }

    @Override
    public void keyTyped(KeyEvent e) { 
   
        //键盘按下 弹起 ,敲击键盘
    }


}

6 食物

代码语言:javascript
复制
package Tanchishe;

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
    int [] snakeY=new int[500];//蛇的坐标Y
    String fx="R";//R:右 L:左 U:上 D:下
    boolean isStart=false; //游戏是否开始

    Timer timer =new Timer(100,this);//定时器

    //1. 定义一个食物
    int foodx;
    int foody;
    Random random = new Random();




    //构造器调用初始化
    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);
            foodx=getFoodx();
            foody=getFoody();


    }

    private int getFoodx(){ 
   
        int x=25+ 25*random.nextInt(34);
        boolean isFlag = true;
        while (isFlag) { 
   
            for (int i = 0; i<snakeX.length; i++)
            { 
   
                if(snakeX[i]==x)
                { 
   
                    x=25+ 25*random.nextInt(34);//相同生成新的位置
                }else{ 
   
                    isFlag=false; //不相同isFlag为false ,不循环了直接用
                }

            }
        }
        return x;
    }
    private int getFoody(){ 
   
        int y=75+25*random.nextInt(24);
        boolean isFlag = true;
        while (isFlag) { 
   
            for (int i = 0; i<snakeY.length; i++)
            { 
   
                if(snakeX[i]==y)
                { 
   
                    y=75+25*random.nextInt(24);//相同生成新的位置
                }else{ 
   
                    isFlag=false; //不相同isFlag为false ,不循环了直接用
                }

            }
        }
        return y;
    }

    @Override
    //g就是画笔,画画
    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);

        //画一条小蛇
        //判断蛇头方向
        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]);
        }




        //画食物
        Data.food.paintIcon(this,g,foodx,foody);


        //游戏提示:是否开始
        if (isStart==false)
        { 
   
            //画一个文字 string
            g.setColor(Color.WHITE);//设置画笔颜色
            g.setFont(new Font("微软雅黑",Font.BOLD,40));//设置字体
            g.drawString("按下空格开始游戏",300,300);

        }
    }


    //接收键盘的输入 监听
    @Override
    public void keyPressed(KeyEvent e) { 
   
        //键盘按下,未释放

        //获取按下的键盘是哪个键
        int keycode=e.getKeyCode();

        if(keycode==KeyEvent.VK_SPACE){ 
   
            //如果按下的是空格键
            isStart=!isStart;
            repaint();//重新绘制界面 刷新界面
        }

        //键盘控制走向
        if(keycode==KeyEvent.VK_LEFT) { 
   
            fx="L";
        }
        if(keycode==KeyEvent.VK_RIGHT) { 
   
            fx="R";
        }
        if(keycode==KeyEvent.VK_UP) { 
   
            fx="U";
        }
        if(keycode==KeyEvent.VK_DOWN) { 
   
            fx="D";
        }

    }

    //定时器,监听时间,帧: 执行定时操作
    @Override
    public void actionPerformed(ActionEvent e) { 
   
        //如果游戏处于开始状态
        if (isStart) { 
   
            //右移
            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;
                }
            }
            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;
                }
            }


            //如果小蛇的头跟食物的坐标重合了,吃到了
            if(snakeX[0]==foodx&&snakeY[0]==foody) { 
   
                //长度+1
                length++;
                //重新生成食物
                foodx = 25 + 25 * random.nextInt(34);
                foody = 75 + 25 * random.nextInt(24);
            }

            repaint();//重新绘制界面 刷新界面

        }

        timer.start();//让时间动起来
    }

    @Override
    public void keyReleased(KeyEvent e) { 
   
        //释放某个键
    }

    @Override
    public void keyTyped(KeyEvent e) { 
   
        //键盘按下 弹起 ,敲击键盘
    }


}

7 积分系统

总代码:

代码语言:javascript
复制
package Tanchishe;

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
    int [] snakeY=new int[500];//蛇的坐标Y
    String fx="R";//R:右 L:左 U:上 D:下
    boolean isStart=false; //游戏是否开始

    Timer timer =new Timer(100,this);//定时器

    //1. 定义一个食物
    int foodx;
    int foody;
    Random random = new Random();

    //2.死亡判断
    boolean isFail=false;

    //3.积分系统
    int score;



    //构造器调用初始化
    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);
            foodx=getFoodx();
            foody=getFoody();

            score=0;


    }

    private int getFoodx(){ 
   
        int x=25+ 25*random.nextInt(34);
        boolean isFlag = true;
        while (isFlag) { 
   
            for (int i = 0; i<snakeX.length; i++)
            { 
   
                if(snakeX[i]==x)
                { 
   
                    x=25+ 25*random.nextInt(34);//相同生成新的位置
                }else{ 
   
                    isFlag=false; //不相同isFlag为false ,不循环了直接用
                }

            }
        }
        return x;
    }
    private int getFoody(){ 
   
        int y=75+25*random.nextInt(24);
        boolean isFlag = true;
        while (isFlag) { 
   
            for (int i = 0; i<snakeY.length; i++)
            { 
   
                if(snakeX[i]==y)
                { 
   
                    y=75+25*random.nextInt(24);//相同生成新的位置
                }else{ 
   
                    isFlag=false; //不相同isFlag为false ,不循环了直接用
                }

            }
        }
        return y;
    }

    @Override
    //g就是画笔,画画
    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);

        //画一条小蛇
        //判断蛇头方向
        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]);
        }




        //画食物
        Data.food.paintIcon(this,g,foodx,foody);

        //画积分
        g.setColor(Color.WHITE);
        g.setFont(new Font("微软雅黑",Font.BOLD,18));
        g.drawString("长度:"+length,750,35);
        g.drawString("分数:"+score,750,50);




        //游戏提示:是否开始
        if (isStart==false)
        { 
   
            //画一个文字 string
            g.setColor(Color.WHITE);//设置画笔颜色
            g.setFont(new Font("微软雅黑",Font.BOLD,40));//设置字体
            g.drawString("按下空格开始游戏",300,300);

        }

        //失败提示
        if(isFail)
        { 
   
            //画一个文字 string
            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_LEFT) { 
   
            fx="L";
        }
        if(keycode==KeyEvent.VK_RIGHT) { 
   
            fx="R";
        }
        if(keycode==KeyEvent.VK_UP) { 
   
            fx="U";
        }
        if(keycode==KeyEvent.VK_DOWN) { 
   
            fx="D";
        }

    }

    //定时器,监听时间,帧: 执行定时操作
    @Override
    public void actionPerformed(ActionEvent e) { 
   
        //如果游戏处于开始状态,并且游戏没有结束
        if(isStart&&isFail==false){ 
   
        if (isStart) { 
   
            //右移
            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;
                }
            }
            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;
                }
            }


            //如果小蛇的头跟食物的坐标重合了,吃到了
            if(snakeX[0]==foodx&&snakeY[0]==foody) { 
   
                //长度+1
                length++;
                //分数加1
                score=score+10;

                //重新生成食物
                foodx = 25 + 25 * random.nextInt(34);
                foody = 75 + 25 * random.nextInt(24);
            }

            //结束判断
            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) { 
   
        //键盘按下 弹起 ,敲击键盘
    }


}

总代码

Data:数据类

代码语言:javascript
复制
package Tanchishe;

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

//存放外部数据
public class Data { 
   
    //头部的图片 URL:定位图片地址 ImageIcon:图片
    public static URL headreurl= Data.class.getResource("/statics/header.png");
    public static ImageIcon header= new ImageIcon(headreurl);

    //蛇头部
    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);



}

StartGame:开始游戏 主界面类

代码语言:javascript
复制
package Tanchishe;

import javax.swing.*;

public class StartGame { 
   
    public static void main(String[] args) { 
   
        //1.绘制一个静态窗口 JFrame
        JFrame frame = new JFrame("贪吃蛇小游戏");

        frame.setBounds(10,10,900,720);//设置大小
        frame.setResizable(false);//窗口不可变
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

        //2.添加游戏面板
        frame.add(new GamePanel());

        frame.setVisible(true);

    }
}

GamePanel : 游戏界面 功能类

代码语言:javascript
复制
package Tanchishe;

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
    int [] snakeY=new int[500];//蛇的坐标Y
    String fx="R";//R:右 L:左 U:上 D:下
    boolean isStart=false; //游戏是否开始

    Timer timer =new Timer(100,this);//定时器

    //1. 定义一个食物
    int foodx;
    int foody;
    Random random = new Random();

    //2.死亡判断
    boolean isFail=false;

    //3.积分系统
    int score;



    //构造器调用初始化
    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);
            foodx=getFoodx();
            foody=getFoody();

            score=0;


    }

    private int getFoodx(){ 
   
        int x=25+ 25*random.nextInt(34);
        boolean isFlag = true;
        while (isFlag) { 
   
            for (int i = 0; i<snakeX.length; i++)
            { 
   
                if(snakeX[i]==x)
                { 
   
                    x=25+ 25*random.nextInt(34);//相同生成新的位置
                }else{ 
   
                    isFlag=false; //不相同isFlag为false ,不循环了直接用
                }

            }
        }
        return x;
    }
    private int getFoody(){ 
   
        int y=75+25*random.nextInt(24);
        boolean isFlag = true;
        while (isFlag) { 
   
            for (int i = 0; i<snakeY.length; i++)
            { 
   
                if(snakeX[i]==y)
                { 
   
                    y=75+25*random.nextInt(24);//相同生成新的位置
                }else{ 
   
                    isFlag=false; //不相同isFlag为false ,不循环了直接用
                }

            }
        }
        return y;
    }

    @Override
    //g就是画笔,画画
    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);

        //画一条小蛇
        //判断蛇头方向
        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]);
        }




        //画食物
        Data.food.paintIcon(this,g,foodx,foody);

        //画积分
        g.setColor(Color.WHITE);
        g.setFont(new Font("微软雅黑",Font.BOLD,18));
        g.drawString("长度:"+length,750,35);
        g.drawString("分数:"+score,750,50);




        //游戏提示:是否开始
        if (isStart==false)
        { 
   
            //画一个文字 string
            g.setColor(Color.WHITE);//设置画笔颜色
            g.setFont(new Font("微软雅黑",Font.BOLD,40));//设置字体
            g.drawString("按下空格开始游戏",300,300);

        }

        //失败提示
        if(isFail)
        { 
   
            //画一个文字 string
            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_LEFT) { 
   
            fx="L";
        }
        if(keycode==KeyEvent.VK_RIGHT) { 
   
            fx="R";
        }
        if(keycode==KeyEvent.VK_UP) { 
   
            fx="U";
        }
        if(keycode==KeyEvent.VK_DOWN) { 
   
            fx="D";
        }

    }

    //定时器,监听时间,帧: 执行定时操作
    @Override
    public void actionPerformed(ActionEvent e) { 
   
        //如果游戏处于开始状态,并且游戏没有结束
        if(isStart&&isFail==false){ 
   
        if (isStart) { 
   
            //右移
            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;
                }
            }
            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;
                }
            }


            //如果小蛇的头跟食物的坐标重合了,吃到了
            if(snakeX[0]==foodx&&snakeY[0]==foody) { 
   
                //长度+1
                length++;
                //分数加1
                score=score+10;

                //重新生成食物
                foodx = 25 + 25 * random.nextInt(34);
                foody = 75 + 25 * random.nextInt(24);
            }

            //结束判断
            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) { 
   
        //键盘按下 弹起 ,敲击键盘
    }


}

改进----不能回头,多个食物,撞墙

代码语言:javascript
复制
package Tanchishe;

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
    int [] snakeY=new int[500];//蛇的坐标Y
    String fx="R";//R:右 L:左 U:上 D:下
    boolean isStart=false; //游戏是否开始

    Timer timer =new Timer(100,this);//定时器

    //1. 定义一个食物

    Random random = new Random();

    //1.定义随机多个食物
    int num=random.nextInt(10);
    int foodx[]=new int[num];
    int foody[]=new int[num];

    //2.死亡判断
    boolean isFail=false;

    //3.积分系统
    int score;





    //构造器调用初始化
    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);

        for (int i = 0; i <num ; i++) { 
   
            foodx[i]=getFoodx();
            foody[i]=getFoody();

        }

            score=0;


    }

    private int getFoodx(){ 
   
        int x=25+ 25*random.nextInt(34);
        boolean isFlag = true;
        while (isFlag) { 
   
            for (int i = 0; i<snakeX.length; i++)
            { 
   
                if(snakeX[i]==x)
                { 
   
                    x=25+ 25*random.nextInt(34);//相同生成新的位置
                }else{ 
   
                    isFlag=false; //不相同isFlag为false ,不循环了直接用
                }

            }
        }
        return x;
    }
    private int getFoody(){ 
   
        int y=75+25*random.nextInt(24);
        boolean isFlag = true;
        while (isFlag) { 
   
            for (int i = 0; i<snakeY.length; i++)
            { 
   
                if(snakeX[i]==y)
                { 
   
                    y=75+25*random.nextInt(24);//相同生成新的位置
                }else{ 
   
                    isFlag=false; //不相同isFlag为false ,不循环了直接用
                }

            }
        }
        return y;
    }

    @Override
    //g就是画笔,画画
    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);

        //画一条小蛇
        //判断蛇头方向
        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]);
        }




        //画食物
        for (int i = 0; i <num; i++) { 
   
            Data.food.paintIcon(this,g,foodx[i],foody[i]);
        }


        //画积分
        g.setColor(Color.WHITE);
        g.setFont(new Font("微软雅黑",Font.BOLD,18));
        g.drawString("长度:"+length,750,35);
        g.drawString("分数:"+score,750,55);







        //游戏提示:是否开始
        if (isStart==false)
        { 
   
            //画一个文字 string
            g.setColor(Color.WHITE);//设置画笔颜色
            g.setFont(new Font("微软雅黑",Font.BOLD,40));//设置字体
            g.drawString("按下空格开始游戏",300,300);

        }

        //失败提示
        if(isFail)
        { 
   
            //画一个文字 string
            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_LEFT) { 
   
            if(fx!="R")
            { 
   fx="L";} //如果蛇现在移动的方向不是向右时候,可以向左移动
        }
        if(keycode==KeyEvent.VK_RIGHT) { 
   
            if(fx!="L")
            { 
   fx="R";}  //如果蛇现在移动的方向不是向左移动时候,可以向右移动
        }
        if(keycode==KeyEvent.VK_UP) { 
   
            if(fx!="D")
            { 
   fx="U";}  //如果蛇现在移动的方向不是向下移动时候,可以向上移动
        }
        if(keycode==KeyEvent.VK_DOWN) { 
   
            if(fx!="U")
            { 
   fx="D";}  //如果蛇现在移动的方向不是向上移动时候,可以向下移动
        }

    }



    //定时器,监听时间,帧: 执行定时操作
    @Override
    public void actionPerformed(ActionEvent e) { 
   
        //如果游戏处于开始状态,并且游戏没有结束
        if(isStart&&isFail==false){ 
   
        if (isStart) { 
   
            //右移
            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;
                    isFail=!isFail;//失败
                }
            }
            else if(fx.equals("L")){ 
   
                snakeX[0] = snakeX[0] - 25;//头部移动
                //边界判断
                if (snakeX[0] < 25) { 
   
                    //snakeX[0] = 850;
                    isFail=!isFail;//失败
                }
            }
            else if(fx.equals("U")){ 
   
                snakeY[0] = snakeY[0] - 25;//头部移动
                //边界判断
                if (snakeY[0] < 75) { 
   
                    //snakeY[0] = 650;
                    isFail=!isFail;//失败
                }
            }
            else if(fx.equals("D")){ 
   
                snakeY[0] = snakeY[0] + 25;//头部移动
                //边界判断
                if (snakeY[0] > 650) { 
   
                   // snakeY[0] = 75;
                    isFail=!isFail;//失败
                }
            }


            //如果小蛇的头跟食物的坐标重合了,吃到了
            for (int i = 0; i <num; i++) { 
   
                if(snakeX[0]==foodx[i]&&snakeY[0]==foody[i]) { 
   
                    //长度+1
                    length++;
                    //分数加1
                    score=score+10;

                    //重新生成食物
                    foodx[i] = 25 + 25 * random.nextInt(34);
                    foody[i] = 75 + 25 * random.nextInt(24);
                }

            }


            //结束判断
            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) { 
   
        //键盘按下 弹起 ,敲击键盘
    }


}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-06-192,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Java 贪吃蛇简易程序
  • 需求分析
  • 1.主界面绘制
  • 2.绘制游戏面板
  • 3.画小蛇
  • 4.让小蛇动起来 键盘监听 定时器
  • 5 小蛇通过键盘控制走向
  • 6 食物
  • 7 积分系统
  • 总代码
  • 改进----不能回头,多个食物,撞墙
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档