GUI:贪吃蛇
![]()
![]()
![]()

![]()
![]()
![]()

以上是准备工作
Data
import javax.swing.*;
import java.net.URL;public class Data {public static URL headerURL=Data.class.getResource("static/header.png");public static ImageIcon header =new ImageIcon(headerURL);public static URL upURL=Data.class.getResource("static/up.png");public static URL downURL=Data.class.getResource("static/down.png");public static URL leftURL=Data.class.getResource("static/left.png");public static URL rightURL=Data.class.getResource("static/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("static/body.png");public static ImageIcon body =new ImageIcon(bodyURL);public static URL foodURL=Data.class.getResource("static/food.png");public static ImageIcon food =new ImageIcon(foodURL);
}
GamePanel
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;//蛇的长度// 蛇的x,y坐标int[]snakeX=new int[600];int[]snakeY=new int[500];String fx;//游戏当前的状态:开始,停止boolean isStart=false;//默认是不开始boolean isFail=false;//游戏结果的状态int score;int foody,foodx;Random random=new Random();//定时器 ms为单位 1000ms=1sTimer timer=new Timer(100,this);//构造器public GamePanel(){init();//获得焦点和键盘事件this.setFocusable(true);this.addKeyListener(this);timer.start();//游戏qidong}public void init(){length=3;snakeX[0]=100;snakeY[0]=100;//脑袋坐标snakeX[1]=75;snakeY[1]=100;//第一个身体的坐标snakeX[2]=50;snakeY[2]=100;//第二个身体的坐标fx="R";//inti向右//随机分布foodfoodx=25+25*random.nextInt(34);foody=75+25*random.nextInt(24);score=0;}@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);//默认的游戏界面//画积分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,foodx,foody);//把小蛇画上去if(fx.equals("R")){Data.right.paintIcon(this,g,snakeX[0],snakeY[0]);//蛇头初始化向右}else if(fx.equals("L")){Data.left.paintIcon(this,g,snakeX[0],snakeY[0]);//蛇头初始化向L}else if(fx.equals("U")){Data.up.paintIcon(this,g,snakeX[0],snakeY[0]);//蛇头初始化向UP}else if(fx.equals("D")){Data.down.paintIcon(this,g,snakeX[0],snakeY[0]);//蛇头初始化向down}for(int i=1;i<length;i++){Data.body.paintIcon(this,g,snakeX[i],snakeY[i] );}//游戏状态if(isStart==false){g.setColor(Color.white);g.setFont(new Font("微软雅黑",Font.BOLD,30));g.drawString("Pressed the Blank Key Begin Game",300,300);}//游戏结束if(isFail){g.setColor(Color.RED);g.setFont(new Font("微软雅黑",Font.BOLD,30));g.drawString("The Game Is Failed",250,300);}}@Overridepublic void keyPressed(KeyEvent e) {int keyCode=e.getKeyCode();//获得键盘参数//空格开始if(keyCode==KeyEvent.VK_SPACE){if(isFail){isFail=false;}else{isStart=!isStart;}repaint();}//小蛇移动if(keyCode==KeyEvent.VK_UP){fx="U";} else if (keyCode==KeyEvent.VK_DOWN) {fx="D";}else if (keyCode==KeyEvent.VK_LEFT) {fx="L";}else if (keyCode==KeyEvent.VK_RIGHT) {fx="R";}//走向if(fx.equals("R")){snakeX[0]=snakeX[0]+25;if(snakeX[0]>850){snakeX[0]=25;}//边界判断}else if(fx.equals("L")){snakeX[0]=snakeX[0]-25;if(snakeX[0]<25){snakeX[0]=850;}//边界判断}else if(fx.equals("U")){snakeY[0]=snakeY[0]-25;if(snakeY[0]<75){snakeY[0]=650;}//边界判断}else if(fx.equals("D")){snakeY[0]=snakeY[0]+25;if(snakeY[0]>650){snakeY[0]=75;}//边界判断}}@Overridepublic void actionPerformed(ActionEvent e) {if(isStart&&isFail==false){for (int i = length-1; i >0 ; i--) {snakeX[i]=snakeX[i-1];snakeY[i]=snakeY[i-1];}if(snakeX[0]==foodx&&snakeY[0]==foody){length++;score+=10;
//重置食物foodx=25+25*random.nextInt(34);foody=75+25*random.nextInt(24);}//头部走向if(fx.equals("R")){snakeX[0] = snakeX[0]+25; //头部右移25个单位(即一格)if(snakeX[0]>850){ //边界判断:如果蛇右移到了边界,则回到左边snakeX[0] = 25;}}else if(fx.equals("L")){snakeX[0] = snakeX[0]-25; //头部左移25个单位(即一格)if(snakeX[0]<25){snakeX[0] = 850;} //边界判断}else if(fx.equals("U")){snakeY[0] = snakeY[0]-25; //向上移动应该是-25if(snakeY[0]<75){snakeY[0] = 650;} //边界判断}else if(fx.equals("D")){snakeY[0] = snakeY[0]+25; //向下移动if(snakeY[0]>650){snakeY[0] = 75;} //边界判断}for (int i = 1; i < length; i++) { //头部与身体的某一节坐标重合,即撞到自己if(snakeX[0] == snakeX[i] && snakeY[0]==snakeY[i]){isFail=true;init();}}repaint();}timer.start();}@Overridepublic void keyReleased(KeyEvent e) {}@Overridepublic void keyTyped(KeyEvent e) {}
}
StartGame
import javax.swing.*;public class StartGame {public static void main(String[] args) {JFrame frame=new JFrame();frame.setBounds(10,10,900,720);//窗口设置大小固定frame.setResizable(false);frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);//正常游戏界面都应该在面上frame.add(new GamePanel());frame.setVisible(true);}
}
相关文章:
GUI:贪吃蛇
以上是准备工作 Data import javax.swing.*; import java.net.URL;public class Data {public static URL headerURLData.class.getResource("static/header.png");public static ImageIcon header new ImageIcon(headerURL);public static URL upURLData.class.getR…...
leaflet:个性化配置,利用Leaflet-Geoman绘制多种图形(136)
第136个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+leaflet中个性化配置,利用Leaflet-Geoman绘制多种图形。 灵活地配置Leaflet-Geoman的属性,可以产生各种美妙的绘图效果。 直接复制下面的 vue+leaflet源代码,操作2分钟即可运行实现效果 文章目录 示例效果配置方…...
【Shell脚本8】Shell printf 命令
Shell printf 命令 printf 命令模仿 C 程序库(library)里的 printf() 程序。 printf 由 POSIX 标准所定义,因此使用 printf 的脚本比使用 echo 移植性好。 printf 使用引用文本或空格分隔的参数,外面可以在 printf 中使用格式化…...
CSAPP第4章:RISC和CISC指令集
RISC和CISC指令集 IA32被称为复杂指令集计算机(CISC),与精简指令集计算机(RISC)相对。 从历史上看,先出现了CISC机器,计算机不断发展使指令集非常大。 RISC设计理念在80年代早期发展,使用更简单的指令集产生高效的代码。 许多加…...
【LeetCode】每日一题 2023_11_9 逃离火灾(bfs 练习)
文章目录 刷题前唠嗑题目:最长平衡子字符串题目描述代码与解题思路偷看大佬题解 结语 刷题前唠嗑 LeetCode? 启动!!! 嗯?什么?今天是 hard?陷入沉思。。。先看看题吧 题目:最长平…...
flink1.18.0 自适应调度器 资源弹性缩放 flink帮你决定并行度
jobmanager.scheduler Elastic Scaling | Apache Flink 配置文件修改并重启flink后,webui上会显示调整并行度的按钮,他可以自己调整,你也可以通过webUI手动调整: 点击 之后: 调整完成后:...
如何设计vue项目的权限管理?
权限管理的重要性及必要性 数据安全:权限管理可以确保只有具有相应权限的用户能够访问和操作特定的数据。这可以保护敏感数据不被未授权的用户访问,从而提高数据的安全性。功能控制:权限管理可以根据用户的角色和权限设置,控制用户…...
HBase学习笔记(2)—— API使用
对HBase中常用的API操作进行简单的介绍 对应HBase学习笔记(1)—— 知识点总结-CSDN博客中介绍的HBase Shell常用操作 更多用法请参考官网:Apache HBase ™ Reference Guide 依赖导入 <dependencies><dependency><groupId>o…...
C/C++轻量级并发TCP服务器框架Zinx-游戏服务器开发004:游戏核心消息处理 - 玩家类的实现
文章目录 0 代码仓库1 需求2 AOI设计2.1 AOI算法简介2.2 AOI数据结构及实现2.2.1 玩家2.2.2 网格对象2.2.3 游戏世界矩形2.2.4 获取周围玩家的实现2.2.5 代码测试 2.3 GameRole结合AOI创建玩家2.3.1 创建游戏世界全局对象-GameRole继承AOIWorld的Player2.3.2 把玩家到游戏世界的…...
Python Selenium元素定位方法详解
引言 在Web自动化测试中,元素定位是一项非常重要的技术。Python Selenium提供了各种元素定位方法,可以帮助我们定位页面上的元素并与之交互。本文将详细介绍Python Selenium中常用的元素定位方法,并提供实例代码。 1. ID定位 ID是元素在HT…...
分布式事务,你了解多少?(上)
本文主要是讲述分布式事务的理论及常用的技术方案,主要源自各类学习和工作总结,如有不妥之处,还望指正。分布式事务的其他基础请自行查阅资料。 一、分布式事务产生的原因 分布式事务的产生,源自互联网、电商等的发展,…...
ClickHouse主键索引最佳实践
在本文中,我们将深入研究ClickHouse索引。我们将对此进行详细说明和讨论: ClickHouse的索引与传统的关系数据库有何不同ClickHouse是怎样构建和使用主键稀疏索引的ClickHouse索引的最佳实践 您可以选择在自己的机器上执行本文给出的所有Clickhouse SQL…...
Flink 基础 -- 应用开发(项目配置)
1、概述 本节中的指南将向您展示如何通过流行的构建工具(Maven, Gradle)配置项目,添加必要的依赖项(即连接器和格式,测试),并涵盖一些高级配置主题。 每个Flink应用程序都依赖于一组Flink库。至少,应用程序依赖于Flink api&…...
空间曲面@常见曲面方程
文章目录 曲面的基本问题特殊曲面球面方程球的标准形方程一般形方程例 柱面柱面方程不同维度下同方程的图形常见柱面方程 旋转曲面旋转曲面的方程旋转情况分类以yOz上的曲线绕 z z z轴旋转为例 旋转曲面的方程常见旋转曲面方程 锥面其他曲面 曲面的基本问题 根据曲面(点的几何…...
unity 接收和发送Udp消息
因为需要用到unity和其他的程序交互,其他程序可以提供Udp消息,因此找了合适的相互连接方法。这里直接上代码。 工具类: using System; using System.Collections; using System.Collections.Generic; using System.IO; using System.Net; u…...
机器学习股票大数据量化分析与预测系统 - python 计算机竞赛
文章目录 0 前言1 课题背景2 实现效果UI界面设计web预测界面RSRS选股界面 3 软件架构4 工具介绍Flask框架MySQL数据库LSTM 5 最后 0 前言 🔥 优质竞赛项目系列,今天要分享的是 🚩 机器学习股票大数据量化分析与预测系统 该项目较为新颖&am…...
架构描述语言(ADL)
1.架构描述语言(ADL) 架构描述语言(Architecture Description Language, ADL)是一种为明确说明软件系统的概念架构和对这些概念架构建模提供功能的语言。 2.ADL基本构成要素 ADL即架构描述语言,其基本构成要素包括:…...
GZ038 物联网应用开发赛题第2套
2023年全国职业院校技能大赛 高职组 物联网应用开发 任 务 书 (第2套卷) 工位号:______________ 第一部分 竞赛须知 一、竞赛要求 1、正确使用工具,操作安全规范; 2、竞赛过程中如有异议,可向现场考评人员反映,不得扰乱赛场秩序; 3、遵守赛场纪律,尊重考评人员,…...
Go 接口:Go中最强大的魔法,接口应用模式或惯例介绍
Go 接口:Go中最强大的魔法,接口应用模式或惯例介绍 文章目录 Go 接口:Go中最强大的魔法,接口应用模式或惯例介绍一、前置原则二、一切皆组合2.1 一切皆组合2.2 垂直组合2.2.1 第一种:通过嵌入接口构建接口2.2.2 第二种:通过嵌入接…...
Vue3全局共享数据
目录 1,Vuex2,provide & inject2,global state4,Pinia5,对比 1,Vuex vue2 的官方状态管理器,vue3 也是可以用的,需要使用 4.x 版本。 相对于 vuex3.x,有两个重要变…...
后进先出(LIFO)详解
LIFO 是 Last In, First Out 的缩写,中文译为后进先出。这是一种数据结构的工作原则,类似于一摞盘子或一叠书本: 最后放进去的元素最先出来 -想象往筒状容器里放盘子: (1)你放进的最后一个盘子(…...
逻辑回归:给不确定性划界的分类大师
想象你是一名医生。面对患者的检查报告(肿瘤大小、血液指标),你需要做出一个**决定性判断**:恶性还是良性?这种“非黑即白”的抉择,正是**逻辑回归(Logistic Regression)** 的战场&a…...
大型活动交通拥堵治理的视觉算法应用
大型活动下智慧交通的视觉分析应用 一、背景与挑战 大型活动(如演唱会、马拉松赛事、高考中考等)期间,城市交通面临瞬时人流车流激增、传统摄像头模糊、交通拥堵识别滞后等问题。以演唱会为例,暖城商圈曾因观众集中离场导致周边…...
无法与IP建立连接,未能下载VSCode服务器
如题,在远程连接服务器的时候突然遇到了这个提示。 查阅了一圈,发现是VSCode版本自动更新惹的祸!!! 在VSCode的帮助->关于这里发现前几天VSCode自动更新了,我的版本号变成了1.100.3 才导致了远程连接出…...
屋顶变身“发电站” ,中天合创屋面分布式光伏发电项目顺利并网!
5月28日,中天合创屋面分布式光伏发电项目顺利并网发电,该项目位于内蒙古自治区鄂尔多斯市乌审旗,项目利用中天合创聚乙烯、聚丙烯仓库屋面作为场地建设光伏电站,总装机容量为9.96MWp。 项目投运后,每年可节约标煤3670…...
MODBUS TCP转CANopen 技术赋能高效协同作业
在现代工业自动化领域,MODBUS TCP和CANopen两种通讯协议因其稳定性和高效性被广泛应用于各种设备和系统中。而随着科技的不断进步,这两种通讯协议也正在被逐步融合,形成了一种新型的通讯方式——开疆智能MODBUS TCP转CANopen网关KJ-TCPC-CANP…...
python爬虫:Newspaper3k 的详细使用(好用的新闻网站文章抓取和解析的Python库)
更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、Newspaper3k 概述1.1 Newspaper3k 介绍1.2 主要功能1.3 典型应用场景1.4 安装二、基本用法2.2 提取单篇文章的内容2.2 处理多篇文档三、高级选项3.1 自定义配置3.2 分析文章情感四、实战案例4.1 构建新闻摘要聚合器…...
微服务商城-商品微服务
数据表 CREATE TABLE product (id bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 商品id,cateid smallint(6) UNSIGNED NOT NULL DEFAULT 0 COMMENT 类别Id,name varchar(100) NOT NULL DEFAULT COMMENT 商品名称,subtitle varchar(200) NOT NULL DEFAULT COMMENT 商…...
技术栈RabbitMq的介绍和使用
目录 1. 什么是消息队列?2. 消息队列的优点3. RabbitMQ 消息队列概述4. RabbitMQ 安装5. Exchange 四种类型5.1 direct 精准匹配5.2 fanout 广播5.3 topic 正则匹配 6. RabbitMQ 队列模式6.1 简单队列模式6.2 工作队列模式6.3 发布/订阅模式6.4 路由模式6.5 主题模式…...
视频行为标注工具BehaviLabel(源码+使用介绍+Windows.Exe版本)
前言: 最近在做行为检测相关的模型,用的是时空图卷积网络(STGCN),但原有kinetic-400数据集数据质量较低,需要进行细粒度的标注,同时粗略搜了下已有开源工具基本都集中于图像分割这块,…...
