java贪吃蛇源码

article/2025/10/15 10:35:36

欢迎访问我的个人博客 https://jialaner.cn/​​​​​​​

java是一种面向对象的语言,有着其中不用质疑的优点。学习java将近三个月了,一直在琢磨着“万物皆对象”的意义,却总是只知其表不知其意,做完这个java贪吃蛇后才有了那么一点的理解。直接上效果图。

游戏分为了六个类,分别为:

Node类:蛇身都是由一个一个节点组成,所以首先将节点抽象为一个类。

Snake类:此类是一条蛇抽象出来的一个类。一种包含了存储节点的 LinkedList 类型的集合,蛇的移动的方式是头部加一个节点,尾部减去一个节点。蛇的类有着吃蛋、越界的行为方法。

SnakeGameView类:这个类是一个游戏界面的类,用于布局游戏的界面。

GameControl类:此类用于监听键盘,从而实现对游戏的操作。

GameRunThread类:此类是一个线程类,用于不断重画界面。

DrawView类:此类继承了面板类,从而拥有了paint()方法的使用权,用于游戏面板的重画,像方格、蛇、蛋、的重画。

其中存在一个问题,就是游戏在不断的重画过程中,会出现游戏的闪烁问题,就引出了双缓冲的技术。

在编写程序的时候,总会出现我们意料之外的情况,像游戏变量权限问题、方法归属问题,都需要我们进行思考,如何让我们的程序执行、编写起来更合理、更加符合面向对象编程的思维维,护时改动最少的代码去实现最好的效果,这些都应该是我们去思考的问题。对于游戏的越界问题,一般有两种方式:中心检测法和边界检测法,在这里我用的是边界检测法,具体情况具体选择。

程序可能有着其他不太合理之处,还请大家原谅一个学java不到三个月的求学者。谢谢大家。下面开始上源码。

Node类

public class Node {private int nodeX;private int nodeY;public Node(int nodeX, int nodeY) {this.nodeX = nodeX;this.nodeY = nodeY;}public int getNodeX() {return nodeX; }public void setNodeX(int nodeX) {this.nodeX = nodeX;}public int getNodeY() {return nodeY;}public void setNodeY(int nodeY) {this.nodeY = nodeY;}}

Snake类

public class Snake {private LinkedList<Node> snakeBody;private Random random;//Snake的方向    0上, 1 右 , 2 下 , 3 左private int direction = 0;  private SnakeGameView snakeGameView;public Snake(int snakeHeadX, int snakeHeadY, SnakeGameView snakeGameView) {random = new Random();snakeBody = new LinkedList<>();snakeBody.add(new Node(snakeHeadX, snakeHeadY));this.snakeGameView = snakeGameView;}//获取Snake的方向public int getDirection() {return direction;}//设置Snake方向public void setDirection(int direction) {this.direction = direction;}//获取Snake头部结点public Node getSnakeHead() {return snakeBody.getFirst();}//获取Snake尾部结点public Node getSnakeTail() {return snakeBody.getLast();}//获取Snake的Bodypublic LinkedList<Node> getSnakeBody(){return snakeBody;}//Snake移动public void snakeMove() {switch(direction) {case 0:snakeBody.addFirst(new Node(getSnakeHead().getNodeX() ,getSnakeHead().getNodeY() - DrawView.VIEW_NUMBER));break;case 1:snakeBody.addFirst(new Node(getSnakeHead().getNodeX() + DrawView.VIEW_NUMBER,getSnakeHead().getNodeY()));break;case 2:snakeBody.addFirst(new Node(getSnakeHead().getNodeX(),getSnakeHead().getNodeY()+ DrawView.VIEW_NUMBER));break;case 3:snakeBody.addFirst(new Node(getSnakeHead().getNodeX() - DrawView.VIEW_NUMBER,getSnakeHead().getNodeY()));break;}snakeBody.removeLast();}//Snake 吃Eggpublic void eatEgg(Node egg) {if(snakeBody.getFirst().getNodeX() == egg.getNodeX() && snakeBody.getFirst().getNodeY() == egg.getNodeY()) {snakeBody.add(egg);//产蛋snakeGameView.setEgg(random.nextInt(DrawView.VIEW_WIDTH - 1) * DrawView.VIEW_NUMBER,random.nextInt(DrawView.VIEW_WIDTH - 1) * DrawView.VIEW_NUMBER);SnakeGameView.gameScore = SnakeGameView.gameScore + 5;snakeGameView.getJTextArea().setText(SnakeGameView.gameScore + "");System.out.println("吃到蛋了");}}//Snake越界public void snakeRunInterface() {if(this.getSnakeHead().getNodeX() < 0 || this.getSnakeHead().getNodeY() < 0||this.getSnakeHead().getNodeX() > (DrawView.VIEW_WIDTH * DrawView.VIEW_NUMBER)||this.getSnakeHead().getNodeY() > (DrawView.VIEW_WIDTH * DrawView.VIEW_NUMBER)) {SnakeGameView.gameState = false;}}
}

SnakeGameView类

public class SnakeGameView extends Frame{private JLabel jl;private DrawView drawView;private Panel panel;private JLabel scoreTitle;private JLabel score;private Panel rule;private JTextArea hint;private Random random;public static boolean gameState = true;public static int gameScore = 0;private Snake snake;private Node egg;private GameRunThread grt;private static Thread thread;public SnakeGameView() {random = new Random();//初始化Snakesnake = new Snake(10 * DrawView.VIEW_NUMBER + random.nextInt(19) * DrawView.VIEW_NUMBER,10 * DrawView.VIEW_NUMBER + random.nextInt(19) * DrawView.VIEW_NUMBER,this);//初始化Eggegg = new Node(random.nextInt(DrawView.VIEW_WIDTH - 1) * DrawView.VIEW_NUMBER,random.nextInt(DrawView.VIEW_WIDTH - 1) * DrawView.VIEW_NUMBER);//初始化画板drawView = new DrawView(snake, egg);grt = new GameRunThread(drawView, snake);thread = new Thread(grt);	jl = new JLabel("SnakeGame-3.0",JLabel.CENTER);	panel = new Panel();scoreTitle = new JLabel("Score", JLabel.CENTER);score = new JLabel(gameScore + "", JLabel.CENTER);rule = new Panel();hint = new JTextArea("    操作方式\n      ↑\n  ←      →\n      ↓\n\n【Esc】退出程序\n\n关于\n");		}//设置鸡蛋public void setEgg(int eggX, int eggY) {this.egg.setNodeX(eggX);this.egg.setNodeY(eggY);}//获得public JLabel getJTextArea() {return score;}//主方法public static void main(String[] args) {new SnakeGameView().showView();thread.start();}public void showView() {jl.setFont(new Font("宋体", 1, 18));//设置字体,0正常,1粗体jl.setForeground(Color.white);//设置颜色jl.setBounds(0, 0, DrawView.VIEW_HEIGHT * DrawView.VIEW_NUMBER + 70, 40);drawView.setBackground(new Color(51,51,51));drawView.setBounds(20, 50, DrawView.VIEW_WIDTH * DrawView.VIEW_NUMBER + 1, DrawView.VIEW_HEIGHT * DrawView.VIEW_NUMBER + 1);panel.setLayout(null);	panel.setBackground(new Color(0,102,102));panel.setBounds(DrawView.VIEW_WIDTH * DrawView.VIEW_NUMBER + 40, 50, 150, DrawView.VIEW_HEIGHT * DrawView.VIEW_NUMBER);	scoreTitle.setFont(new Font("宋体", 1, 18));//设置字体,0正常,1粗体scoreTitle.setForeground(Color.white);//设置颜色scoreTitle.setBounds(0, 0, 150, 50);score.setFont(new Font("宋体", 1, 20));//设置字体,0正常,1粗体score.setForeground(Color.white);//设置颜色score.setBounds(0, 50, 150, 40);rule.setBackground(new Color(0,128,128));rule.setBounds(0, 90, 150, 1);hint.setFont(new Font("宋体", 0, 16));//设置字体,0正常,1粗体hint.setBounds(10, 100, 130, 150);hint.setBackground(new Color(0,102,102));panel.add(scoreTitle);panel.add(score);panel.add(rule);panel.add(hint);	this.add(jl);this.setTitle("SnakeGame-3.0");this.setSize(DrawView.VIEW_WIDTH * DrawView.VIEW_NUMBER + 210, DrawView.VIEW_HEIGHT * DrawView.VIEW_NUMBER + 70);this.setLocation(500, 200);this.setLayout(null);//this.setUndecorated(true);this.setBackground(new Color(0,128,128));this.add(drawView);this.add(panel);this.addKeyListener(new GameControl(snake));this.addWindowListener(new WindowAdapter() {public void windowClosing(WindowEvent we) {System.exit(0);}});this.setVisible(true);}}

DrawView类

public class DrawView extends Panel{//画板的宽度高度public static final int VIEW_WIDTH = 40;public static final int VIEW_HEIGHT = 40;public static final int VIEW_NUMBER = 15;private Image iBuffer;  private Graphics gBuffer;  private Snake snake;private Node egg;public DrawView(Snake snake, Node egg) {this.snake = snake;this.egg = egg;}public void paint(Graphics g) {snake.snakeMove();this.drawGridding(g);this.drawSnake(g);this.drawEgg(g);snake.eatEgg(egg);System.out.println("("+snake.getSnakeHead().getNodeX()+","+snake.getSnakeHead().getNodeY()+")");}public void update(Graphics g) {if(iBuffer==null)  {  iBuffer=createImage(DrawView.VIEW_WIDTH * DrawView.VIEW_NUMBER + 1, DrawView.VIEW_HEIGHT * DrawView.VIEW_NUMBER + 1);  gBuffer=iBuffer.getGraphics();  }  gBuffer.setColor(getBackground());  gBuffer.fillRect(0,0,DrawView.VIEW_WIDTH * DrawView.VIEW_NUMBER + 1, DrawView.VIEW_HEIGHT * DrawView.VIEW_NUMBER + 1);  paint(gBuffer);  g.drawImage(iBuffer,0,0,this); }//画网格public void drawGridding(Graphics g) {g.setColor(new Color(128,128,128));for(int i = 0; i < VIEW_WIDTH; i++) {g.drawLine(0, i * VIEW_NUMBER, VIEW_WIDTH * VIEW_NUMBER, i * VIEW_NUMBER);}for(int i = 0; i < VIEW_HEIGHT; i++) {g.drawLine(i * VIEW_NUMBER, 0, i * VIEW_NUMBER, VIEW_WIDTH * VIEW_NUMBER);}}//画Snakepublic void drawSnake(Graphics g) {for(int i = 0; i < snake.getSnakeBody().size(); i ++) {g.setColor(Color.white);if(i == 0)g.setColor(Color.lightGray);g.fillRect(snake.getSnakeBody().get(i).getNodeX(), snake.getSnakeBody().get(i).getNodeY(), VIEW_NUMBER, VIEW_NUMBER);}}//画Eggpublic void drawEgg(Graphics g) {g.setColor(Color.yellow);g.fillRect(egg.getNodeX(), egg.getNodeY(), VIEW_NUMBER, VIEW_NUMBER);}}

GameRunThread类

 

public class GameRunThread implements Runnable{private int runTime = 200;private DrawView drawView;private Snake snake;public GameRunThread(DrawView drawView, Snake snake) {this.drawView = drawView;this.snake = snake;}public void run() {while(true) {snake.snakeRunInterface();if(SnakeGameView.gameState) {drawView.repaint();try {Thread.sleep(runTime);}catch(InterruptedException e) {e.printStackTrace();}}}}}

GameControl类

public class GameControl implements KeyListener{private Snake snake;public GameControl(Snake snake) {this.snake = snake;}public void keyReleased(KeyEvent ke) {switch(ke.getKeyCode()) {case KeyEvent.VK_UP:snake.setDirection(0);break;case KeyEvent.VK_RIGHT:snake.setDirection(1);break;case KeyEvent.VK_DOWN:snake.setDirection(2);break;case KeyEvent.VK_LEFT:snake.setDirection(3);break;case KeyEvent.VK_ENTER:if(SnakeGameView.gameState == true) SnakeGameView.gameState = false;else SnakeGameView.gameState = true;break;case KeyEvent.VK_ESCAPE:System.exit(0);break;}}public void keyPressed(KeyEvent arg0) {}public void keyTyped(KeyEvent arg0) {}}

 


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

相关文章

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

贪吃蛇游戏 贪吃蛇是个非常经典的游戏&#xff0c;希望对初学Java的小伙伴有一定帮助。希望大家喜欢&#xff0c;因为写得简单&#xff0c;希望大家都能看得懂。 游戏界面&#xff08;游戏背景素材不喜欢的话可以自己换&#xff0c;就别在乎我选的素材&#xff08;&#x1f9…

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;它是研究在移动电话和其他配件间进行低功耗、低成本无线通信连接的方法。发明者希望为设备间的通讯创造一…