Java小白简单实现贪吃蛇小游戏

环境:jdk1.8,IDEA

实现步骤:

  • 1.创建Snake类
public class  Snake extends JPanel implements KeyListener, ActionListener {
    int length;                       //蛇长度
    int[] snakeX =new int[600];      //蛇每一节X轴坐标
    int[] snakeY =new int[500];     //蛇每一节Y轴坐标
    int foodX=0;                   //食物每一节X坐标
    int foodY=0;                  //食物每一节X坐标
    String fx;                   //蛇初始方向
    boolean isStart =false;     //是否开始游戏
    boolean isFail = false;    //是否游戏失败
    Timer timer =new Timer(100,this);   //定时器

    
    public static void main(String[] args){}

    //初始化
    public void init();
    //构造方法
    public Snake();
    
     //画板,自动调用
     @Override
    public void paintComponent(Graphics g);

    //事件监听器
     @Override
    public void actionPerformed(ActionEvent e);
    
    //键盘监听器
     @Override
    public void keyPressed(KeyEvent e);

    
    //用不到
    @Override
    public void keyTyped(KeyEvent e) {
    }

    //用不到
    @Override
    public void keyReleased(KeyEvent e) {
    }
}
  • 2.初始化
//初始化
    public void init(){
        length = 3;
        snakeX[0] = 440;snakeY[0] = 360;        //蛇头
        snakeX[1] = 440;snakeY[1] = 380;
        snakeX[2] = 440;snakeY[2] = 400;
        fx = "U";                               //方向up
        foodX = new Random().nextInt(42)*20+20;    //食物初始位置
        foodY = new Random().nextInt(35)*20+20;
    }
  • 3.画地图
    public static void main(String[] args) {
        JFrame frame = new JFrame();                        //画地图
        frame.setBounds(10,10,880,720);
        frame.setResizable(false);
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        frame.add(new Snake());                            //加入蛇
        frame.setVisible(true);
    }
  • 4.画蛇,画界面,画食物
@Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        this.setBackground(Color.WHITE);    //背景白色

        g.setColor(Color.BLACK);            //设置填充
        g.fillRect(0,0,885,700);

        g.setColor(Color.WHITE);            //画头
        g.drawString("ʘ",snakeX[0],snakeY[0]);

        for (int i =1;i<length;i++){        //画身
            g.setColor(Color.WHITE);
            g.drawString("⚪",snakeX[i],snakeY[i]);
        }

        //游戏未开始主界面
        if (!isFail){               //游戏未失败
            if (!isStart){          //游戏未开始
                g.setFont(new Font("微软雅黑",Font.BOLD,40));
                g.setColor(Color.WHITE);
                g.drawString("按下空格 开始游戏",280,300);
                g.drawString("按下P键  暂停游戏",280,340);
            }else {                             //游戏开始后画食物
                g.setColor(Color.WHITE);
                g.drawString("❁", foodX, foodY);
                g.setColor(Color.WHITE);
                g.drawString("得分:" + (length - 3) * 10, 800, 20);
            }
        }else {                     //游戏失败
            g.setColor(Color.BLACK);            //设置填充
            g.fillRect(0,0,885,700);

            g.setFont(new Font("微软雅黑", Font.BOLD, 40));
            g.setColor(Color.WHITE);
            g.drawString("游戏结束 得分:"+(length*10-30), 280, 300);
            g.drawString("按下空格 重新游戏", 280, 340);

            timer.stop();               //游戏暂停

        }
  • 5.事件监听器
 //事件监听器
    /**
     * 蛇移动事件
     * 蛇撞墙事件
     * 蛇吃自己事件
     * 蛇吃食物事件
     *
     */
    @Override
    public void actionPerformed(ActionEvent e) {
        //蛇移动和撞墙事件
        for (int i = length -1; i>0;i--){           //身体后一节移动到前一节
            snakeX[i] =snakeX[i-1];
            snakeY[i] =snakeY[i-1];
        }
        if (!fx.equals("R")) {      //判断蛇的方向不等于R就等于其他方向
            if (fx.equals("D")){
                snakeY[0]=snakeY[0]+20;
                if (snakeY[0]>700){
                    isFail=true;
                }
            }else if (fx.equals("L")){
                snakeX[0]=snakeX[0]-20;
                if (snakeX[0]<0){
                    isFail=true;
                }
            }else if (fx.equals("U")){
                snakeY[0]=snakeY[0]-20;
                if (snakeY[0]<0){
                    isFail=true;
                }
            }
        } else {                        //蛇方向等于R
            snakeX[0]=snakeX[0]+20;     //向R方向移动
            if (snakeX[0]>870){          //判断是否撞墙,撞墙游戏结束
                isFail=true;
            }
        }
        //蛇吃食物事件
        if (snakeX[0] == foodX && snakeY[0] == foodY){              //如果蛇吃了食物,食物重新生成并蛇长长一节,并重新生成食物
            foodX = new Random().nextInt(40)*20+20;
            foodY = new Random().nextInt(30)*20+20;
            length+=1;
            snakeX[length-1]=snakeX[length-2];
            snakeY[length-1]=snakeY[length-2];
        }
        //蛇咬自己事件
        for (int i = 1; i < length; i++) {              //判断是否咬了自己
            if (snakeX[0] == snakeX[i] && snakeY[0] == snakeY[i]) {     //咬了自己游戏结束
                isFail = true;
                break;
            }
        }

    repaint();  //重画,根据定时器,让蛇动起来
    }
  • 6.键盘监听器
//键盘监听器
    @Override
    public void keyPressed(KeyEvent e) {
        int key = e.getKeyCode();       //按键代码
        if (key ==KeyEvent.VK_SPACE){       //判断是否为空格
            if(isFail){             //判断是否游戏失败,如果游戏失败初始化,
                isFail =false;
                init();
            }
            isStart=true;               //空格开始游戏
            timer.start();

        }else if (key ==KeyEvent.VK_P){   //判断是否为P键,P键暂停。
            isStart=false;
            timer.stop();                  //定时器暂停
            paintComponent(this.getGraphics());//调用画板,画暂停界面
        }
       if (isStart){          //当游戏开始时控制上下左右键控制蛇方向
           if (key ==KeyEvent.VK_UP){
               if (!fx.equals("D"))
               fx="U";
           }else if (key ==KeyEvent.VK_DOWN){
               if (!fx.equals("U"))
               fx="D";
           }else if (key ==KeyEvent.VK_LEFT){
               if (!fx.equals("R"))
               fx="L";
           }else if (key ==KeyEvent.VK_RIGHT){
               if (!fx.equals("L"))
               fx="R";
           }
       }
    }
  • 8.完整代码

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;

/**
 * Java贪吃蛇小游戏
 */

//Snake类继承画板,监听器
public class  Snake extends JPanel implements KeyListener, ActionListener {
    int length;                       //蛇长度
    int[] snakeX =new int[600];      //蛇每一节X轴坐标
    int[] snakeY =new int[500];     //蛇每一节Y轴坐标
    int foodX=0;                   //食物每一节X坐标
    int foodY=0;                  //食物每一节X坐标
    String fx;                   //蛇初始方向
    boolean isStart =false;     //是否开始游戏
    boolean isFail = false;    //是否游戏失败
    Timer timer =new Timer(100,this);   //定时器

    public static void main(String[] args) {
        JFrame frame = new JFrame();                        //画地图
        frame.setBounds(10,10,880,720);
        frame.setResizable(false);
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        frame.add(new Snake());                            //加入蛇
        frame.setVisible(true);
    }

    //初始化
    public void init(){
        length = 3;
        snakeX[0] = 440;snakeY[0] = 360;        //蛇头
        snakeX[1] = 440;snakeY[1] = 380;
        snakeX[2] = 440;snakeY[2] = 400;
        fx = "U";                               //方向up
        foodX = new Random().nextInt(42)*20+20;    //食物初始位置
        foodY = new Random().nextInt(35)*20+20;
    }
    //构造方法
    public Snake(){
        init();
        this.setFocusable(true);   //获得焦点
        this.addKeyListener(this); //获得事件
    }


    //画板,自动调用
    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        this.setBackground(Color.WHITE);    //背景白色

        g.setColor(Color.BLACK);            //设置填充
        g.fillRect(0,0,885,700);

        g.setColor(Color.WHITE);            //画头
        g.drawString("ʘ",snakeX[0],snakeY[0]);

        for (int i =1;i<length;i++){        //画身
            g.setColor(Color.WHITE);
            g.drawString("⚪",snakeX[i],snakeY[i]);
        }

        //游戏未开始主界面
        if (!isFail){               //游戏未失败
            if (!isStart){          //游戏未开始
                g.setFont(new Font("微软雅黑",Font.BOLD,40));
                g.setColor(Color.WHITE);
                g.drawString("按下空格 开始游戏",280,300);
                g.drawString("按下P键  暂停游戏",280,340);
            }else {                             //游戏开始后画食物
                g.setColor(Color.WHITE);
                g.drawString("❁", foodX, foodY);
                g.setColor(Color.WHITE);
                g.drawString("得分:" + (length - 3) * 10, 800, 20);
            }
        }else {                     //游戏失败
            g.setColor(Color.BLACK);            //设置填充
            g.fillRect(0,0,885,700);

            g.setFont(new Font("微软雅黑", Font.BOLD, 40));
            g.setColor(Color.WHITE);
            g.drawString("游戏结束 得分:"+(length*10-30), 280, 300);
            g.drawString("按下空格 重新游戏", 280, 340);

            timer.stop();               //游戏暂停

        }

        }
    //事件监听器
    /**
     * 蛇移动事件
     * 蛇撞墙事件
     * 蛇吃自己事件
     * 蛇吃食物事件
     *
     */
    @Override
    public void actionPerformed(ActionEvent e) {
        //蛇移动和撞墙事件
        for (int i = length -1; i>0;i--){           //身体后一节移动到前一节
            snakeX[i] =snakeX[i-1];
            snakeY[i] =snakeY[i-1];
        }
        if (!fx.equals("R")) {      //判断蛇的方向不等于R就等于其他方向
            if (fx.equals("D")){
                snakeY[0]=snakeY[0]+20;
                if (snakeY[0]>700){
                    isFail=true;
                }
            }else if (fx.equals("L")){
                snakeX[0]=snakeX[0]-20;
                if (snakeX[0]<0){
                    isFail=true;
                }
            }else if (fx.equals("U")){
                snakeY[0]=snakeY[0]-20;
                if (snakeY[0]<0){
                    isFail=true;
                }
            }
        } else {                        //蛇方向等于R
            snakeX[0]=snakeX[0]+20;     //向R方向移动
            if (snakeX[0]>870){          //判断是否撞墙,撞墙游戏结束
                isFail=true;
            }
        }
        //蛇吃食物事件
        if (snakeX[0] == foodX && snakeY[0] == foodY){              //如果蛇吃了食物,食物重新生成并蛇长长一节,并重新生成食物
            foodX = new Random().nextInt(40)*20+20;
            foodY = new Random().nextInt(30)*20+20;
            length+=1;
            snakeX[length-1]=snakeX[length-2];
            snakeY[length-1]=snakeY[length-2];
        }
        //蛇咬自己事件
        for (int i = 1; i < length; i++) {              //判断是否咬了自己
            if (snakeX[0] == snakeX[i] && snakeY[0] == snakeY[i]) {     //咬了自己游戏结束
                isFail = true;
                break;
            }
        }

    repaint();  //重画,根据定时器,让蛇动起来
    }

    //键盘监听器
    @Override
    public void keyPressed(KeyEvent e) {
        int key = e.getKeyCode();       //按键代码
        if (key ==KeyEvent.VK_SPACE){       //判断是否为空格
            if(isFail){             //判断是否游戏失败,如果游戏失败初始化,
                isFail =false;
                init();
            }
            isStart=true;               //空格开始游戏
            timer.start();

        }else if (key ==KeyEvent.VK_P){   //判断是否为P键,P键暂停。
            isStart=false;
            timer.stop();                  //定时器暂停
            paintComponent(this.getGraphics());//调用画板,画暂停界面
        }
       if (isStart){          //当游戏开始时控制上下左右键控制蛇方向
           if (key ==KeyEvent.VK_UP){
               if (!fx.equals("D"))
               fx="U";
           }else if (key ==KeyEvent.VK_DOWN){
               if (!fx.equals("U"))
               fx="D";
           }else if (key ==KeyEvent.VK_LEFT){
               if (!fx.equals("R"))
               fx="L";
           }else if (key ==KeyEvent.VK_RIGHT){
               if (!fx.equals("L"))
               fx="R";
           }
       }
    }


    @Override
    public void keyTyped(KeyEvent e) {
    }


    @Override
    public void keyReleased(KeyEvent e) {
    }


}
  • 9.运行

1.复制代码保存文件名Snake.java

2.javac -encoding utf-8 Snake.java

 

 

3.java Snake

 

 

 

 

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值