Java贪吃蛇游戏,基于java的贪吃蛇游戏的设计与实现

  Java贪吃蛇游戏,基于java的贪吃蛇游戏的设计与实现

  分享一个爪哇贪吃蛇小游戏,主要用到的是爪哇的JFrame,适合初学者。

  首先创建一个合适大小的窗口,我这里是900*720

  包com。lzi金;/* @ auther : lzi金* @ date 3360 2021/11/5-11-05-22:06 * @ description : com。lzi金* @版本: 16.0 */导入javax。挥棒。jframe公共类start { public static void main(String[]args){//创建对象、标题JFrame框架=新JFrame(贪吃蛇小游戏);//设置位置、大小frame.setBounds(510,130,900,720);//设置窗口大小不可改变框架。setresizable(false);//设置关闭按钮框架。setdefaultcloseoperation(JFrame .EXIT _ ON _ CLOSE);//显示窗口框架。设置可见(真);}}创建好之后大概就是这个样子:

  现在我们导入一些素材,辐条,食物,还有蛇的头,身体等素材。

  包com。lzi金;/* @ auther : lzi金* @ date 3360 2021/11/5-11-05-22:08 * @ description : com。lzi金* @版本: 16.0 */导入javax。挥棒。*;导入Java。util。对象;公共类数据{ //获取头部素材公共静态图像图标标题=新图像图标(对象。要求非空(数据。班级。获取资源(/statics/header。png’));//获取头部素材公共静态图像图标up=新图像图标(对象。要求非空(数据。班级。获取资源(/statics/up。png’));公共静态图像图标向下=新图像图标(对象。要求非空(数据。班级。获取资源(/statics/down。png’));公共静态图像图标左=新图像图标(对象。要求非空(数据。班级。获取资源(/statics/left。png’));公共静态图像图标右=新图像图标(对象。要求非空(数据。班级。获取资源(/statics/right。png’));//获取身体素材公共静态图像图标body _ up=新图像图标(对象。要求非空(数据。班级。获取资源(/statics/body up。png’));公共静态图像图标body _ right=新图像图标(对象。要求非空(数据。班级。获取资源(/statics/body right。png’));公共静态图像图标body _ down=新图像图标(对象。要求非空(数据。班级。获取资源(/statics/body down。png’));公共静态图像图标body _ left=新图像图标(对象。要求非空(数据。班级。获取资源(/statics/body left。png’));//获取食物素材公共静态图像图标candy=新图像图标(对象。要求非空(数据。班级。获取资源(/statics/candy。png’));公共静态图像图标鼓槌=新即时消息

  ageIcon(Objects.requireNonNull(Data.class.getResource("/statics/drumsticks.png")));    public static ImageIcon hamburger = new ImageIcon(Objects.requireNonNull(Data.class.getResource("/statics/hamburger.png")));    public static ImageIcon twm = new ImageIcon(Objects.requireNonNull(Data.class.getResource("/statics/twm.png")));  }素材如下:

  头、身体、食物都是:25+25像素

  横幅:850*50像素

  自己可以去PS里面做几张

  

 

  现在我们来创建一个画板,把蛇画到画板上,还要让他动起来。

  这里面涉及到的东西稍微有点多,创建一个画笔的方法,把图片素材转换为ImageIcon然后画到相应的位置,蛇向右移动一次就是所有身体的X坐标加一,向下移就是Y坐标加一,其他相同。随机函数生成两个随机数,其坐标就是食物的位置。蛇头的X坐标和Y坐标与食物的X坐标Y坐标重合就说明已经吃到食物。蛇头越过边界,或者蛇头与某一个身体的坐标重合,都判定蛇死亡。

  

package com.lzijin; 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];    int[] snakeY = new int[500];    String fx;    boolean isStart = false;    Timer timer = new Timer(100, this);    int foodX;    int foodY;    Random random = new Random();    boolean isFail = false;    int score;    Random random_food =new Random();    int food;      // 构造器    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);        score = 0;     }     protected void paintComponent(Graphics g) {        super.paintComponent(g);// 清屏        this.setBackground(Color.white);// 背景色        Data.header.paintIcon(this, g, 25, 11);// 标题栏位置           g.setColor(Color.cyan);        //画背景图片        g.fillRect(25, 75, 850, 600);// 游戏区域         // 静态蛇        // 初始化头的方向,位置        switch (fx) {            case "R" -> Data.right.paintIcon(this, g, snakeX[0], snakeY[0]);            case "L" -> Data.left.paintIcon(this, g, snakeX[0], snakeY[0]);            case "U" -> Data.up.paintIcon(this, g, snakeX[0], snakeY[0]);            case "D" -> Data.down.paintIcon(this, g, snakeX[0], snakeY[0]);        }         // 默认身体        for (int i = 1; i < length; i++) {            switch (fx) {                case "R" -> Data.body_right.paintIcon(this, g, snakeX[i], snakeY[i]);                case "L" -> Data.body_left.paintIcon(this, g, snakeX[i], snakeY[i]);                case "U" -> Data.body_up.paintIcon(this, g, snakeX[i], snakeY[i]);                case "D" -> Data.body_down.paintIcon(this, g, snakeX[i], snakeY[i]);            }        }        // 画积分        g.setColor(Color.BLUE);        g.setFont(new Font("微软雅黑", Font.BOLD, 18));        g.drawString("长度:" + length, 750, 33);        g.drawString("分数:" + score, 750, 52);         // 画食物         switch (food) {            case 1 -> Data.candy.paintIcon(this, g, foodX, foodY);            case 2 -> Data.drumsticks.paintIcon(this, g, foodX, foodY);            case 3 -> Data.hamburger.paintIcon(this, g, foodX, foodY);            default -> Data.twm.paintIcon(this, g, foodX, foodY);        }         // 提示是否开始        if (!isStart) {            // 设置颜色            g.setColor(Color.white);            // 设置字体            g.setFont(new Font("楷体", Font.BOLD, 40));            // 设置内容            g.drawString("按下空格请小姐姐吃糖", 250, 300);        }        if (isFail) {            // 设置颜色            g.setColor(Color.RED);            // 设置字体            g.setFont(new Font("微软雅黑", Font.BOLD, 40));            // 设置内容            g.drawString("哎呀,小姐姐没了!", 300, 300);        }    }     @Override    public void keyTyped(KeyEvent e) {        // 敲击     }     /*     * 取按下的键     */    @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.equals("R"))                fx = "L";        } else if (KeyCode == KeyEvent.VK_RIGHT) {            if (!fx.equals("L"))                fx = "R";        } else if (KeyCode == KeyEvent.VK_UP) {            if (!fx.equals("D"))                fx = "U";        } else if (KeyCode == KeyEvent.VK_DOWN) {            if (!fx.equals("U"))                fx = "D";        }     }     @Override    public void keyReleased(KeyEvent e) {        // 释放     }     /*     * 定时器,时间监听 蛇的移动 吃食物 失败判断 页面刷新     */    @Override    public void actionPerformed(ActionEvent e) {        // 如果游戏处于开始状态        if (isStart && !isFail) {            // 身体移动            for (int i = length - 1; i > 0; i--) {                snakeX[i] = snakeX[i - 1];                snakeY[i] = snakeY[i - 1];            }            // 头部移动            switch (fx) {                case "R" -> {                    snakeX[0] = snakeX[0] + 25;                    if (snakeX[0] > 850) {// 边界判断                        isFail = true;                        //snakeX[0] = 25;                    }                }                case "L" -> {                    snakeX[0] = snakeX[0] - 25;                    if (snakeX[0] < 25) {// 边界判断                        isFail = true;                        //snakeX[0] = 850;                    }                }                case "U" -> {                    snakeY[0] = snakeY[0] - 25;                    if (snakeY[0] < 75) {// 边界判断                        isFail = true;                        //snakeY[0] = 650;                    }                }                case "D" -> {                    snakeY[0] = snakeY[0] + 25;                    if (snakeY[0] > 650) {// 边界判断                        isFail = true;                         //snakeY[0] = 75;                    }                }            }             // 吃食物            if (snakeX[0] == foodX && snakeY[0] == foodY) {                length++;                score += 10;                // 重新生成食物                foodX = 25 + 25 * random.nextInt(34);                foodY = 75 + 25 * random.nextInt(24);                food=1+random_food.nextInt(4);            }            // 结束判断             for (int i = 1; i < length; i++) {                if (snakeX[0] == snakeX[i] && snakeY[0] == snakeY[i]) {                    isFail = true;                    break;                }            }            // 刷新页面            repaint();        }        timer.start();    } }

别忘添加素材图片:

 

  

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: