Java+JFrame实现贪吃蛇小游戏
作者:小秋LY
这篇文章主要为大家详细介绍了Java+JFrame实现贪吃蛇小游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
分享一个Java贪吃蛇小游戏,主要用到的是Java的JFrame,适合初学者。
首先创建一个合适大小的窗口,我这里是900*720
package com.lzijin; /* @Auther: lzijin * @Date: 2021/11/5 - 11 - 05 - 22:06 * @Description: com.lzijin * @version: 16.0 */ import javax.swing.JFrame; public class Start { public static void main(String[] args) { // 创建对象、标题 JFrame frame = new JFrame("贪吃蛇小游戏"); // 设置位置、大小 frame.setBounds(510, 130, 900, 720); // 设置窗口大小不可改变 frame.setResizable(false); // 设置关闭按钮 frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // 显示窗口 frame.setVisible(true); } }
创建好之后大概就是这个样子:
现在我们导入一些素材,辐条,食物,还有蛇的头,身体等素材。
package com.lzijin; /* @Auther: lzijin * @Date: 2021/11/5 - 11 - 05 - 22:08 * @Description: com.lzijin * @version: 16.0 */ import javax.swing.*; import java.util.Objects; public class Data { // 获取头部素材 public static ImageIcon header = new ImageIcon(Objects.requireNonNull(Data.class.getResource("/statics/header.png"))); //获取头部素材 public static ImageIcon up = new ImageIcon(Objects.requireNonNull(Data.class.getResource("/statics/up.png"))); public static ImageIcon down = new ImageIcon(Objects.requireNonNull(Data.class.getResource("/statics/down.png"))); public static ImageIcon left = new ImageIcon(Objects.requireNonNull(Data.class.getResource("/statics/left.png"))); public static ImageIcon right = new ImageIcon(Objects.requireNonNull(Data.class.getResource("/statics/right.png"))); // 获取身体素材 public static ImageIcon body_up = new ImageIcon(Objects.requireNonNull(Data.class.getResource("/statics/bodyup.png"))); public static ImageIcon body_right = new ImageIcon(Objects.requireNonNull(Data.class.getResource("/statics/bodyright.png"))); public static ImageIcon body_down = new ImageIcon(Objects.requireNonNull(Data.class.getResource("/statics/bodydown.png"))); public static ImageIcon body_left = new ImageIcon(Objects.requireNonNull(Data.class.getResource("/statics/bodyleft.png"))); // 获取食物素材 public static ImageIcon candy = new ImageIcon(Objects.requireNonNull(Data.class.getResource("/statics/candy.png"))); public static ImageIcon drumsticks = new ImageIcon(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(); } }
别忘添加素材图片:
最后将画板添加到窗口当中
现在我们的贪吃蛇就做好了
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。