Java GUI之贪吃蛇---[观看bilibili-狂神说Java--学习笔记]
贪吃蛇
简介:利用GUI制作一个简易游戏------贪吃蛇
游戏逻辑
- 一条有限长度的蛇
- 通过吃食物增加自身长度
- 通过判断身体与头部的接触来确定游戏失败
- 优化游戏
实现代码核心
- JFrame 的基本布局
- JPanel 的制作
- 键盘监听器KeyListener接口实现
- 定时器ActionListener的接口实现
- 静态资源的引入
目录结构
静态资源的引入
- 新建一个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--学习笔记]相关推荐
- GUI编程---贪吃蛇小游戏开发
学习链接:狂神说Java–1小时开发贪吃蛇小游戏 ①初识理论 帧:时间片足够小=>就是动画,1秒30帧.连起来是动画,拆开就是静态的图片! 键盘监听 定时器Timer 游戏图片素材:GUI之贪吃 ...
- java版的贪吃蛇。
/*** 贪吃蛇程序*/ package demo1; import java.awt.Color; import java.awt.Graphics; import java.awt.event.* ...
- java毕业设计——基于java+J2ME的贪吃蛇游戏设计与实现(毕业论文+程序源码)——贪吃蛇游戏
基于java+J2ME的贪吃蛇游戏设计与实现(毕业论文+程序源码) 大家好,今天给大家介绍基于java+J2ME的贪吃蛇游戏设计与实现,文章末尾附有本毕业设计的论文和源码下载地址哦.需要下载开题报告P ...
- 做一个简单的java小游戏--贪吃蛇
做一个简单的java小游戏–贪吃蛇 贪吃蛇游戏博客链接:(方法一样,语言不一样) c++贪吃蛇:https://blog.csdn.net/weixin_46791942/article/detail ...
- Docker基础03--Dockerfile详解与镜像发布--(狂神说docker学习笔记)
文章目录 1. Dockerfile介绍 2. Dockerfile指令说明 3. 制作Centos镜像 3.1 编写Dockerfile的文件 3.2 通过这个文件构建镜像(注意最后加个点!!!) ...
- Java 基础 第3阶段:高级应用——尚硅谷学习笔记(含面试题) 2023年
Java 基础 第 3 阶段:高级应用--尚硅谷学习笔记(含面试题) 2023 年 Java 基础 第 3 阶段:高级应用--尚硅谷学习笔记(含面试题) 2023 年 第 9 章 异常处理 9.1 异 ...
- 计算机毕业设计-基于Java的GUI实现贪吃蛇小游戏
标题:基于Java多线程版本GUI贪吃蛇小游戏 1.项目技术点 1.多线程的运用. 2.JAVA的GUI的运用. 3.数据结构的灵活运用. 4.随机食物的生成. 5.关卡加速,随着蛇身增长,蛇的速度也 ...
- java gui怎么做游戏_Java中关于GUI实现贪吃蛇游戏的简单方法
这篇文章主要介绍了Java GUI编程之贪吃蛇游戏简单实现方法,详细分析了贪吃蛇游戏的具体实现步骤与相关注意事项,并附带demo源码供读者下载参考,需要的朋友可以参考下 本文实例讲述了Java GUI ...
- Java的GUI编程---贪吃蛇游戏实现
绘制静态窗口 代码实现 package com.akita.snake;import javax.swing.*;public class StartGames {public static void ...
最新文章
- Python Open Source Project List
- HarmonyOS之变量可视化调试
- hook_theme 的重要性
- iOS开发常用的RGB色值和宏
- Ubuntu Pycharm启动后卡住无法操作
- 数据库技大会五周年 技术领袖共聚DTCC
- 单台服务器最大支持多少连接数
- 学习PyQt5(四):PyQt5的控件Spacers
- 分享-追书神器旧版本-无广告、可换源看小说
- 人工智能课程设计报告
- linux 查看文件哈希码,计算文件哈希值
- 【Excel学习笔记8】“定位”可以用来干嘛?
- 计算机软件比赛团队名称,辩论赛 | 最佳人气团队评选
- threeJS鼠标单击模型边缘高亮
- PE文件结构与程序装载
- IC后端物理实现自动化工具 OpenROAD系列(三)ibex-32位2级流水线 RISC-V CPU 的物理实现
- java 编程联系_《JAVA程序设计》结对编程联系_四则运算(第一周:阶段总结)...
- 中文转拼音,其它字符不作处理的分享
- Kubernetes RBAC 为指定用户授权访问不同命名空间权限
- 2018第二届中国移动金融发展大会
热门文章
- 解决Firefox不响应window.resize事件
- google动态口令 php,谷歌动态口令怎么用 谷歌动态口令使用教程
- 零售电商交易中的订单生成与拆分
- STM32烧写失败错误:Contents mismatch at: 08000000H (Flash=FFH Required=00H)
- 猎人手游当前账号或服务器不允许登陆,猎人手游角色仓库可以通用吗 账号通用问题解答...
- love热点多几分优雅气质
- AMIS:这是让前端失业的一个框架
- matlab gui .fig,精通MATLAB GUI设计 matlab gui 图形处理 图形用户界面(Graphical User Interface - 下载 - 搜珍网...
- Java(Android)设计模式-简介
- rxJava源码解析系列五之Disposable