静态资源参考:

注:实际上没有用到header.png.

工程目录:

源码:

package snake;import javax.swing.*;
import java.net.URL;/*** 存放蛇的数据*/
public class Data {private static URL bodyURL = Data.class.getResource("img/body.png");private static URL downURL = Data.class.getResource("img/down.png");private static URL foodURL = Data.class.getResource("img/food.png");private static URL headerURL = Data.class.getResource("img/header.png");private static URL leftURL = Data.class.getResource("img/left.png");private static URL rightURL = Data.class.getResource("img/right.png");private static URL upURL = Data.class.getResource("img/up.png");private static ImageIcon bodyIMG = new ImageIcon(bodyURL);private static ImageIcon downIMG = new ImageIcon(downURL);private static ImageIcon foodIMG = new ImageIcon(foodURL);private static ImageIcon headerIMG = new ImageIcon(headerURL);private static ImageIcon leftIMG = new ImageIcon(leftURL);private static ImageIcon rightIMG = new ImageIcon(rightURL);private static ImageIcon upIMG = new ImageIcon(upURL);public static ImageIcon getBodyIMG() {return bodyIMG;}public static void setBodyIMG(ImageIcon bodyIMG) {Data.bodyIMG = bodyIMG;}public static ImageIcon getDownIMG() {return downIMG;}public static void setDownIMG(ImageIcon downIMG) {Data.downIMG = downIMG;}public static ImageIcon getFoodIMG() {return foodIMG;}public static void setFoodIMG(ImageIcon foodIMG) {Data.foodIMG = foodIMG;}public static ImageIcon getHeaderIMG() {return headerIMG;}public static void setHeaderIMG(ImageIcon headerIMG) {Data.headerIMG = headerIMG;}public static ImageIcon getLeftIMG() {return leftIMG;}public static void setLeftIMG(ImageIcon leftIMG) {Data.leftIMG = leftIMG;}public static ImageIcon getRightIMG() {return rightIMG;}public static void setRightIMG(ImageIcon rightIMG) {Data.rightIMG = rightIMG;}public static ImageIcon getUpIMG() {return upIMG;}public static void setUpIMG(ImageIcon upIMG) {Data.upIMG = upIMG;}
}
package snake;import javax.swing.*;/*** 游戏主启动类*/
public class StartGame {public static void main(String[] args) {/*窗口基本设置*/JFrame jFrame = new JFrame("贪吃蛇小游戏");//固定窗口大小jFrame.setResizable(false);/*面板:一定要放在setVisible(true)的前面;因为获得的焦点事件setFocusable(true)和键盘的监听事件addKeyListener(this)一定要放在setVisible(true)的前面;否则会导致键盘监听失效*/jFrame.add(new GamePanel());//设置窗口可见性jFrame.setVisible(true);//设置窗口定位和大小jFrame.setBounds(10,10,900,720);//设置关闭窗口监听jFrame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);}
}
package snake;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[500];// 蛇的X坐标int[] snakeY = new int[500];// 蛇的Y坐标// 食物的坐标int foodx;int foody;// 随机数Random random = new Random();String direction;// 小蛇头的方向boolean isStart = false;// 游戏初始状态为停止boolean isFail = false;// 游戏失败状态int score;// 游戏得分/*定时器:每隔100毫秒执行一次实现的ActionListener接口中的actionPerformed的方法体*/Timer timer = new Timer(100,this);// 启动public GamePanel(){//初始化蛇init();//获得焦点事件this.setFocusable(true);//获得键盘的监听事件this.addKeyListener(this);// 开启定时器timer.start();}/*初始化蛇*/public void init(){/*每个方块图形大小:25*25X坐标依次减25便于蛇身排列在一行*/length = 3;// 初始时蛇只有三个块snakeX[0] = 100;snakeY[0] = 100;// 初始时蛇第一个块的坐标(蛇头)snakeX[1] = 75;snakeY[1] = 100;// 初始时蛇第二个块的坐标snakeX[2] = 50;snakeY[2] = 100;// 初始时蛇第三个块的坐标direction = "R";// 小蛇头初始方向为右// 把食物随机分布在游戏界面上foodx = 25+random.nextInt(34)*25;//850除25=34foody = 75+random.nextInt(24)*25;//600除25=24score = 0;// 游戏得分}/*画笔*/@Overrideprotected void paintComponent(Graphics g) {// 清屏super.paintComponent(g);// 设置背景颜色this.setBackground(Color.WHITE);// 广告栏界面//Data.getHeaderIMG().paintIcon(this,g,250,11);g.setFont(new Font("微软雅黑",Font.BOLD,40));g.drawString("广告位招租",320,50);//动态绘制游戏得分g.setColor(Color.BLUE);g.setFont(new Font("微软雅黑",Font.BOLD,20));g.drawString("当前长度:"+length,750,25);g.drawString("当前得分:"+score,750,50);// 绘制矩形游戏界面g.setColor(Color.BLACK);g.fillRect(25,75,850,600);// 动态绘制小蛇头的方向if (direction.equals("R")){Data.getRightIMG().paintIcon(this,g,snakeX[0],snakeY[0]);}else if (direction.equals("L")){Data.getLeftIMG().paintIcon(this,g,snakeX[0],snakeY[0]);}else if (direction.equals("U")){Data.getUpIMG().paintIcon(this,g,snakeX[0],snakeY[0]);}else if (direction.equals("D")){Data.getDownIMG().paintIcon(this,g,snakeX[0],snakeY[0]);}else {System.out.println("错误:未知的方向!");}// 动态绘制小蛇身体for (int i = 1; i < length; i++) {Data.getBodyIMG().paintIcon(this,g,snakeX[i],snakeY[i]);}//动态绘制食物Data.getFoodIMG().paintIcon(this,g,foodx,foody);/*游戏状态*/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("游戏失败!按下空格重新开始!",300,300);g.setColor(Color.BLUE);g.drawString("当前得分:"+score,300,350);}}// 键盘监听@Overridepublic void keyPressed(KeyEvent e) {int keyCode = e.getKeyCode();// 如果按下空格if (keyCode == KeyEvent.VK_SPACE){if (isFail){/*游戏重新开始*/isFail = false;// 重新开始小蛇的初始位置init();}else {// 取反,这样空格才能开始和停止游戏,不能写死isStart = !isStart;}// isStart值已经发生变化,需要重新加载画笔paintComponent(Graphics g)方法repaint();}/*游戏开始后键盘才能控制小蛇头上下左右动*/if (isStart){if (keyCode == KeyEvent.VK_UP){direction = "U";}else if (keyCode == KeyEvent.VK_DOWN){direction = "D";}else if (keyCode == KeyEvent.VK_LEFT){direction = "L";}else if (keyCode == KeyEvent.VK_RIGHT){direction = "R";}// direction值已经发生改变,需要重新加载画笔paintComponent(Graphics g)方法repaint();}}// 定时器事件监听@Overridepublic void actionPerformed(ActionEvent e) {/*游戏开始状态*/if (isStart && isFail == false){// 小蛇头direction默认等于R// 小蛇身体移动for (int i = length-1;i>0;i--){snakeX[i] = snakeX[i-1];snakeY[i] = snakeY[i-1];}if (direction.equals("U")){// 小蛇头上移snakeY[0] = snakeY[0]-25;// 上边界判断if (snakeY[0]<75){snakeY[0]=600;}}else if(direction.equals("D")){// 小蛇头下移snakeY[0] = snakeY[0]+25;// 下边界判断if (snakeY[0]>650){snakeY[0]=75;}}else if (direction.equals("L")){// 小蛇头左移snakeX[0] = snakeX[0]-25;// 左边界判断if (snakeX[0]<25){snakeX[0]=850;}}else if (direction.equals("R")){// 小蛇头右移snakeX[0] = snakeX[0]+25;// 右边界判断if (snakeX[0]>850){snakeX[0]=25;}}/*小蛇吃食物:蛇头的坐标等于食物的坐标*/if (snakeX[0]==foodx&&snakeY[0]==foody){length++;// 蛇身长度加1score+=10;// 分数加10/*食物再次出现:把食物随机分布在游戏界面上*/foodx = 25+random.nextInt(34)*25;//850除25=34foody = 75+random.nextInt(24)*25;//600除25=24}/*判断游戏失败:蛇头撞到自己的身体就算失败*/for (int i = 1; i < length; i++) {if (snakeX[0]==snakeX[i]&&snakeY[0]==snakeY[i]){isFail = true;// 游戏失败}}/*判断游戏失败:蛇头撞到上下左右边界就算失败*/
//            if (snakeX[0]==875||snakeX[0]==0||snakeY[0]==675||snakeY[0]==0){//                isFail = true;// 游戏失败
//                snakeX[0] = 875;
//            }//蛇的参数改变了,需要重新加载画笔repaint();}// 开启定时器timer.start();}/*无用的两个键盘监听方法*/@Overridepublic void keyReleased(KeyEvent e) {}@Overridepublic void keyTyped(KeyEvent e) {}}

运行结果:

生成jar包:链接

注:仅供学习参考,非商用。侵权私信本人删除。

参考资料:

https://www.bilibili.com/video/BV1DJ411B75F?p=26

Java Swing 贪吃蛇小游戏相关推荐

  1. Java开发贪吃蛇小游戏

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

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

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

  3. JAVA版贪吃蛇小游戏

    这是一篇关于JAVA的贪吃蛇游戏,源代码的部分在下面正文中介绍,图片和音频的部分都放在百度云盘,需要的自行下载. 文章目录 开发环境 一.下载方法 二.运行效果展示 三.项目结构以及主程序入口 1.项 ...

  4. java 实现贪吃蛇小游戏

    在贪吃蛇游戏中,贪吃蛇的移动可以看作是一个先进先出的队列(从蛇尾的角度看),因此我们在C语言实现贪吃蛇小游戏一文中使用了循环链接表作为队来存储蛇身节点,在 python实现贪吃蛇小游戏一文中,使用列表 ...

  5. 用 Java 实现贪吃蛇小游戏

    程序说明 这是一个用 Java Awt 实现的贪吃蛇小游戏的完整代码 算法分析 (一)启动一个独立线程根据 direction 重绘面板实现蛇身移动效果,运行过程: 记录上次头部的坐标到 tempBo ...

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

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

  7. 初识Java之贪吃蛇小游戏

    一.绘制静态窗口 这是一个简陋的窗口 package Snake;import javax.swing.*;public class StartGames {public static void ma ...

  8. 【Java】Java实现贪吃蛇小游戏(带详细注释)

    源码 源码来源:Java swing 写的贪吃蛇代码200行 前段时间在博客上看到了这段源码,由于自己没有用Java做过小游戏,于是就copy了一下,然后在自己电脑上运行,顺便加上了注释. 代码 gr ...

  9. 用Java写贪吃蛇小游戏

    贪吃蛇游戏的设计步骤: Part 1: 设计游戏图纸 画出900*700的白色窗口 在窗口上添加画布 在画布上添加标题 在画布上添加黑色游戏区 Part 2: 放置静态的蛇:一个头.两个身体 加上开始 ...

最新文章

  1. 如何低价坐飞机头等舱
  2. c/c++ 标准库 插入迭代器 详解
  3. 上海往事之与初中同学YS见面
  4. html click事件 参数,vue 实现click同时传入事件对象和自定义参数
  5. 【MySQL】ERROR 1412 (HY000) Table definition has changed, please retry transaction
  6. Linux --忘记root密码/su: Authentication failure
  7. python搭建博客项目思路_Django项目——Blog简易开发入门
  8. SCOM 2016 配置报警邮件 (下)
  9. Java请求参数检查,Java如何检查servlet请求中是否存在参数?
  10. 如何使用给定的部分名称杀死所有进程?
  11. FFmpeg源代码简单分析:结构体成员管理系统-AVOption
  12. will would 七大用法总结
  13. 实验一:JDK下载与安装、 Eclipse下载与使用
  14. 面对互联网寒冬,程序员能够做什么?
  15. 【汇编语言】纯汇编语言编写打飞机小游戏
  16. 超人再起 Superman Returns
  17. Spring Boot(二):Spring Boot中的Starter介绍
  18. oracle 格式化命令,format 命令的输入规则 - Oracle Solaris 管理:设备和文件系统
  19. 新手入门matlab之线性系统频域分析
  20. 简单介绍迪杰斯拉Dijkstra算法步骤

热门文章

  1. 有哪些好用的OA办公软件?你的公司在用哪个?
  2. 小学校本培简讯 计算机技术,校本培训简报..doc
  3. Method selection for numeric quadrature
  4. 【免费】安卓性能测试工具GT
  5. 淘客分销,订单追踪解决方案
  6. android 黑马 模拟器,HBuilder调试夜神安卓模拟器方法
  7. python UI/接口 自动化测试 设计模式
  8. 【毕业设计】基于微信小程序的在线学习平台 在线学习微信小程序
  9. 利用python保存txt文件的指定行/前n行
  10. ps算计算机软件吗,PS图形软件需要cpu和图形卡,photoshop吃cpu还是图形卡?