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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。