Java实现贪吃蛇游戏【代码】

article/2025/10/15 6:48:45

Java实现贪吃蛇游戏【代码】

花了两个下午写了一个贪吃蛇小游戏,本人想写这游戏很长时间了。作为以前诺基亚手机上的经典游戏,贪吃蛇和俄罗斯方块一样,都曾经在我们的童年给我们带来了很多乐趣。世间万物斗转星移,诺基亚曾经作为手机业的龙头老大,现如今也一步步走向衰落,被收购,再过不久估计就要退出手机业务了,而贪吃蛇这款游戏也基本上没人玩了,甚至在新一代人的印象中都已毫无记忆了。。。但是,这款游戏在它基础上经过改造其实可以弄出很多花样,也确实可以在一定程度上锻炼自己的编程能力。前不久十分火热的贪吃蛇大作战其实就可以看做是在这款游戏的基础上进行的改造。所以,我也希望自己可以尝试以下,做个有意思的版本。

目前这个版本只是为了后期版本的一个测试版本,所以只有一些基本功能,本来是打算这个版本实现了移动,吃食物增长,判断撞墙和撞自己的身体就行了,无奈觉得有点单调,于是在此基础上加上了一个计时器,记分功能,重新开始,开始暂停以及音效。白白又多了几百行代码。原来的基本代码也就300行。

游戏界面图如下:





代码:

import java.awt.*;
import java.awt.event.*;
import java.io.File;
import java.io.IOException;
import java.util.Random;
import javax.sound.sampled.*;
import javax.swing.*;class Tile{int x;int y;public Tile(int x0,int y0){x = x0;y = y0;}
}public class SnakeDemo extends JComponent{/*** */private static final long serialVersionUID = 3794762291171148906L;private final int MAX_SIZE = 400;//蛇身体最长为400节private Tile temp = new Tile(0,0);private Tile temp2 = new Tile(0,0);private Tile head = new Tile(227,100);//头部的位置初始化为(227,100)private Tile[] body = new Tile[MAX_SIZE];private String direction = "R";//默认向右走private String current_direction = "R";//当前方向private boolean first_launch = false;private boolean iseaten = false;private boolean isrun = true;private int randomx,randomy;private int body_length = 5;//身体长度初始化为5private Thread run;private JLabel label = new JLabel("当前长度:");private JLabel label2 = new JLabel("所花时间:");private JLabel label3 = new JLabel("说          明:");private JTextArea explain = new JTextArea("此游戏是一个贪吃蛇Demo版本,实现简单地移动,得分,判断撞墙和撞自己的功能,"+ "初始长度为6,头部为红色,身体的颜色渐变。游戏本身代码只有300行,加上一些显示,计时和音效后多了几百行。\n"+ "游戏界面按上下左右键实现移动,按ESC重新开始,按空格键可以实现暂停和开始");private JLabel Score = new JLabel("6");private JLabel Time = new JLabel("");private Font f = new Font("微软雅黑",Font.PLAIN,15);private Font f2 = new Font("微软雅黑",Font.PLAIN,13);private JPanel p = new JPanel();private int hour =0;private int min =0;private int sec =0 ;private boolean pause = false;public SnakeDemo(){String lookAndFeel =UIManager.getSystemLookAndFeelClassName();try {UIManager.setLookAndFeel(lookAndFeel);} catch (ClassNotFoundException e1) {// TODO 自动生成的 catch 块e1.printStackTrace();} catch (InstantiationException e1) {// TODO 自动生成的 catch 块e1.printStackTrace();} catch (IllegalAccessException e1) {// TODO 自动生成的 catch 块e1.printStackTrace();} catch (UnsupportedLookAndFeelException e1) {// TODO 自动生成的 catch 块e1.printStackTrace();}//布局add(label);label.setBounds(500, 10, 80, 20);label.setFont(f);add(Score);Score.setBounds(500, 35, 80, 20);Score.setFont(f);add(label2);label2.setBounds(500, 60, 80, 20);label2.setFont(f);add(Time);Time.setBounds(500, 85, 80, 20);Time.setFont(f);add(p);p.setBounds(498, 110, 93, 1);p.setBorder(BorderFactory.createLineBorder(Color.black));add(label3);label3.setBounds(500, 115, 80, 20);label3.setFont(f);add(explain);explain.setBounds(498, 138, 100, 350);explain.setFont(f2);explain.setLineWrap(true);explain.setOpaque(false); for(int i = 0; i < MAX_SIZE;i++){body[i] = new Tile(0,0);}addKeyListener(new KeyAdapter() {public void keyPressed(KeyEvent e) {super.keyPressed(e);if(e.getKeyCode() == KeyEvent.VK_RIGHT){if(isrun && current_direction != "L"){direction = "R";}}if(e.getKeyCode() == KeyEvent.VK_LEFT){if(isrun && current_direction != "R"){direction = "L";}}if(e.getKeyCode() == KeyEvent.VK_UP){if(isrun && current_direction != "D"){direction = "U";}}if(e.getKeyCode() == KeyEvent.VK_DOWN){if(isrun && current_direction != "U"){direction = "D";}}if(e.getKeyCode() == KeyEvent.VK_ESCAPE){direction = "R";//默认向右走current_direction = "R";//当前方向first_launch = false;iseaten = false;isrun = true;body_length = 5;head = new Tile(227,100);Score.setText("6");hour =0;min =0;sec =0 ;for(int i = 0; i < MAX_SIZE;i++){body[i].x = 0;body[i].y = 0;}run = new Thread();run.start();System.out.println("Start again");}if(e.getKeyCode() == KeyEvent.VK_SPACE)//按空格键开始和暂停暂时没做,还在思考中{if(!pause)//暂停{pause = true;isrun = false;}else//开始{pause = false;isrun = true;}}}});new Timer();setFocusable(true);}public void paintComponent(Graphics g1){super.paintComponent(g1);Graphics2D g = (Graphics2D) g1;g.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);g.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL,RenderingHints.VALUE_STROKE_NORMALIZE);//画头部g.setColor(Color.red);g.fillRoundRect(head.x, head.y, 20, 20, 10, 10);g.setPaint(new GradientPaint(115,135,Color.CYAN,230,135,Color.MAGENTA,true));if(!first_launch){//初始化身体int x = head.x;for(int i = 0;i < body_length;i++){x -= 22;//相邻两个方块的间距为2个像素,方块宽度都为20像素body[i].x = x;body[i].y = head.y;g.fillRoundRect(body[i].x, body[i].y, 20, 20, 10, 10);}//初始化食物位置ProduceRandom();g.fillOval(randomx, randomy, 19, 19);}else{//每次刷新身体for(int i = 0;i < body_length;i++){g.fillRoundRect(body[i].x, body[i].y, 20, 20, 10, 10);}if(EatFood())//被吃了重新产生食物{ProduceRandom();g.fillOval(randomx, randomy, 19, 19);iseaten = false;}else{g.fillOval(randomx, randomy, 19, 19);}}first_launch = true;//墙g.setStroke( new BasicStroke(4,BasicStroke.CAP_BUTT,BasicStroke.JOIN_BEVEL));g.setBackground(Color.black);g.drawRect(2, 7, 491, 469);//网格线for(int i = 1;i < 22;i++){g.setStroke( new BasicStroke(1,BasicStroke.CAP_BUTT,BasicStroke.JOIN_BEVEL));g.setColor(Color.black);g.drawLine(5+i*22,9,5+i*22,472);if(i <= 20){g.drawLine(4,10+i*22,491,10+i*22);}}}public void ProduceRandom(){boolean flag = true;Random rand = new Random();randomx = (rand.nextInt(21) + 1) * 22 + 7;randomy = (rand.nextInt(20) + 1) *22 + 12;while(flag){for(int i = 0;i < body_length; i++){if(body[i].x == randomx && body[i].y == randomy){randomx = (rand.nextInt(21) + 1) * 22 + 7;randomy = (rand.nextInt(20) + 1) *22 + 12;flag = true;break;}else{if(i == body_length - 1){flag = false;}}}}}public void HitWall(){//判断是否撞墙if(current_direction == "L"){if(head.x < 7){new AePlayWave("over.wav").start();isrun = false;int result=JOptionPane.showConfirmDialog(null, "Game over! Try again?", "Information", JOptionPane.YES_NO_OPTION);if(result==JOptionPane.YES_NO_OPTION){direction = "R";//默认向右走current_direction = "R";//当前方向first_launch = false;iseaten = false;isrun = true;body_length = 5;head = new Tile(227,100);Score.setText("6");hour =0;min =0;sec =0 ;for(int i = 0; i < MAX_SIZE;i++){body[i].x = 0;body[i].y = 0;}run = new Thread();run.start();System.out.println("Start again");}else{run.stop();}        }}if(current_direction == "R"){if(head.x > 489){new AePlayWave("over.wav").start();isrun = false;int result=JOptionPane.showConfirmDialog(null, "Game over! Try again?", "Information", JOptionPane.YES_NO_OPTION);if(result==JOptionPane.YES_NO_OPTION){direction = "R";//默认向右走current_direction = "R";//当前方向first_launch = false;iseaten = false;isrun = true;body_length = 5;head = new Tile(227,100);Score.setText("6");hour =0;min =0;sec =0 ;for(int i = 0; i < MAX_SIZE;i++){body[i].x = 0;body[i].y = 0;}run = new Thread();run.start();System.out.println("Start again");}else{run.stop();}}}if(current_direction == "U"){if(head.y < 12){new AePlayWave("over.wav").start();isrun = false;int result=JOptionPane.showConfirmDialog(null, "Game over! Try again?", "Information", JOptionPane.YES_NO_OPTION);if(result==JOptionPane.YES_NO_OPTION){direction = "R";//默认向右走current_direction = "R";//当前方向first_launch = false;iseaten = false;isrun = true;body_length = 5;head = new Tile(227,100);Score.setText("6");hour =0;min =0;sec =0 ;for(int i = 0; i < MAX_SIZE;i++){body[i].x = 0;body[i].y = 0;}run = new Thread();run.start();System.out.println("Start again");}else{run.stop();}}}if(current_direction == "D"){if(head.y > 472){new AePlayWave("over.wav").start();isrun = false;int result=JOptionPane.showConfirmDialog(null, "Game over! Try again?", "Information", JOptionPane.YES_NO_OPTION);if(result==JOptionPane.YES_NO_OPTION){direction = "R";//默认向右走current_direction = "R";//当前方向first_launch = false;iseaten = false;isrun = true;body_length = 5;head = new Tile(227,100);Score.setText("6");hour =0;min =0;sec =0 ;for(int i = 0; i < MAX_SIZE;i++){body[i].x = 0;body[i].y = 0;}run = new Thread();run.start();System.out.println("Start again");}else{run.stop();}}}}public void HitSelf(){//判断是否撞到自己身上for(int i = 0;i < body_length; i++){if(body[i].x == head.x && body[i].y == head.y){new AePlayWave("over.wav").start();isrun = false;int result=JOptionPane.showConfirmDialog(null, "Game over! Try again?", "Information", JOptionPane.YES_NO_OPTION);if(result==JOptionPane.YES_NO_OPTION){direction = "R";//默认向右走current_direction = "R";//当前方向first_launch = false;iseaten = false;isrun = true;body_length = 5;head = new Tile(227,100);Score.setText("6");hour =0;min =0;sec =0 ;for(int j = 0; j < MAX_SIZE;j++){body[j].x = 0;body[j].y = 0;}run = new Thread();run.start();System.out.println("Start again");}else{run.stop();}break;}}}public boolean  EatFood(){if(head.x == randomx && head.y == randomy){iseaten = true;return true;}else{return false;}}public void Thread(){long millis = 300;//每隔300毫秒刷新一次run = new Thread() {public void run() {while (true) {try {Thread.sleep(millis);} catch (InterruptedException ex) {ex.printStackTrace();}if(!pause){    temp.x = head.x;temp.y = head.y;//头部移动if(direction == "L"){head.x -= 22;}if(direction == "R"){head.x += 22;}if(direction == "U"){head.y -= 22;}if(direction == "D"){head.y += 22;}current_direction = direction;//刷新当前前进方向//身体移动for(int i = 0;i < body_length;i++){temp2.x = body[i].x;temp2.y = body[i].y;body[i].x = temp.x;body[i].y = temp.y;temp.x = temp2.x;temp.y = temp2.y;}if(EatFood()){body_length ++;body[body_length-1].x = temp2.x;body[body_length-1].y = temp2.y;Score.setText("" + (body_length+1) );new AePlayWave("eat.wav").start();}repaint();HitWall();HitSelf();}}}};run.start();}public static void main(String[] args) {SnakeDemo t = new SnakeDemo();t.Thread();JFrame game = new JFrame();Image img=Toolkit.getDefaultToolkit().getImage("title.png");//窗口图标game.setIconImage(img);game.setTitle("Snake By XJX");game.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//        game.setSize(502, 507);game.setSize(602, 507);game.setResizable(false);game.setLocationRelativeTo(null);game.add(t);game.setVisible(true);}//计时器类class Timer extends Thread{  public Timer(){this.start();}@Overridepublic void run() {// TODO Auto-generated method stubwhile(true){if(isrun){sec +=1 ;if(sec >= 60){sec = 0;min +=1 ;}if(min>=60){min=0;hour+=1;}showTime();}try {Thread.sleep(1000);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}private void showTime(){String strTime ="" ;if(hour < 10)strTime = "0"+hour+":";elsestrTime = ""+hour+":";if(min < 10)strTime = strTime+"0"+min+":";elsestrTime =strTime+ ""+min+":";if(sec < 10)strTime = strTime+"0"+sec;elsestrTime = strTime+""+sec;//在窗体上设置显示时间Time.setText(strTime);}}    
}class AePlayWave extends Thread {      private String filename;private final int EXTERNAL_BUFFER_SIZE = 524288; // 128Kb public AePlayWave(String wavfile) { filename = wavfile;} public void run() { File soundFile = new File(filename); AudioInputStream audioInputStream = null;try { audioInputStream = AudioSystem.getAudioInputStream(soundFile);} catch (UnsupportedAudioFileException e1) { e1.printStackTrace();return;} catch (IOException e1) { e1.printStackTrace();return;} AudioFormat format = audioInputStream.getFormat();SourceDataLine auline = null;DataLine.Info info = new DataLine.Info(SourceDataLine.class, format);try { auline = (SourceDataLine) AudioSystem.getLine(info);auline.open(format);} catch (LineUnavailableException e) { e.printStackTrace();return;} catch (Exception e) { e.printStackTrace();return;} auline.start();int nBytesRead = 0;byte[] abData = new byte[EXTERNAL_BUFFER_SIZE];try { while (nBytesRead != -1) { nBytesRead = audioInputStream.read(abData, 0, abData.length);if (nBytesRead >= 0) auline.write(abData, 0, nBytesRead);} } catch (IOException e) { e.printStackTrace();return;} finally { auline.drain();auline.close();} } 
}



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

相关文章

JavaSE项目 | 纯Java实现贪吃蛇小游戏

目录 一&#xff1a;贪吃蛇游戏的实现步骤 1. 画出窗口 2. 在窗口上添加画布 3. 在画布上添加黑色游戏区 4. 放静态蛇 5. 定义蛇的数据结构 6. 控制蛇头方向 7. 放上开始提示信息 8. 按空格键开始游戏 9. 让蛇动起来 10. 实现暂停 11. 实现转向功能 12. 添加食物 …

java 贪吃蛇 源码+图片

本人也是个初学者&#xff0c;有什么不对的地方&#xff0c;请大佬指点&#xff01;&#xff01;&#xff01; 一、涉及到的知识点如下&#xff1a; 循环&#xff0c;分支方法的抽取数组的使用面向对象继承&#xff0c;子类方法的重写接口&#xff0c;接口的实现 二、游戏图形…

JAVA贪吃蛇代码(带注释)

贪吃蛇 这是游戏效果图片是代码里面的素材游戏数据类 package com.tang.retor_snaker;import javax.swing.*; import java.net.URL;public class Data {private static URL bodyURL Data.class.getResource("/com/tang/retor_snaker/statics/body.png");private st…

JAVA贪吃蛇小游戏源代码系列

欢迎关注公众号&#xff1a; 获取贪吃蛇小游戏的源代码。 贪吃蛇小游戏运行结果如下&#xff1a; 启动界面&#xff1a; 运行界面&#xff1a; 重启界面&#xff1a; 源代码框架如下&#xff1a; 注&#xff1a;在运行程序的时候&#xff0c;得重新设计窗体的大小&#x…

JAVA 实现《贪吃蛇大作战》游戏|CSDN创作打卡

前言 贪吃蛇&#xff08;也叫做贪食蛇&#xff09;游戏是一款休闲益智类游戏&#xff0c;有PC和手机等多平台版本。既简单又耐玩。该游戏通过控制蛇头方向吃东西&#xff0c;从而使得蛇变得越来越长。 本程序是通过java的swing来实现《贪吃蛇大作战》这款游戏。 主要需求 1…

java贪吃蛇源码

欢迎访问我的个人博客 https://jialaner.cn/​​​​​​​ java是一种面向对象的语言&#xff0c;有着其中不用质疑的优点。学习java将近三个月了&#xff0c;一直在琢磨着“万物皆对象”的意义&#xff0c;却总是只知其表不知其意&#xff0c;做完这个java贪吃蛇后才有了那么…

贪吃蛇 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;和蓝牙应用层协…