一.工程文件

二.Main.java

package com.company;import javax.swing.*;public class Main {public static void main(String[] args) {//创建窗体对象JFrame frame = new JFrame();//创建窗体参数()frame.setBounds(10,10,900,720);//设置不允许更改大小//frame.setResizable(false);//设置关闭方式frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//添加主题逻辑框架frame.add(new Mpanel());//设置窗体可见frame.setVisible(true);}
}

三.Mpanel.java

package com.company;import javax.imageio.ImageIO;
import javax.sound.sampled.*;
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.io.BufferedInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Random;//基本套路,继承JPanel,实现KeyListener, ActionListener接口
public class Mpanel extends JPanel implements KeyListener, ActionListener {//定义所需要的图片元素//标题ImageIcon title;//蛇的身体部位ImageIcon body;//蛇向上方向的头ImageIcon up;//蛇向下方向的头ImageIcon down;//蛇向左方向的头ImageIcon left;//蛇向右方向的头ImageIcon right;//食物元素ImageIcon food;//定义初始长度int len = 3;//定义初始分数int score = 0;//存放蛇位置坐标的数组int[] snakex = new int[750];int[] snakey = new int[750];//定义方向String fx = "R";//定义游戏是否开始Boolean isStart = false;//定义游戏是否失败Boolean isFailed = false;//定义游戏时钟,在此可以设置蛇移动速度,默认100msTimer timer = new Timer(100,this);//定义食物的坐标int foodx;int foody;//引入随机数,用于生成食物的随机位置Random random = new Random();//定义背景音乐Clip bgm;//构造方法public Mpanel(){//加载图片元素loadImages();//初始化数据initSnake();//设置聚焦this.setFocusable(true);//设置键盘监听this.addKeyListener(this);//开始计时timer.start();//加载背景音乐loadBGM();}//设置绘图元素public void paintComponent(Graphics g){//调用父类方法super.paintComponent(g);//设置背景颜色为白色this.setBackground(Color.white);//设置标题元素位置title.paintIcon(this,g,25,11);//设置白色背景填充位置g.fillRect(25,75,850,600);//设置画笔颜色为白色g.setColor(Color.white);//设置长度显示g.drawString("Len: " + len,750,35);//设置分数显示g.drawString("Score: " + score,750,50);//根据方向调用相应的蛇头元素if(fx == "R"){right.paintIcon(this,g,snakex[0],snakey[0]);}else if(fx == "L"){left.paintIcon(this,g,snakex[0],snakey[0]);}else if(fx == "U"){up.paintIcon(this,g,snakex[0],snakey[0]);}else if(fx == "D"){down.paintIcon(this,g,snakex[0],snakey[0]);}for(int i=1;i<len;i++){body.paintIcon(this,g,snakex[i],snakey[i]);}//调用食物元素food.paintIcon(this,g,foodx,foody);//游戏开始的处理if(isStart == false){//设置画笔颜色g.setColor(Color.white);//设置字体g.setFont(new Font("arial",Font.BOLD,40));//设置具体文字g.drawString("Press Space To Start",250,300);}//游戏失败的处理if(isFailed){//设置画笔颜色g.setColor(Color.red);//设置字体g.setFont(new Font("arial",Font.BOLD,40));//设置具体文字g.drawString("Failed: Press Space To Start",250,300);}}//初始化数据public void initSnake(){len = 3;snakex[0] = 100;snakey[0] = 100;snakex[1] = 75;snakey[1] = 100;snakex[2] = 50;snakey[2] = 100;//设置食物的初始随机生成位置foodx = 25 + 25 * random.nextInt(34);foody = 75 + 25 * random.nextInt(24);//设置初始值fx = "R";score = 0;}//接口要求的实现方法@Overridepublic void keyTyped(KeyEvent e) {}@Overridepublic void keyPressed(KeyEvent e) {//获取键盘监听int keyCode = e.getKeyCode();//空格if(keyCode == KeyEvent.VK_SPACE){//如果失败则重置信息if(isFailed){isFailed = !isFailed;//重新开始initSnake();}//设置开始else {isStart = !isStart;}//判断开始后循环播放背景音乐if(isStart){bgm.loop(Clip.LOOP_CONTINUOUSLY);}//未开始和暂停则不播放背景音乐else {bgm.stop();}//重新绘图repaint();}//右键处理并设置不能回头else if(keyCode == KeyEvent.VK_LEFT && fx != "R"){fx = "L";}//左键else if(keyCode == KeyEvent.VK_RIGHT && fx != "L"){fx = "R";}//上键else if(keyCode == KeyEvent.VK_UP && fx != "D"){fx = "U";}//下键else if(keyCode == KeyEvent.VK_DOWN && fx != "U"){fx = "D";}}//接口要求的实现方法@Overridepublic void keyReleased(KeyEvent e) {}//事件监听@Overridepublic void actionPerformed(ActionEvent e) {//开始且没有失败的情况if(isStart && !isFailed){//循环移动蛇身for(int i=len-1;i>0;i--){snakex[i]=snakex[i-1];snakey[i]=snakey[i-1];}//向右移动并判断是否撞墙,撞墙则失败if(fx == "R"){snakex[0]=snakex[0]+25;if(snakex[0]>825)isFailed=true;}//向左移动并判断是否撞墙,撞墙则失败else if(fx == "L"){snakex[0]=snakex[0]-25;if(snakex[0]<50)isFailed=true;}//向上移动并判断是否撞墙,撞墙则失败else if(fx == "U"){snakey[0]=snakey[0]-25;if(snakey[0]<100)isFailed=true;}//向下移动并判断是否撞墙,撞墙则失败else if(fx == "D"){snakey[0]=snakey[0]+25;if(snakey[0]>625)isFailed=true;}//吃到食物的判断if(snakex[0]==foodx&&snakey[0]==foody){//身体加长,分加多,并且随机生成新食物len++;score += 10;foodx = 25 + 25 * random.nextInt(34);foody = 75 + 25 * random.nextInt(24);}//撞到自身的处理for(int i=1;i<len;i++){if(snakex[i]==snakex[0] && snakey[i]==snakey[0]){isFailed = true;}}//重新绘图repaint();}//事件刷新timer.start();}//加载背景音乐public void loadBGM(){try {//从类所在文件引入bgm = AudioSystem.getClip();InputStream is = this.getClass().getClassLoader().getResourceAsStream("com/company/sound/bgm.wav");AudioInputStream ais = AudioSystem.getAudioInputStream(new BufferedInputStream(is));bgm.open(ais);//bgm.loop(Clip.LOOP_CONTINUOUSLY);}//相应的异常处理catch (LineUnavailableException e) {e.printStackTrace();}catch (UnsupportedAudioFileException e) {e.printStackTrace();}catch (IOException e) {e.printStackTrace();}}//加载图片public void loadImages(){InputStream is;try {//依次添加响应元素is = getClass().getClassLoader().getResourceAsStream("com/company/img/title.jpg");title = new ImageIcon(ImageIO.read(is));is = getClass().getClassLoader().getResourceAsStream("com/company/img/body.png");body = new ImageIcon(ImageIO.read(is));is = getClass().getClassLoader().getResourceAsStream("com/company/img/up.png");up = new ImageIcon(ImageIO.read(is));is = getClass().getClassLoader().getResourceAsStream("com/company/img/down.png");down = new ImageIcon(ImageIO.read(is));is = getClass().getClassLoader().getResourceAsStream("com/company/img/left.png");left = new ImageIcon(ImageIO.read(is));is = getClass().getClassLoader().getResourceAsStream("com/company/img/right.png");right = new ImageIcon(ImageIO.read(is));is = getClass().getClassLoader().getResourceAsStream("com/company/img/food.png");food = new ImageIcon(ImageIO.read(is));} catch (IOException e) {e.printStackTrace();}}
}

四.效果



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

  1. 贪吃蛇小游戏源码分享

    创建2个文件夹,一个是放源码还有一个文件夹是发图片的. 然后创建三个实体类. package com.Bubbles.snake; import javax.swing.*; import java. ...

  2. 学生学python编程---实现贪吃蛇小游戏+源码

    学生学python编程---实现贪吃蛇小游戏+源码 前言 主要设计 1.蛇的表示 2.蛇怎么移动? 3.玩家控制小蛇移动功能的实现 4.如何判定游戏结束? 应用知识点 1.python知识点 1.1 ...

  3. 【180928】美女贪吃蛇小游戏源码

    本源码是一个简单的c#版美女贪吃蛇小游戏源码,基于winform技术制作.控制方向键即可.右侧有记分板,每走一步都记加分.贪吃蛇身体掠过的地方就会显示背景图片,身体越长,显示的越多,玩家可以将图片换成 ...

  4. java小游戏代码压缩包_java 贪吃蛇小游戏 源码下载

    [实例简介] 使用java程序设计语言制作的一个贪吃蛇小游戏.游戏的控制模块应该做到易懂.易操作,以给玩家一个很好的游戏环境.在这个游戏的设计中,牵涉到图形界面的显示与更新.数据的收集与更新,还要应用 ...

  5. 贪吃蛇小游戏源码再回顾

    <!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8" ...

  6. 带看板娘玩法指导的贪吃蛇小游戏源码

    介绍: 左下角带看板娘插件,给玩家实时提示和介绍游戏玩法. 上下左右控制方向,数字0暂停,E加速,Q 减速,回车自动/手动切换. 网盘下载地址: http://kekewl.org/bJSm3CqBo ...

  7. Java开发贪吃蛇小游戏

    Java开发贪吃蛇小游戏 文章目录 Java开发贪吃蛇小游戏 一.开发思路 二.具体开发过程 1.绘制静态游戏窗口 2.导入素材图标 3.绘制游戏面板 4.绘制一条静态的小蛇 5.让小蛇动起来 ①监听 ...

  8. 简易贪吃蛇小游戏java版_用GUI实现java版贪吃蛇小游戏

    本文实例为大家分享了java版贪吃蛇小游戏的具体代码,供大家参考,具体内容如下 项目结构 新建一个JFrame窗口,作为程序入口 public class GameStart{ public stat ...

  9. Java实现贪吃蛇小游戏(附完整源码)

    今天我就从零开始来完成这个小游戏,完成的方式也是一步一步的添加功能这样的方式来实现. 第一步完成的功能:写一个界面 大家见到的贪吃蛇小游戏,界面肯定是少不了的.因此,第一步就是写一个小界面. 实现代码 ...

  10. Java Swing 贪吃蛇小游戏

    静态资源参考: 注:实际上没有用到header.png. 工程目录: 源码: package snake;import javax.swing.*; import java.net.URL;/*** ...

最新文章

  1. 您必须在sources.list中指定代码源_python如何从源代码构建lxml
  2. 博图只能通过地址相同设备找到plc_小白求教:博途v13无法连接s7-1200,显示在网络上未找到任何设备...
  3. 多种方法教你破解电信共享上网的限制
  4. nexus 代理阿里云_Azure容器镜像代理服务失效
  5. notepad++每行首尾添加内容
  6. 保险条款精解(二) 丢车——如何将损失降到最低点?
  7. c语言学习-编程实现以下功能,读入两个数(d1,d2)和一个运算符(o),计算d1 o d2的值
  8. WIN7 X64 如何删除计算机管理里面一些无效的服务
  9. java多线程基础篇第一篇-JMM
  10. [转载]备忘:oh my zsh 的安装、更新、删除
  11. iPerf3 局域网性能测试路由器
  12. 利用比值判敛法求收敛半径的问题
  13. 20172301 2017-2018-2 《程序设计与数据结构》第六周学习总结
  14. java实现数字转英文_Java实现数字转成英文的方法
  15. [激光原理与应用-19]:《激光原理与技术》-5- 激光器的增益、损耗、自激振荡条件
  16. 射线法进行地理空间坐标计算
  17. 参与开源项目可以找到更合适的工作之5大理由;GNOME 基金会因专利被起诉等;开源之道每周评论(2019 09 29)...
  18. 扫地机器人作文说明文提纲_扫地机器人说明文600字
  19. 2011大纽约区域赛试题 Decoding EDSAC Data 解题报告
  20. 5G物联网发展趋势下移动物联网卡面临的4大挑战难点

热门文章

  1. c语言超声波壁障源码,【图片】超声波避障小车源程序【精】【单片机吧】_百度贴吧...
  2. CentOS7安装单机kubernetes和Docker
  3. python面试专题--with 关键字与上下文管理
  4. LeetCode:累加数【306】
  5. error: Zip file too big (greater than 4294959102 bytes)
  6. 使用GMM进行语音性别检测(入门)
  7. opencv特效编辑之雕刻效果
  8. [转载] 使用hexo+github搭建免费个人博客详细教程
  9. Linux低分辨率下时钟中断调用流程
  10. python 分类 投票_使用python+redis实现文章发布,投票,分组排名功能