JAVA实现贪吃蛇游戏

article/2025/10/15 12:10:16

本文实现的功能有:

1.绘制静态窗口

2.绘制游戏面板

3.绘制静态小蛇

4.通过键盘控制小蛇移动

5.吃食物

6.积分系统和失败判定

最近在学GUI,然后又有读者希望我写一下相关的实战。刚好博主在b站漫无目的的寻找着题材的时候看到了一个写贪吃蛇游戏的视频,于是便写了这篇文章来怀念一下。快来和小伙伴们一起玩贪吃蛇吧兄弟们,(虽然编译器运行后的贪吃蛇是单机游戏,哈哈,但还是可以两个人轮流玩,比分数的)。 

运用到的知识点:

GUI:java实现窗体、Swing。其实JAVA Swing的GUI目前企业中已经不用了,主要是一些学校和培训机构用来教导学生写一些游戏、小项目,练练手的。

多线程:定时器、刷帧等。 

注:代码来源b站的一个UP主:狂神。

 游戏主启动类:

import javax.swing.*;//游戏主启动类
public class startGame {public static void main(String[] args) {JFrame frame=new JFrame();frame.setBounds(10,10,900,720);frame.setResizable(false);//窗口大小不可变frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);//退出为系统退出frame.add(new GamePanel());frame.setVisible(true);}
}

 图片等数据类:

import javax.swing.*;
import java.net.URL;
//数据中心
public class Data {public static URL headerURL=Data.class.getResource("/static/h.jpg");//顶部public static ImageIcon header=new ImageIcon(headerURL);public static URL upURL=Data.class.getResource("/static/s.png");//上public static ImageIcon up=new ImageIcon(upURL);public static URL downURL=Data.class.getResource("/static/x.png");//下public static ImageIcon down=new ImageIcon(downURL);public static URL leftURL=Data.class.getResource("/static/l.png");//左public static ImageIcon left=new ImageIcon(leftURL);public static URL rightURL=Data.class.getResource("/static/r.png");//右public static ImageIcon right=new ImageIcon(rightURL);public static URL bodyURL=Data.class.getResource("/static/st.png");//身体public static ImageIcon body=new ImageIcon(bodyURL);public static URL foodURL=Data.class.getResource("/static/food.png");//食物public static ImageIcon food=new ImageIcon(foodURL);
}

 画板(功能实现)类:

这里面又涉及到了一个不是GUI的知识点:定时器,定时器是一种控制任务延时调用,或者周期调用的技术。这是多线程里面的知识,有疑问的可以去看看我之前写的多线程的文章。

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坐标 25*25int snakey []=new int[500];//蛇的y坐标 25*25String fx;//食物的坐标int foodx;int foody;Random random=new Random();int score;//成绩//游戏当前的状态:开始 停止boolean isStart=false;//默认是停止boolean isFail=false;//默认游戏状态失败//定时器 以毫秒为单位 1000ms=1sTimer timer=new Timer(100,this);//100毫秒刷新(执行)一次//构造器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;}//绘制面板,我们游戏中的所有东西都是用这个画笔来画@Overrideprotected void paintComponent(Graphics g) {super.paintComponent(g);//清屏this.setBackground(Color.WHITE);Data.header.paintIcon(this,g,155,11);//顶部标题写上去g.fillRect(25,75,850,600);//默认的游戏界面//画积分g.setColor(Color.white);g.setFont(new Font("微软雅黑",Font.BOLD,18));g.drawString("长度:"+length,650,30);g.drawString("积分:"+score,650,55);//画食物Data.food.paintIcon(this,g,foodx,foody);//把小蛇画上去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]);//蛇头初始化向下,需要通过方向来判断}//从第一节身体开始变化所以i=1for (int i = 1; i <length ; i++) {Data.body.paintIcon(this,g,snakex[i],snakey[i]);}//游戏状态if(isStart==false){g.setColor(Color.white);//设置字体g.setFont(new Font("微软雅黑",Font.BOLD,40));g.drawString("按下空格开始游戏",300,300);}if(isFail){g.setColor(Color.RED);//设置字体g.setFont(new Font("微软雅黑",Font.BOLD,40));g.drawString("游戏失败,按下空格重新开始!",200,300);}}//键盘监听事件@Overridepublic 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_UP){//上fx="U";}else if(keycode==KeyEvent.VK_DOWN){//下fx="D";}else if(keycode==KeyEvent.VK_LEFT){//左fx="L";}else if(keycode==KeyEvent.VK_RIGHT){//右fx="R";}}//事件监听,需要通过固定的时间(事件)来刷新@Overridepublic void actionPerformed(ActionEvent e) {if(isStart && isFail==false){//如果游戏是开始状态,就让小蛇动起来//吃食物if(snakex[0]==foodx&&snakey[0]==foody){length++;//长度加1//分数加10score=score+10;//再次随机生成食物foodx=25+25*random.nextInt(34);foody=75+25*random.nextInt(24);}//移动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("D")){snakey[0]=snakey[0]+25;if(snakey[0]>650){//边界判断snakey[0]=75;}}else if(fx.equals("U")){snakey[0]=snakey[0]-25;if(snakey[0]<75){//边界判断snakey[0]=650;}}//失败判定:撞到自己就算失败for (int i = 1; i <length ; i++) {if(snakex[0]==snakex[i]&&snakey[0]==snakey[i]){isFail=true;}}repaint();//重画界面}timer.start();//定时器开启}@Overridepublic void keyReleased(KeyEvent e) {}@Overridepublic void keyTyped(KeyEvent e) {}}

 相关图片:

在项目下创建一个单独的包,先把图片保存到自己的电脑上,然后复制图片,选中项目中刚刚创建的包,粘贴到上面,再把这些图片重命名一下,保持和数据类中的路径名一样即可。

 15171208bfd74de489b033ff52e30017.png

 ff6dceeb2f3c4cf2ab727a79e7810520.png

a42fed7f4fea4c819468f68a02f4f662.png

666a332fad5e490cbf534efd43a3b4b9.png

91974ee1eeb14bc1ba0954035d7a2ec5.png

 3b51e484bd9846baaca78cd09ad69215.png

 运行后的结果:

3ca8884455b84392851dfbeebbb30e4b.png

 本文中的实现代码其实还有一个缺陷,就是小蛇可以回头,就是小蛇的头可以向最前面的身体方向转,但这样小蛇就会因为碰到自己的身体而被判定为游戏失败。但现实中的贪吃蛇游戏,小蛇并不能回头,所以这里其实还可以再完善一下。这个问题有兴趣的读者可以自己去完善哦,利于更加理解这些代码。


http://chatgpt.dhexx.cn/article/1tKiZYMN.shtml

相关文章

Java实现贪吃蛇大作战小游戏(完整版)

大家好&#xff0c;今天尝试用swing技术写一个贪吃蛇大作战小游戏&#xff0c;供大家参考。 效果展示 目录 效果展示 一、游戏界面 二、得分情况 项目介绍 项目背景 总体需求 实现过程 代码展示 主类 &#xff1a;Demo类 MyPanel类 ①构造方法 ②初始化方法 ③绘制方法…

用java写一个贪吃蛇小游戏(源码在最后)

一、引入 涉及技能&#xff1a; 循环、分支方法的抽取数组的使用面向对象继承&#xff0c;子类方法的重写接口&#xff0c;接口的实现GUI&#xff08;图像化界面编程&#xff09; GUI中的组件&#xff1a; 7.1 窗口 7.2 弹窗 7.3 面板 7.4 文本框 7.5 列表框 7.6 按钮 7.7 图…

安卓蓝牙开发总结(一)—蓝牙开启与关闭

蓝牙开启与关闭 1、引言2、布局文件3、蓝牙打开与关闭  3.1 通过对按钮监听方法  3.2 通过设置点击事件 4、结果展示及总结5、参考链接 1、引言 最近在学习如何在安卓手机上对蓝牙进行操控&#xff0c;作为初学者发现大多数博客对安卓开发的初学者极为不友好&#xff0c;特…

【Bluetooth|蓝牙开发】二、蓝牙开发入门

个人主页&#xff1a;董哥聊技术 我是董哥&#xff0c;嵌入式领域新星创作者 创作理念&#xff1a;专注分享高质量嵌入式文章&#xff0c;让大家读有所得&#xff01; 【所有文章汇总】 1、蓝牙基础概念 蓝牙&#xff0c;是一种利用低功率无线电&#xff0c;支持设备短距离…

nimble 蓝牙开发一:BLE 蓝牙 Host 规范概述

目录 nimble 蓝牙开发一&#xff1a;概述一、BLE 简介二、BLE 基础知识蓝牙设备地址BLE 广播类型标准广播数据 三、BLE 工作概述BLE 常见的操作有&#xff1a;BLE 常见的工作流程&#xff1a; 四、BLE 使用的协议规范GAP1. GAP 工作角色2. GAP 工作模式3. GAP 工作流程4. GAP 工…

ESP32 蓝牙开发

1. 低功耗蓝牙&#xff08;BLE&#xff09;协议栈 低功耗蓝牙协议是蓝牙通信协议的一种&#xff0c;BLE协议栈就是实现低功耗蓝牙协议的代码 1.1 层次协议 蓝牙协议规定了两个层次的协议&#xff0c;分别为蓝牙核心协议&#xff08;Bluetooth Core&#xff09;和蓝牙应用层协…

Android蓝牙开发 — 经典蓝牙BLE蓝牙

一&#xff0c;前期基础知识储备 1&#xff09;蓝牙是一种支持设备之间短距离通信的无线电技术&#xff08;其他还包括红外&#xff0c;WIFI&#xff09;&#xff1b; 支持移动电话、笔记本电脑、无线耳机等设备之间进行信息的交换&#xff1b; Android支持的蓝牙协议栈&…

Android 蓝牙开发——概述(一)

一、蓝牙简介 蓝牙技术是一种无线数据和语音通信开放的全球规范,它是基于低成本的近距离无线连接,为固定和移动设备建立通信环境的一种特殊的近距离无线技术连接。 其中将1.x~3.0之间的版本称之为经典蓝牙,4.x开始的蓝牙称之为低功耗蓝牙,也就是蓝牙BLE。 1、蓝牙协议介绍…

低功耗蓝牙开发入门概念科普

一、概述 1、缘起 低功耗蓝牙起源于Bluetooth4.0版本&#xff0c;至今已发展到5.3 4.0 bluetooth low enerngy 这个阶段低功耗蓝牙的基础框架已经稳定成型&#xff0c;后面版本主要退出新特性和扩展特性&#xff0c;同时保证和4.0的原生兼容性 4.1 multi role&#xff08;主从…

ESP32开发三_蓝牙开发

蓝牙开发 交流QQ: 1048272975 QQ交流群: 636564526 蓝牙是一种不断创新发展的无线通信技术标准&#xff0c;采用了2.4G ISM频段&#xff0c;在音频传输、数据传输、位置服务、设备组网这些场景有着广泛的应用。 1. 蓝牙概述 蓝牙技术分经典蓝牙(Classic BT)和低…

iOS 蓝牙开发实现文件传输

这是一篇旧文&#xff0c;三年前就写过了&#xff0c;一直没有时间分享出来&#xff0c;最近简单整理了下&#xff0c;希望能帮到有需要的人。   由于我这里没有相关的蓝牙设备&#xff0c;主要用了两个手机&#xff0c;一个作为主设备&#xff0c;一个做为从设备。另外进行蓝…

Android经典蓝牙开发全流程

一、基本介绍 所谓蓝牙(Bluetooth)技术&#xff0c;实际上是一种短距离无线电技术&#xff0c;最初是由爱立信公司公司发明的。技术始于爱立信公司 1994 方案&#xff0c;它是研究在移动电话和其他配件间进行低功耗、低成本无线通信连接的方法。发明者希望为设备间的通讯创造一…

Android - 蓝牙开发

文章目录 科普SIG类型制式选择逻辑链路控制适配协议 (L2CAP)L2CAP的功能 蓝牙框架和 RFCOMM 协议蓝牙安全白名单机制 编程蓝牙权限Classic BluetoothBluetooth Low Energy术语角色 & 职能查找 BLE 设备连接设备上的 GATT 服务器绑定服务蓝牙设置连接到设备连接到 GATT 服务…

Android 蓝牙开发 uuid,Android蓝牙开发之 UUID

UUID&#xff1a;全球唯一标识符 在蓝牙中&#xff0c;每个Service和Characteristic都唯一地由"全球唯一标识符" (UUID)来校验&#xff0c;主要是保证他们的唯一性。 UUID可分为&#xff1a;16位、32位、128 位UUID Bluetooth_Base_UUID&#xff1a;蓝牙UUID基数 UUI…

Android 低功耗蓝牙开发简述

低功耗蓝牙简述 一、什么是低功耗蓝牙&#xff1f;二、怎么做低功耗蓝牙应用&#xff1f;① 之前有没有接触Android蓝牙开发&#xff1f;② 蓝牙设备固件是公司自己的吗&#xff1f;③ 有没有蓝牙固件和蓝牙应用的文档和Demo&#xff1f;④ 具体的业务功能需求明确吗&#xff1…

Android蓝牙开发

题引&#xff1a; 最近项目上涉及与硬件相关的功能&#xff0c;需要通过蓝牙进行消息收发。项目已完成&#xff0c;这里做下记录。 通信步骤&#xff1a; 1.初始化BluetoothAdapter.getDefaultAdapter()获取BluetoothAdapter对象 2.判断蓝牙是否开启bluetoothAdapter.isEnab…

【Android】蓝牙开发——BLE(低功耗蓝牙)(附完整Demo)

目录 目录 前言 一、相关概念介绍 二、实战开发 三、项目演示 四、Demo案例源码地址 五、更新记录 1、2020/12/29 &#xff1a;修改 setupService()中错误 2、2021/05/14 &#xff1a;更新连接方法&#xff08;解决部分蓝牙设备连接失败的问题&#xff09; 3、2022/1…

【Bluetooth开发】蓝牙开发入门

BLE 蓝牙设备在生活中无处不在&#xff0c;但是我们也只是将其作为蓝牙模块进行使用&#xff0c;发送简单的AT命令实现数据收发。 那么&#xff0c;像对于一些复杂的使用场合&#xff1a;“车载蓝牙”、"智能手表"、“蓝牙音箱”等&#xff0c;我们不得不去了解底层…

【Bluetooth蓝牙开发】一、蓝牙开发入门

一、蓝牙开发入门 文章目录 一、蓝牙开发入门 1、蓝牙概念2、蓝牙发展历程3、蓝牙技术概述 3.1 Basic Rate(BR)3.2 Low Energy&#xff08;LE&#xff09; 4、常见蓝牙架构 4.1 SOC蓝牙单芯片方案4.2 SOC蓝牙MCU方案4.3 蓝牙host controller分开方案4.4 使用场景 5、参考文档 …

vs2012做ArcGIS二次开发前期准备

解压ArcGIS 1.双击ESRI 2.点击 一路next&#xff0c;自己选择安装路径&#xff0c;建议放在非系统盘 3.开始菜单-ArcGIS-License Server Administrator 4.点击“stop/停止"&#xff0c;再点击确定 5.将破解文件中的两个文件拷到D:\Program Files (x86)\ArcGIS\License10.…