当前位置: 首页 > news >正文

GUI编程19:贪吃蛇小游戏及GUI总结

视频链接:21、贪吃蛇之界面绘制_哔哩哔哩_bilibiliicon-default.png?t=O83Ahttps://www.bilibili.com/video/BV1DJ411B75F?p=21&vd_source=b5775c3a4ea16a5306db9c7c1c1486b5

1.游戏中用的的图片素材

1.贪吃蛇游戏的主启动类StartGame;

package com.yundait.snake;import javax.swing.*;
import java.awt.*;//贪吃蛇游戏的主启动类;
public class StartGame {public static void main(String[] args) {JFrame frame = new JFrame("我的游戏—贪吃蛇");//创建游戏窗口frame.setBounds(10,10,915,745);//设置窗口的位置和长宽frame.setResizable(false);//设置窗口尺寸不可调frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);//设置窗口关闭事件Container container = frame.getContentPane();//创建一个内容窗格的容器container.add(new GamePanel());//将面板放在容器上frame.setVisible(true);//设置窗口可见}
}

2.贪吃蛇游戏的数据类Data:存放游戏界的图片

package com.yundait.snake;import javax.swing.*;
import java.net.URL;
public class Data {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 URL bodyURL = Data.class.getResource("statics/body.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 ImageIcon body = new ImageIcon(bodyURL);//创建朝右的头部图标public static URL foodURL = Data.class.getResource("statics/food.png");//获取食物图片public static ImageIcon food = new ImageIcon(foodURL);//创建食物图标
}

3.贪吃蛇游戏的游戏面板GamePanel:主要功能都在类下此实现

package com.yundait.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[600];//蛇的X坐标int[]snakeY= new int[500];//蛇的Y坐标String direction;//定义小蛇头的方向参数int food_x;int food_y;int score;Random random = new Random();boolean isStart;//游戏开始、结束的状态boolean isFail;//游戏失败状态Timer timer = new Timer(100,this);//创建一个定时器,每100毫秒执行一次(每秒执行10次)//构造器方法public GamePanel() {init();this.setFocusable(true);//获得焦点事件this.addKeyListener(this);//添加键盘监听}//数据初始化方法public void init(){length = 3;//初始化小蛇长度,包含小蛇头snakeX[0] = 100;snakeY[0] = 100;//初始化小蛇脑袋的坐标snakeX[1] = 75;snakeY[1] = 100;//初始化小蛇第1段身体的坐标snakeX[2] = 50 ;snakeY[2] = 100;//初始化小蛇第2段身体的坐标direction = "right"; //初始化小蛇头的方向(向右)isStart = false;//游戏默认处于停止状态isFail = false;timer.start();//游戏一开始,就启动定时器。score = 0;//把食物随机分派在界面上food_x = 25 + 25*random.nextInt(34);food_y = 75 + 25*random.nextInt(24);}//绘制面板,我们游戏中的所有东西,都用这支画笔来画@Overrideprotected void paintComponent(Graphics g) {//清屏super.paintComponent(g);//绘制静态游戏面板this.setBackground(new Color(255, 255, 255));//设置面板的颜色Data.header.paintIcon(this,g,25,11);//把头部广告栏画上去g.setColor(new Color(110, 164, 176));//设置画笔的颜色g.fillRect(25,75,850,600);//画一个默认的矩形游戏界面//把分数画在界面上g.setColor(Color.white);g.setFont(new Font("微软雅黑",Font.BOLD,18));g.drawString("长度:" + length,750,30);g.drawString("分数:" + score,750,55);//把食物画在界面上Data.food.paintIcon(this,g,food_x,food_y);//使用switch选择结构把小蛇的头画在面板上switch (direction){case "right":Data.right.paintIcon(this,g,snakeX[0],snakeY[0]);//把朝右的小蛇头画在面板上break;case "left":Data.left.paintIcon(this,g,snakeX[0],snakeY[0]);//把朝左的小蛇头画在面板上break;case "up":Data.up.paintIcon(this,g,snakeX[0],snakeY[0]);//把朝上的小蛇头画在面板上break;case "down":Data.down.paintIcon(this,g,snakeX[0],snakeY[0]);//把朝下的小蛇头画在面板上break;}//使用循环结构把小蛇身体画在面板上for (int i = 1; i < length; i++) {Data.body.paintIcon(this,g,snakeX[i],snakeY[i]);}//判断游戏状态,按下空格键开始或结束游戏if (!isStart){g.setColor(Color.white);g.setFont(new Font("微软雅黑",Font.BOLD,40));g.drawString("请按下空格开始游戏",300,350);}//判断游戏是否失败,失败后显示:"游戏失败,按下空格重新开始"if (isFail){g.setColor(Color.red);g.setFont(new Font("微软雅黑",Font.BOLD,40));g.drawString("游戏失败,按下空格重新开始",300,350);}}//键盘监听事件@Overridepublic void keyPressed(KeyEvent e) {int keyCode = e.getKeyCode();//获得键盘按下了哪一个if (keyCode == KeyEvent.VK_SPACE){if (isFail){//游戏重新开始isFail =false;init();}else {isStart = !isStart;//游戏状态取反}repaint();}//监听键盘输入,根据键盘输入不同,改变小蛇方向if (keyCode == KeyEvent.VK_UP && !direction.equals("down")){direction = "up";} else if (keyCode == KeyEvent.VK_DOWN && !direction.equals("up")) {direction = "down";} else if (keyCode == KeyEvent.VK_LEFT && !direction.equals("right")) {direction = "left";} else if (keyCode == KeyEvent.VK_RIGHT && !direction.equals("left")) {direction = "right";}}//事件监听----需要通过固定的时间来刷新@Overridepublic void actionPerformed(ActionEvent e) {if (isStart && !isFail){//监听小蛇吃食物if (snakeX[0] == food_x && snakeY[0] == food_y){//再次随机一个食物的坐标food_x = 25 + 25*random.nextInt(34);food_y = 75 + 25*random.nextInt(24);//吃完食物,身体长度加1length = length +1;score+=10;}//使用for循环让小蛇的后一节身体一动到前一节位置for (int i = length-1; i > 0 ; i--) {snakeX[i] = snakeX[i-1];snakeY[i] = snakeY[i-1];}//控制小蛇移动,撞墙后游戏失败if (direction.equals("right")){snakeX[0] = snakeX[0]+25;if (snakeX[0]>850){isFail = true;}} else if (direction.equals("left")) {snakeX[0] = snakeX[0]-25;if (snakeX[0]<25){isFail = true;}} else if (direction.equals("up")) {snakeY[0] = snakeY[0]-25;if (snakeY[0]<75){isFail = true;}} else if (direction.equals("down")) {snakeY[0] = snakeY[0]+25;if (snakeY[0]>650){isFail = true;}}//判断小蛇是否撞到自己,撞到自己后游戏失败for (int i = 1; i < length; i++) {if (snakeX[0]==snakeX[i] && snakeY[0] == snakeY[i]){isFail = true;break;}}repaint();//刷新}timer.start();//启动计时器}@Overridepublic void keyTyped(KeyEvent e) {}//用不到,不需要重写方法,放在这里即可;@Overridepublic void keyReleased(KeyEvent e) {}//用不到,不需要重写方法,放在这里即可;
}

4.GUI编程内容总结

相关文章:

GUI编程19:贪吃蛇小游戏及GUI总结

视频链接&#xff1a;21、贪吃蛇之界面绘制_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1DJ411B75F?p21&vd_sourceb5775c3a4ea16a5306db9c7c1c1486b5 1.游戏中用的的图片素材 1.贪吃蛇游戏的主启动类StartGame&#xff1b; package com.yundait.snake;import j…...

linux StarRocks 安装

一、检查服务器是否支持avx2&#xff0c;如果执行命令显示空&#xff0c;则不支持&#xff0c;那么安装后无法启动BE cat /proc/cpuinfo |grep avx2我的支持显示如下&#xff1a; 二、安装 docker run -p 9030:9030 -p 8030:8030 -p 8040:8040 -p 9001:9000 --privilegedtrue…...

解决RabbitMQ设置x-max-length队列最大长度后不进入死信队列

解决RabbitMQ设置x-max-length队列最大长度后不进入死信队列 问题发现问题解决方法一&#xff1a;只监听死信队列&#xff0c;在死信队列里面处理业务逻辑方法二&#xff1a;修改预取值 问题发现 最近再学习RabbitMQ过程中&#xff0c;看到关于死信队列内容&#xff1a; 来自队…...

【解决】chrome 谷歌浏览器,鼠标点击任何区域都是 Input 输入框的状态,能看到输入的光标

chrome 谷歌浏览器&#xff0c;鼠标点击任何区域都是 Input 输入框的状态&#xff0c;能看到输入的光标 今天打开电脑的时候&#xff0c;网页中任何文本的地方&#xff0c;只要鼠标点击&#xff0c;就会出现一个输入的光标&#xff0c;无论在哪个站点哪个页面都是如此。 我知道…...

使用python操作数据库

文章目录 一、问题背景二、安装python三、代码示例四、总结 一、问题背景 在日常开发过程中&#xff0c;随着项目进展和业务功能的迭代&#xff0c;我们需要对数据库的表结构进行修改&#xff0c;向部分表中追加字段&#xff0c;并对追加后的字段进行数据填充。但是如果需要追加…...

[Redis] 渐进式遍历+使用jedis操作Redis+使用Spring操作Redis

&#x1f338;个人主页:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 &#x1f3f5;️热门专栏: &#x1f9ca; Java基本语法(97平均质量分)https://blog.csdn.net/2301_80050796/category_12615970.html?spm1001.2014.3001.5482 &#x1f355; Collection与…...

排序----数据结构

Comparable Integer Double 默认情况下都是按照升序排列的 string 按照字母再ASCII码表中对应的数字升序进行排列 冒泡排序 时间复杂度O(x^2) 选择排序 时间复杂度O(x^2) 插入排序 时间复杂度O(x^2) 希尔排序 时间复杂度O(x) 归并排序 时间复杂度O(nlogn) 快速排序...

Crack道路裂缝检测数据集——目标检测数据集

【Crack道路裂缝检测数据集】共3684张。 目标检测数据集&#xff0c;标注文件为YOLO适用的txt格式。已划分为训练、验证集。 图片分辨率&#xff1a;224*224 类别&#xff1a;crack Crack道路裂缝检测数据集 数据集描述 该数据集是一个专门用于训练和评估基于YOLO&#xff0…...

10.3拉普拉斯金字塔

实验原理 拉普拉斯金字塔&#xff08;Laplacian Pyramid&#xff09;是一种图像表示方法&#xff0c;常被用于图像处理和计算机视觉领域。它是基于高斯金字塔的一种变换形式&#xff0c;主要用于图像融合、图像金字塔的构建等场景。下面简要介绍拉普拉斯金字塔的基本原理。 高…...

redis为什么不使用一致性hash

Redis节点间通信时&#xff0c;心跳包会携带节点的所有槽信息&#xff0c;它能以幂等方式来更新配置。如果采用 16384 个插槽&#xff0c;占空间 2KB (16384/8);如果采用 65536 个插槽&#xff0c;占空间 8KB (65536/8)。 今天我们聊个知识点为什么Redis使用哈希槽而不是一致性…...

Vue.js与Flask/Django后端配合

Vue.js与Flask/Django后端配合 在现代Web开发领域&#xff0c;前后端分离已成为一种流行的架构模式。Vue.js作为一款轻量级、高性能的前端框架&#xff0c;与Flask或Django这样的后端框架相结合&#xff0c;可以构建出强大且可扩展的Web应用。本文将详细介绍如何将Vue.js与Fla…...

ESP32 入门笔记02: ESP32-C3 系列( 芯片ESP32-C3FN4) (ESP-IDF + VSCode)

ESP32-C3 系列的 芯片 / 模组 / 开发板 ESP32-C3-DevKitM-1是乐鑫一款搭载 ESP32-C3-MINI-1 或 ESP32-C3-MINI-1U 模组的入门级开发板&#xff08;内置 ESP32-C3FH4 或 ESP32-C3FN4 芯片&#xff09;。 板上模组大部分管脚均已引出至两侧排针&#xff0c;可根据开发实际需求&a…...

Vue主题色实现

主题色实现 情境 配置平台支持多个主题色的选择&#xff0c;用户可通过在配置平台选择项目主题色。前端项目在骨架屏加载页面获取配置信息&#xff0c;设置项目主题色&#xff0c;实现同个项目不同主题色渲染的需求 实现 1.定义主题色变量 不同主题色根据不同js文件划分定…...

ChartLlama: A Multimodal LLM for Chart Understanding and Generation论文阅读

原文链接&#xff1a;https://arxiv.org/abs/2311.16483 代码与数据集&#xff1a;https://tingxueronghua.github.io/ChartLlama/ 本文启发&#xff1a;文章提出利用GPT-4合成大量图表数据&#xff0c;这些数据包含各种图表类型&#xff0c;包含丰富的instruction data。然后…...

ByteCinema(1):用户的登录注册

文章目录 主要功能生成图形验证码redis滑动窗口操作限流0.限流设计的必要性1.原理2.代码&#xff08;邮箱发验证码为例&#xff09;3. 问题与解决高并发环境下redis操作的原子性过时数据的积累 续约token实现长期登录0.设计的出发点1.前置知识:JWT什么是 JWT&#xff1f;JWT 的…...

电力电网电线变电站输电线绝缘子无人机类数据集/农业植物病虫害类数据集/光伏板/工程煤矿矿场类数据集/道路类数据集

电力电网电线变电站输电线红外缺陷类数据集 传送门链接&#xff1a; 1.电线覆盖物检测数据集 气球风筝鸟巢 1300张 voc yol-CSDN博客 2.变电站可见光缺陷数据集数据集包含8376张巡检图像&#xff0c;带xml标签&#xff0c;共包含17类巡检标签!具体缺陷分类见下图&#xff01…...

深度学习之表示学习 - 引言篇

序言 在数据爆炸的今天&#xff0c;如何从纷繁复杂的信息中抽取有价值的知识&#xff0c;成为了人工智能领域亟待解决的核心问题。深度学习&#xff0c;作为机器学习的一个重要分支&#xff0c;以其强大的特征表示能力和自动化学习特性&#xff0c;引领了这场数据革命的浪潮。…...

Linux驱动开发 ——架构体系

只读存储器&#xff08;ROM&#xff09; 1.作用 这是一种非易失性存储器&#xff0c;用于永久存储数据和程序。与随机存取存储器&#xff08;RAM&#xff09;不同&#xff0c;ROM中的数据在断电后不会丢失&#xff0c;通常用于存储固件和系统启动程序。它的内容在制造时或通过…...

Django一分钟:lookupAPI详解,使用django orm生成高效的WHERE子句

一、Lookup API概述 Lookup API是Django用于构建数据库查询WHERE子句的API。 Lookup API的核心包含两部分&#xff1a; RegisterLookupMixin&#xff1a;为子类提供注册lookup的方法Query Expression API&#xff1a;一个接口&#xff0c;规定了可以被注册为lookup的类需要实…...

信息安全工程师(8)网络新安全目标与功能

前言 网络新安全目标与功能在当前的互联网环境中显得尤为重要&#xff0c;它们不仅反映了网络安全领域的最新发展趋势&#xff0c;也体现了对网络信息系统保护的不断加强。 一、网络新安全目标 全面防护与动态应对&#xff1a; 目标&#xff1a;建立多层次、全方位的网络安全防…...

MDIN380芯片高清视频处理方案:SDI转VGA与LVDS转换,专业PCB设计与源码集成

MDIN380 SDI转VGA 转LVDS VGA转SDI 高清视频处理 MDIN380芯片 PCB代码方案资料 3G-SDI转VGA ?3G-SDI转LVDS ?高清视频 MDIN380、GV7601 芯片方案(PCB图和源码)。 此方案是韩国视频处理芯片MDIN380的整合应用方案。 3G-SDI转VGA或3G-SDI转LVDS。 方案共有两块电路板(一块底板…...

Kevin喜欢零(困难版本)【牛客tracker 每日一题】

Kevin喜欢零(困难版本) 时间限制&#xff1a;1秒 空间限制&#xff1a;256M 网页链接 牛客tracker 牛客tracker & 每日一题&#xff0c;完成每日打卡&#xff0c;即可获得牛币。获得相应数量的牛币&#xff0c;能在【牛币兑换中心】&#xff0c;换取相应奖品&#xff0…...

旋转ReDet目标检测环境配置、旋转ReDet目标检测模型代跑训练、旋转ReDet目标检测模型改进创新旋转ReDet目标检测环境配置:Windows、Ubuntu、Centos、Macos等系统

旋转ReDet目标检测环境配置、 旋转ReDet目标检测模型代跑训练、 旋转ReDet目标检测模型改进创新 旋转ReDet目标检测环境配置&#xff1a;Windows、Ubuntu、Centos、Macos等系统环境&#xff0c;如果电脑拥有显卡&#xff0c;可配置GPU版本的ReDet环境。 旋转ReDet目标检测模型代…...

抖音无水印视频批量下载全攻略:从痛点解决到高效管理

抖音无水印视频批量下载全攻略&#xff1a;从痛点解决到高效管理 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fallback suppor…...

贾子科学定理(Kucius Science Theorem):以“公理驱动”重构科学划界

贾子科学定理&#xff08;Kucius Science Theorem&#xff09;&#xff1a;以“公理驱动”重构科学划界摘要&#xff1a; 贾子科学定理于2026年提出&#xff0c;挑战波普尔“可证伪性”标准&#xff0c;主张科学的客观标尺应为“公理驱动可结构化”。其TMM三层体系确立真理、模…...

Python flask django框架的汽车零件运输管理信息系统设计及实现

目录同行可拿货,招校园代理 ,本人源头供货商功能模块设计技术实现要点高级功能扩展代码示例&#xff08;Flask&#xff09;部署与维护项目技术支持源码获取详细视频演示 &#xff1a;文章底部获取博主联系方式&#xff01;同行可合作同行可拿货,招校园代理 ,本人源头供货商 功…...

SAP项目顾问必看:CJ02/CJ20N用户状态报错全解析(附REL联动设置技巧)

SAP项目顾问进阶指南&#xff1a;CJ02/CJ20N用户状态报错深度解析与REL联动实战 在SAP项目实施过程中&#xff0c;WBS&#xff08;工作分解结构&#xff09;元素的状态管理一直是项目模块顾问的核心工作之一。特别是当项目进入执行阶段&#xff0c;CJ02/CJ20N事务码中频繁出现的…...

LSPatch免Root框架完全指南:3大实用场景与高效上手教程

LSPatch免Root框架完全指南&#xff1a;3大实用场景与高效上手教程 【免费下载链接】LSPatch LSPatch: A non-root Xposed framework extending from LSPosed 项目地址: https://gitcode.com/gh_mirrors/ls/LSPatch LSPatch是一款基于LSPosed框架的非Root实现方案&#…...

新手入门:借助快马平台零代码起步,动手实现首个网络标识分析小工具

作为一个刚接触编程的新手&#xff0c;我最近在InsCode(快马)平台上完成了一个特别有意思的小项目——网络标识符查看器。这个工具虽然简单&#xff0c;但让我第一次完整体验了从构思到实现的开发全流程&#xff0c;特别适合像我这样的初学者练手。今天就把这个过程中的收获和踩…...

用 Laravel AI SDK 构建多智能体工作流

Anthropic 之前发布过一篇广泛传播的文章《Building Effective Agents》&#xff0c;系统总结了构建生产级 AI 系统时最实用的几种模式。这些模式的共同点是&#xff1a;都已经在真实场景中被反复验证&#xff0c;实践性强&#xff0c;而且采用范围很广。对 Laravel 开发者来说…...