贪吃蛇 java实现超简单的贪吃蛇(附源代码)

article/2025/10/15 12:12:30

贪吃蛇游戏

贪吃蛇是个非常经典的游戏,希望对初学Java的小伙伴有一定帮助。希望大家喜欢,因为写得简单,希望大家都能看得懂。

游戏界面(游戏背景素材不喜欢的话可以自己换,就别在乎我选的素材(🤦‍😳😳)!!!)贪吃蛇要美观的话背景素材选取还是比较重要的需要画小格子来匹配食物,蛇节点。如果需要美观一点的可以自己设计个,当然也可以留言&找我,有必要的话我会花时间弄一个出来
在这里插入图片描述

代码

1.Main

package cn.tedu.worm;import java.awt.Graphics;
import java.awt.Image;
import java.awt.Toolkit;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.util.Random;
import java.util.Timer;
import java.util.TimerTask;import javax.swing.JFrame;
import javax.swing.JPanel;public class Main extends JPanel {/** 行数 */public static final int ROWS = 35;/** 列数 */public static final int COLS = 35;/** 格子大小 10个像素 */public static final int CELL_SIZE = 10;public static Image background;public static Image foodImage;public static Image cellImage;private Move worm;private Node food;public Main() {//如下加载图片的方法,知道即可,图片必须与Main.java//在同一个包中!background = Toolkit.getDefaultToolkit().createImage(getClass().getResource("bg.png"));foodImage = Toolkit.getDefaultToolkit().createImage(getClass().getResource("food.png"));cellImage = Toolkit.getDefaultToolkit().createImage(getClass().getResource("node.png"));worm = new Move();food = createFood();}/*** 生成一个食物 1 生成随机数x,y 2 检查蛇是否包含x,y 2.1 如果包含 返回 1 3 创建食物节点。* */private Node createFood() {int x;int y;Random r = new Random();do {x = r.nextInt(COLS);y = r.nextInt(ROWS);} while (worm.contains(x, y));return new Node(x, y);}public String toString() {return "worm:" + worm + "\nfood:" + food;}/** 重写绘图方法 */public void paint(Graphics g) {// 填充背景色g.drawImage(background, 0, 0, null);// 绘制食物g.translate(54, 49);g.drawImage(foodImage, CELL_SIZE * food.getX(), CELL_SIZE * food.getY(), null);// 绘制蛇Node[] cells = worm.getCells();for (int i = 0; i < cells.length; i++) {Node node = cells[i];g.drawImage(cellImage, CELL_SIZE * node.getX(), CELL_SIZE * node.getY(), null);}}/**  */public static void main(String[] args) {// 启动软件 Main.javaJFrame frame = new JFrame("贪吃蛇");Main pane = new Main();// 面板frame.add(pane);// 窗口添加面板frame.setSize(470, 480);// 设置窗口的大小frame.setLocationRelativeTo(null);// frame居中frame.setVisible(true);frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);pane.action();// 启动蛇的运行}private void action() {// worm.creep(food);// repaint();//swing JPanel 中声明的方法,会尽快的启动// 界面的重绘功能,尽快调用paint(g) 方法绘制界面Timer timer = new Timer();timer.schedule(new TimerTask() {public void run() {// 爬行控制逻辑if (worm.hit()) {worm = new Move();food = createFood();} else {boolean eat = worm.creep(food);if (eat) {food = createFood();}}repaint();}}, 0, 1000 / 7);// this 就是当前舞台面板this.requestFocus();this.addKeyListener(new KeyAdapter() {public void keyPressed(KeyEvent e) {// key 代表哪个按键被按下!int key = e.getKeyCode();switch (key) {case KeyEvent.VK_UP:// 上箭头按下!creepTo(Move.UP);break;case KeyEvent.VK_DOWN:// 下箭头按下!creepTo(Move.DOWN);break;case KeyEvent.VK_LEFT:// 左箭头按下!creepTo(Move.LEFT);break;case KeyEvent.VK_RIGHT:// 右箭头按下!creepTo(Move.RIGHT);break;}}});// addKeyListener}// action()/** 爬行控制方法,在按键按下时候调用 */private void creepTo(int direction) {if (worm.hit(direction)) {worm = new Move();food = createFood();} else {boolean eat = worm.creep(direction, food);if (eat) {food = createFood();}}repaint();}
}

2.Move

package cn.tedu.worm;import java.util.Arrays;/*** 贪吃蛇* */
public class Move {public static final int DEFAULT_LENGTH = 12;private Node[] cells;public static final int UP = 1;public static final int DOWN = -1;public static final int LEFT = 2;public static final int RIGHT = -2;/** 蛇当前的运行方向 */private int currentDirection;public Move() {cells = new Node[DEFAULT_LENGTH];for (int i = 0; i < cells.length; i++) {cells[i] = new Node(i, 0);// [0,0] [1,0] [2,0]}currentDirection = DOWN;// cells = new Cell[]{new Cell(0,0),new Cell(1,0),...};}public boolean contains(int x, int y) {for (int i = 0; i < cells.length; i++) {Node node = cells[i];if (node.getX() == x && node.getY() == y) {return true;}}return false;}/*** 1) 计算currentDirection与direction的和, 如果是0表示反向了, 就结束方法返回, 不进行任何动作* 2)currentDirection = direction 改变当前的方向, 作为下次运行的方向 3) 判断当前头节点的坐标与食物对象的坐标一致* 如果一致说明是吃到食物了 4) 如果吃到食物, 就将cells数组进行扩容 将cells数组内容的每个元素向后移动. 5)* 将新头节点插入的头位置cells[0]=newHead 6) 返回是否吃到食物*/public boolean creep(int direction, Node food) {if (currentDirection + direction == 0) {return false; // 反向了,不进行任何动作}currentDirection = direction;Node head = createHead(direction);boolean eat = head.getX() == food.getX() && head.getY() == food.getY();// boolean eat = false;// if(head.getX()==food.getX() &&// head.getY()==food.getY()){// eat = true;// }if (eat) {cells = Arrays.copyOf(cells, cells.length + 1);}for (int i = cells.length - 1; i >= 1; i--) {cells[i] = cells[i - 1];}cells[0] = head;return eat;}public boolean hit() {return hit(currentDirection);}public boolean hit(int direction) {// 修正,反向不处理碰撞if (currentDirection + direction == 0) {return false;}// System.out.println("方向(2):"+direction);Node head = createHead(direction);// System.out.println(head);if (head.getX() < 0 || head.getX() >= Main.COLS || head.getY() < 0|| head.getY() >= Main.ROWS) {return true;}for (int i = 0; i < cells.length - 1; i++) {Node node = cells[i];if (node.getX() == head.getX() && node.getY() == head.getY()) {return true;}}return false;}public boolean creep(Node food) {return creep(currentDirection, food);}public void creep() {for (int i = cells.length - 1; i >= 1; i--) {cells[i] = cells[i - 1];}cells[0] = createHead(currentDirection);}private Node createHead(int direction) {int x = cells[0].getX();int y = cells[0].getY();switch (direction) {case DOWN:y++;break;case UP:y--;break;case LEFT:x--;break;case RIGHT:x++;break;}return new Node(x, y);}/** Move.java */public Node[] getCells() {return Arrays.copyOf(cells, cells.length);}public String toString() {return Arrays.toString(cells);}}

3.Node

package cn.tedu.worm;/*** 一个单元格子* */
public class Node {private int x;private int y;public Node() {}public Node(int x, int y) {this.x = x;this.y = y;}public int getX() {return x;}public void setX(int x) {this.x = x;}public int getY() {return y;}public void setY(int y) {this.y = y;}public String toString() {return "[" + x + "," + y + "]";}
}

4.项目结构

在这里插入图片描述

源代码代码下载

百度盘下载

提取码:qwer

CSDN下载


其它小游戏

在这里插入图片描述


http://chatgpt.dhexx.cn/article/JV5pEJOg.shtml

相关文章

java实现贪吃蛇小游戏(源码+注释)

一.工程文件 二.Main.java package com.company;import javax.swing.*;public class Main {public static void main(String[] args) {//创建窗体对象JFrame frame new JFrame();//创建窗体参数&#xff08;&#xff09;frame.setBounds(10,10,900,720);//设置不允许更改大小…

使用Java实现一个简单的贪吃蛇小游戏

基于java实现贪吃蛇小游戏&#xff0c;主要通过绘制不同的图片并以一定速度一帧一帧地在窗体上进行展示。 开发工具&#xff1a;eclipse java工具包&#xff1a;jdk1.8 一、创建新项目 创建一个新的项目&#xff0c;并命名。创建一个名为images的文件夹用来存放游戏相关图片…

Java贪吃蛇全代码

用Java编写精典小游戏——贪吃蛇&#xff01; 前言 我想贪吃蛇应该是不少90后和00后的童年&#xff08;我本人是01年的&#xff09;&#xff0c;回想起从前偷偷拿着我爹的诺基亚在被窝里玩贪吃蛇&#xff0c;不禁感慨万分&#xff0c;时间飞逝&#xff0c;没想到10年后的我也可…

JAVA小项目(四)—— 贪吃蛇【轻松入门,附源码】

目录 &#xff08;一&#xff09;效果图 &#xff08;二&#xff09;代码实现 &#xff08;1&#xff09;将图片加载到程序中 &#xff08;2&#xff09;创建窗体 &#xff08;3&#xff09;创建面板 &#xff08;4&#xff09;绘制静态的小蛇 &#xff08;5&#xff09; 加入监…

Java贪吃蛇大作战

作为Java新手小白&#xff0c;渴望学习一些好玩有趣的java程序 废话不多说&#xff0c;接下来我会一步一步实现java小程序&#xff1a;贪吃蛇大作战哦&#xff01; 实现 Java贪吃蛇一共分四个步骤&#xff1a; 1、画出窗体对象 2、绘制静态ui 3、使用鼠标监听器事件和定时器事…

Java简易小游戏贪吃蛇(Java实战)

这个版本的贪吃蛇我是跟着“黑马程序员”写的。小伙伴们可以跟着视频试着做一下&#xff0c;同时视频也会更详细。 B站学习链接&#xff1a;【黑马】两个小时带你用Java语言写一个贪吃蛇游戏【配套源码笔记】_哔哩哔哩_bilibili 相对于新手而言&#xff0c;贪吃蛇应该算是一个…

JAVA实现贪吃蛇游戏

本文实现的功能有: 1.绘制静态窗口 2.绘制游戏面板 3.绘制静态小蛇 4.通过键盘控制小蛇移动 5.吃食物 6.积分系统和失败判定 最近在学GUI&#xff0c;然后又有读者希望我写一下相关的实战。刚好博主在b站漫无目的的寻找着题材的时候看到了一个写贪吃蛇游戏的视频&#xff0c;于…

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 服务…