贪吃蛇

简介:利用GUI制作一个简易游戏------贪吃蛇

  • 游戏逻辑

    1. 一条有限长度的蛇
    2. 通过吃食物增加自身长度
    3. 通过判断身体与头部的接触来确定游戏失败
    4. 优化游戏
  • 实现代码核心

    1. JFrame 的基本布局
    2. JPanel 的制作
    3. 键盘监听器KeyListener接口实现
    4. 定时器ActionListener的接口实现
    5. 静态资源的引入

目录结构

静态资源的引入

  • 新建一个Data类,用来存放静态资源的加载路径,主要是一些图片

Data

package com.zj.snake;import javax.swing.*;
import java.net.URL;//数据中心
public class Data {//相对路径 tx.png//绝对路径 / 相当于当前的项目/*** 获得头部图片*/public static URL headerURL = Data.class.getResource("/statics/header.png");public static ImageIcon header = new ImageIcon(headerURL);public static URL upURL = Data.class.getResource("/statics/up.png");public static URL downURL = Data.class.getResource("/statics/down.png");public static URL leftURL = Data.class.getResource("/statics/left.png");public static URL rightURL = Data.class.getResource("/statics/right.png");public static ImageIcon up = new ImageIcon(upURL);public static ImageIcon down = new ImageIcon(downURL);public static ImageIcon left = new ImageIcon(leftURL);public static ImageIcon right = new ImageIcon(rightURL);public static URL bodyURL = Data.class.getResource("/statics/body.png");public static  ImageIcon body = new ImageIcon(bodyURL);public static URL foodURL = Data.class.getResource("/statics/food.png");public static  ImageIcon food = new ImageIcon(foodURL);
}
  • 这里用到class.getResource方法,是编译过后的路径资源

    有些加载不出来资源,需要重启一下IDEA。

贪吃蛇的实现类

Snake


package com.zj.snake;//贪吃蛇基本类
public class Snake {//定义蛇的数据结构int length;//蛇的长度int[] snakex = new int[600];//蛇的x坐标 25*25int[] snakey = new int[500];//蛇的y坐标 25*20String fx;//初始化的方向//初始化方法public void init(){length = 3;snakex[0] = 100;snakey[0] = 100;//脑袋的坐标snakex[1] = 75;snakey[1] = 100;//第一个身体的坐标snakex[2] = 50;snakey[2] = 100;//第二个身体的坐标fx = "D";}public Snake(){init();}
}

核心类GamePanel

package com.zj.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 {//游戏当前的状态boolean isStart = false;//默认是不开始boolean isFail = false;//游戏失败,默认falseint score = 0;//初始化成绩Snake snake = new Snake();//定时器Timer timer = new Timer(100, this);//以毫秒为单位//食物的坐标int foodx;int foody;Random random = new Random();public GamePanel() {this.setFocusable(true);//获得焦点事件this.addKeyListener(this);//获得键盘的监听事件timer.start();createFood();}//绘制面板,游戏里的所有东西都是由此画笔制作@Overrideprotected void paintComponent(Graphics g) {super.paintComponent(g);//清屏的作用,没有就会闪屏//绘制静态的面板this.setBackground(Color.WHITE);Data.header.paintIcon(this, g, 25, 11);//头部广告栏g.fillRect(25, 75, 850, 600);//默认的游戏界面Data.food.paintIcon(this,g,foodx,foody);//画积分g.setColor(Color.YELLOW);g.setFont(new Font("微软雅黑", Font.BOLD, 18));//设置字体g.drawString("长度"+snake.length, 750, 35);g.drawString("分数"+score, 750, 53);//把小蛇画上去//方向switch (snake.fx) {case "W":Data.up.paintIcon(this, g, snake.snakex[0], snake.snakey[0]);break;case "A":Data.left.paintIcon(this, g, snake.snakex[0], snake.snakey[0]);break;case "S":Data.down.paintIcon(this, g, snake.snakex[0], snake.snakey[0]);break;case "D":Data.right.paintIcon(this, g, snake.snakex[0], snake.snakey[0]);break;}for (int i = 1; i < snake.length; i++) {Data.body.paintIcon(this, g, snake.snakex[i], snake.snakey[i]);//画身体部分}//游戏未开始时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);}}@Overridepublic void keyTyped(KeyEvent e) {}//键盘按下@Overridepublic void keyPressed(KeyEvent e) {int keyCode = e.getKeyCode();//获得键盘按键是哪一个if (keyCode == KeyEvent.VK_SPACE) {//按下的空格if (isFail){//重新开始isFail=false;snake.init();createFood();score = 0;}else {isStart = !isStart;}repaint();}//小蛇移动switch (keyCode) {case KeyEvent.VK_W:snake.fx = "W";break;case KeyEvent.VK_S:snake.fx = "S";break;case KeyEvent.VK_A:snake.fx = "A";break;case KeyEvent.VK_D:snake.fx = "D";break;}}@Overridepublic void keyReleased(KeyEvent e) {}//事件监听----通过固定事件监听@Overridepublic void actionPerformed(ActionEvent e) {if (isStart && !isFail) {//如果游戏是开始状态,就让小蛇动起来//右移for (int i = snake.length - 1; i > 0; i--) {snake.snakex[i] = snake.snakex[i - 1];//向前移动snake.snakey[i] = snake.snakey[i - 1];}//走向switch (snake.fx) {case "D":snake.snakex[0] = snake.snakex[0] + 25;//边界判断if (snake.snakex[0] > 850) {snake.snakex[0] = 25;}break;case "A":snake.snakex[0] = snake.snakex[0] - 25;//边界判断if (snake.snakex[0] < 25) {snake.snakex[0] = 850;}break;case "W":snake.snakey[0] = snake.snakey[0] - 25;//边界判断if (snake.snakey[0] < 75) {snake.snakey[0] = 650;}break;case "S":snake.snakey[0] = snake.snakey[0] + 25;//边界判断if (snake.snakey[0] > 650) {snake.snakey[0] = 75;}break;}//失败判断,撞到自己就算失败for (int i = 1;i< snake.length;i++){if (snake.snakex[0]==snake.snakex[i] && snake.snakey[0]==snake.snakey[i]){isFail = true;}}//吃食物if (snake.snakex[0] == foodx && snake.snakey[0] == foody){snake.length++;//长度加1score = addCarry(score,10);//再次随机生成食物createFood();}repaint();//重画页面}timer.start();//定时器开始}//生成食物public void createFood(){//把食物随机分布在界面上foodx = 25 + 25*random.nextInt(35);foody = 75 + 25*random.nextInt(24);}//位运算实现相加int addCarry(int a,int b){int result;int sum,carry;sum = a^b;carry = (a&b)<<1;if (carry==0){result = sum;}else {result = addCarry(sum,carry);}return result;}
}

游戏启动类

StartGame

package com.zj.snake;import javax.swing.*;//游戏的主启动类
public class StartGame {public static void main(String[] args) {JFrame jFrame = new JFrame();jFrame.setBounds(10,10,915,700);//根据图片算出的大小,固定窗口大小,不允许拉伸jFrame.setResizable(false);//窗口大小不可变//正常的游戏都在游戏的面板上GamePanel gamePanel = new GamePanel();jFrame.add(gamePanel);jFrame.setVisible(true);jFrame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);}
}

Java GUI之贪吃蛇---[观看bilibili-狂神说Java--学习笔记]相关推荐

  1. GUI编程---贪吃蛇小游戏开发

    学习链接:狂神说Java–1小时开发贪吃蛇小游戏 ①初识理论 帧:时间片足够小=>就是动画,1秒30帧.连起来是动画,拆开就是静态的图片! 键盘监听 定时器Timer 游戏图片素材:GUI之贪吃 ...

  2. java版的贪吃蛇。

    /*** 贪吃蛇程序*/ package demo1; import java.awt.Color; import java.awt.Graphics; import java.awt.event.* ...

  3. java毕业设计——基于java+J2ME的贪吃蛇游戏设计与实现(毕业论文+程序源码)——贪吃蛇游戏

    基于java+J2ME的贪吃蛇游戏设计与实现(毕业论文+程序源码) 大家好,今天给大家介绍基于java+J2ME的贪吃蛇游戏设计与实现,文章末尾附有本毕业设计的论文和源码下载地址哦.需要下载开题报告P ...

  4. 做一个简单的java小游戏--贪吃蛇

    做一个简单的java小游戏–贪吃蛇 贪吃蛇游戏博客链接:(方法一样,语言不一样) c++贪吃蛇:https://blog.csdn.net/weixin_46791942/article/detail ...

  5. Docker基础03--Dockerfile详解与镜像发布--(狂神说docker学习笔记)

    文章目录 1. Dockerfile介绍 2. Dockerfile指令说明 3. 制作Centos镜像 3.1 编写Dockerfile的文件 3.2 通过这个文件构建镜像(注意最后加个点!!!) ...

  6. Java 基础 第3阶段:高级应用——尚硅谷学习笔记(含面试题) 2023年

    Java 基础 第 3 阶段:高级应用--尚硅谷学习笔记(含面试题) 2023 年 Java 基础 第 3 阶段:高级应用--尚硅谷学习笔记(含面试题) 2023 年 第 9 章 异常处理 9.1 异 ...

  7. 计算机毕业设计-基于Java的GUI实现贪吃蛇小游戏

    标题:基于Java多线程版本GUI贪吃蛇小游戏 1.项目技术点 1.多线程的运用. 2.JAVA的GUI的运用. 3.数据结构的灵活运用. 4.随机食物的生成. 5.关卡加速,随着蛇身增长,蛇的速度也 ...

  8. java gui怎么做游戏_Java中关于GUI实现贪吃蛇游戏的简单方法

    这篇文章主要介绍了Java GUI编程之贪吃蛇游戏简单实现方法,详细分析了贪吃蛇游戏的具体实现步骤与相关注意事项,并附带demo源码供读者下载参考,需要的朋友可以参考下 本文实例讲述了Java GUI ...

  9. Java的GUI编程---贪吃蛇游戏实现

    绘制静态窗口 代码实现 package com.akita.snake;import javax.swing.*;public class StartGames {public static void ...

最新文章

  1. Python Open Source Project List
  2. HarmonyOS之变量可视化调试
  3. hook_theme 的重要性
  4. iOS开发常用的RGB色值和宏
  5. Ubuntu Pycharm启动后卡住无法操作
  6. 数据库技大会五周年 技术领袖共聚DTCC
  7. 单台服务器最大支持多少连接数
  8. 学习PyQt5(四):PyQt5的控件Spacers
  9. 分享-追书神器旧版本-无广告、可换源看小说
  10. 人工智能课程设计报告
  11. linux 查看文件哈希码,计算文件哈希值
  12. 【Excel学习笔记8】“定位”可以用来干嘛?
  13. 计算机软件比赛团队名称,辩论赛 | 最佳人气团队评选
  14. threeJS鼠标单击模型边缘高亮
  15. PE文件结构与程序装载
  16. IC后端物理实现自动化工具 OpenROAD系列(三)ibex-32位2级流水线 RISC-V CPU 的物理实现
  17. java 编程联系_《JAVA程序设计》结对编程联系_四则运算(第一周:阶段总结)...
  18. 中文转拼音,其它字符不作处理的分享
  19. Kubernetes RBAC 为指定用户授权访问不同命名空间权限
  20. 2018第二届中国移动金融发展大会

热门文章

  1. 解决Firefox不响应window.resize事件
  2. google动态口令 php,谷歌动态口令怎么用 谷歌动态口令使用教程
  3. 零售电商交易中的订单生成与拆分
  4. STM32烧写失败错误:Contents mismatch at: 08000000H (Flash=FFH Required=00H)
  5. 猎人手游当前账号或服务器不允许登陆,猎人手游角色仓库可以通用吗 账号通用问题解答...
  6. love热点多几分优雅气质
  7. AMIS:这是让前端失业的一个框架
  8. matlab gui .fig,精通MATLAB GUI设计 matlab gui 图形处理 图形用户界面(Graphical User Interface - 下载 - 搜珍网...
  9. Java(Android)设计模式-简介
  10. rxJava源码解析系列五之Disposable