键盘控制小蛇移动

/*** @Description 键盘控制小蛇移动*/
package com.ai.snake;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);}
}/*** Ctrl+Tab 或 Alt+左右方向键     切换正在编辑窗口*/
/*** @Description 键盘控制小蛇移动*/
package com.ai.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;//游戏的面板
public class GamePanel extends JPanel implements KeyListener, ActionListener {//定义蛇的数据结构int length; //蛇的长度int[] snakeX = new int[600];    //蛇的 x 坐标 25*25int[] snakeY = new int[500];    //蛇的 Y 坐标 25*25String direction; //初始方向//游戏当前的状态:  开始,停止boolean isStart = false;    //默认是不开始!//定时器   以 ms 为单位 1000ms = 1sTimer timer = new Timer(100,this);  //100毫秒执行一次!//构造器public GamePanel() {init();//获得焦点和键盘事件this.setFocusable(true);    //获得焦点事件this.addKeyListener(this);  //获得键盘监听事件timer.start();  //游戏一开始定时器就启动}//初始化方法public void init(){length = 3;snakeX[0] = 100;    snakeY[0] = 100;    //脑袋的坐标snakeX[1] = 75;    snakeY[1] = 100;    //第一个身体的坐标snakeX[2] = 50;    snakeY[2] = 100;    //第二个身体的坐标direction ="R"; //初始方向向右}//绘制面板,我们游戏中的所有东西,都是用这个画笔来画@Overrideprotected void paintComponent(Graphics g){super.paintComponent(g);    //清屏//绘制静态的面板this.setBackground(Color.WHITE);Data.header.paintIcon(this,g,15,5);    //头部广告栏画上去g.fillRect(15,60,850,600);  //默认的游戏界面//把小蛇画上去if(direction.equals("R")){Data.right.paintIcon(this,g,snakeX[0],snakeY[0]);   //蛇头初始化向右,需要通过方向来判断}else if(direction.equals("L")){Data.left.paintIcon(this,g,snakeX[0],snakeY[0]);   //蛇头初始化向右,需要通过方向来判断}else if(direction.equals("U")){Data.up.paintIcon(this,g,snakeX[0],snakeY[0]);   //蛇头初始化向右,需要通过方向来判断}else if(direction.equals("D")){Data.down.paintIcon(this,g,snakeX[0],snakeY[0]);   //蛇头初始化向右,需要通过方向来判断}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,40));  //设置字体g.drawString("按下空格开始游戏",300,300);}}//键盘监听事件@Overridepublic void keyPressed(KeyEvent e) {int keyCode = e.getKeyCode();   //获得键盘按键是哪一个if (keyCode == KeyEvent.VK_ENTER);{     //如果按下的是空格键isStart = !isStart;     //取反repaint();}//小蛇移动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";}}//事件监听---需要通过固定事件来刷新,1s=10次@Overridepublic void actionPerformed(ActionEvent e) {if (isStart) {  //如果游戏是开始状态,就让小蛇动起来!//移动for (int i = length-1; i > 0; i--) {    //后一节移到前一节的位置   snakeX[1] = snakeX[0];snakeX[i] = snakeX[i-1];snakeY[i] = snakeY[i-1];}//走向if(direction.equals("R")){snakeX[0] = snakeX[0] + 25;if(snakeX[0]>850){snakeX[0] =25;}   //边界判断}else if (direction.equals("L")){snakeX[0] = snakeX[0] - 25;if(snakeX[0]<15){snakeX[0] =850;}   //边界判断}else if (direction.equals("U")){snakeY[0] = snakeY[0] - 25;if(snakeY[0]<55){snakeY[0] =630;}   //边界判断}else if (direction.equals("D")){snakeY[0] = snakeY[0] + 25;if(snakeY[0]>650){snakeY[0] =60;}   //边界判断}repaint();  //重画页面}timer.start();  //定时器开启}@Overridepublic void keyReleased(KeyEvent e) {}@Overridepublic void keyTyped(KeyEvent e) {}}
/*** @Description 键盘控制小蛇移动*/
package com.ai.snake;import javax.swing.*;
import java.net.URL;//数据中心
public class Data {//相对路径  tx.jpg//绝对路径  /   相当于当前的项目private static URL headerURL = Data.class.getResource("statics/header.jpg");public static ImageIcon header = new ImageIcon(headerURL);public static URL upURL = Data.class.getResource("statics/up.jpg");public static URL downURL = Data.class.getResource("statics/down.jpg");public static URL leftURL = Data.class.getResource("statics/left.jpg");public static URL rightURL = Data.class.getResource("statics/right.jpg");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.jpg");public static ImageIcon body = new ImageIcon(bodyURL);public static URL foodURL = Data.class.getResource("statics/food.jpg");public static ImageIcon food = new ImageIcon(foodURL);}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/12829.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Termius mac:一站式跨平台终端工具

Termius mac 8.4是一款远程访问和管理工具&#xff0c;旨在帮助用户轻松地远程连接到各种服务器和设备。它适用于多种操作系统&#xff0c;包括Windows、macOS、Linux和移动设备。 该软件提供了一个直观的界面&#xff0c;使用户可以通过SSH、Telnet和Mosh等协议连接到远程设备…

Linux 通过关键字查找文件

按文件名查找 find 路径 -name “文件名” 查找当前目录下的所有mk文件 find . -name "*.mk"按关键字查找 find 路径 -name “文件名” | xargs grep -n “关键字” 参数&#xff1a; xargs 是给命令传递参数的一个过滤器&#xff0c;也是组合多个命令的一个工具 -n…

【挑战全网】最全高德地图充电桩接入指南,流量必火!

分享《一套免费开源充电桩物联网系统&#xff0c;是可以立马拿去商用的&#xff01;》 一、和高德直接互联互通的优势&#xff1a; 1、高德官方直接互联互通&#xff0c;提供给合作商户独立发展自主权&#xff0c;不依赖任何第三方平台; 2、自己控制电站的上线、下线、修改电…

Redis教程(八):Redis中zSet类型的常用命令

zSet操作&#xff1a; 往zSet有序集合中添加数据&#xff0c;1&#xff0c;2&#xff0c;3代表权重&#xff0c;one&#xff0c;two&#xff0c;three代表数据 zadd myzset 1 one 2 two 3 three 查询zSet中所有的值&#xff0c;第一个参数为0代表从小到大排序&#xff0c;为…

MemoryModule - 应用编程细节

文章目录 MemoryModule - 应用编程细节概述笔记实验环境升级MemoryModule&#xff0c;在上下文中加入DLL在内存载入前的信息MemoryModule.hMemoryModule.cpp实现接口MemoryGetPayload() 整理 - 在内存载入的DLL中&#xff0c;取得资源表中的信息&#xff0c;取得载入前的DLL内容…

从0开始理解云原生架构

一、云原生发展历史 云原生概念最早起源于2013年&#xff0c;由 Matt Stine 首次提出“Cloud Native”这一术语&#xff0c;这个概念强调了应用需要充分利用云的优势&#xff0c;如弹性、可扩展性和服务化。2015年&#xff0c;Matt Stine出版了《迁移到云原生架构》一书&am…

ChatGPT官网5月14日凌晨1点发布会推出最新GPT4o大模型,贾维斯时刻要来了?

就在今天北京时间2024年5月14日凌晨1点中&#xff0c;OpenAI进行了发布会&#xff0c;这次发布会的内容炸裂&#xff0c;一起来看下吧&#xff01; GPT4o多模态大模型发布 首先公开的是GPT4o多模态大模型的发布&#xff0c;相较于GPT-4turbo速度更快&#xff0c;更便宜。我刚开…

水离子雾化壁炉与会所的氛围搭配

水离子雾化壁炉在会所的氛围搭配可以营造出舒适、现代和高雅的氛围&#xff0c;以下是一些搭配建议&#xff1a; 豪华会所装饰&#xff1a; 将水离子雾化壁炉作为会所豪华装饰的一部分&#xff0c;放置在会所的核心区域或休息区域。选择适合会所风格的壁炉款式&#xff0c;如…

echarts的柱状图使用

1. 柱状图&#xff08;柱体顶部使用外部图片 相关代码 <template><div class"out-bg"><div class"container" ref"warnChartRef"></div></div> </template><script> import * as echarts from echar…

短视频矩阵系统/源码----可视化剪辑技术独家开发

现阶段市面上大多矩阵软件都非常程序化且需要使用者具有较强的逻辑思维能力或剪辑经验&#xff0c;这使得一些个人、团队、企业在使用时无形中增加了学习成本&#xff0c;剪辑出来的效果大多不尽如人意&#xff0c;发出来的视频没有流量&#xff0c;根本达不到预期效果。 如何提…

绘制奇迹:Processing中的动态图形与动画

&#x1f680; 欢迎回到Processing的世界&#xff0c;你的艺术编程航程刚刚开始。在我们的入门篇中&#xff0c;你已经学会了如何用Processing绘制基本的静态图形。现在&#xff0c;让我们一起探索Processing强大的动态图形和动画功能&#xff0c;释放你的创造力&#xff0c;走…

59.基于SSM实现的网上花店系统(项目 + 论文)

项目介绍 本站是一个B/S模式系统&#xff0c;网上花店是在MySQL中建立数据表保存信息&#xff0c;运用SSMVue框架和Java语言编写。并按照软件设计开发流程进行设计实现充分保证系统的稳定性。系统具有界面清晰、操作简单&#xff0c;功能齐全的特点&#xff0c;使得基于SSM的网…

微信小程序的Vant Weapp组件库 与 weui组件库 的区别?

微信小程序中的Vant Weapp组件库和WeUI组件库是不一样的。虽然它们都提供了丰富的组件和样式&#xff0c;用于帮助开发者快速构建出具有现代感和一致性的小程序界面&#xff0c;但它们在来源、设计理念和组件构成上有所不同。 一、Vant Weapp组件库 &#xff08;1&#xff09…

GSCoolink GSV6125 替LT6711A HDMI2.0转Type-C/DP1.4

GSCoolink GSV6125 在 Type C/Dp monitor&#xff0c;线材&#xff0c;VR/AR&#xff0c;系统均有大量的应用机会&#xff0c;且目前只有龙迅LT6711A 竞争对手。 Gscoolink GSV6125是一款高性能、低功耗的HDMI 2.0转Type-C/DP1.4转换器。通过集成增强型微控制器&#xff0c;GS…

运营商二次放号查询接口如何对接

运营商二次放号查询接口又叫手机二次放号检测接口&#xff0c;指的是输入手机号和日期&#xff0c;查看在该日期之前是不是二次放号。那么运营商二次放号查询接口如何对接呢&#xff1f; 这边我找到了一家叫数脉API的公司&#xff0c;他们刚好有这个接口&#xff0c;首先注册账…

python判断成绩是否优秀

def evaluate_grade(score): if not isinstance(score, (int, float)): raise ValueError("输入的成绩必须是整数或浮点数") if score < 0 or score > 100: raise ValueError("输入的成绩必须在0到100之间") if score > 90: return "优…

react组件渲染性能优化之函数组件-useMemo使用

useMemo的主要作用就是缓存值的&#xff0c;某些时候&#xff0c;组件中某些值需要根据状态进行一个二次计算&#xff08;类似于 Vue 中的计算属性&#xff09;&#xff0c;由于函数组件一旦重新渲染&#xff0c;就会重新执行整个函数&#xff0c;这就导致之前的二次计算也会重…

CSS的基础语法和常见的语法简单归纳

CSS CSS 是层叠样式表&#xff08;Cascading Style Sheets&#xff09;的缩写。它是一种用来控制网页样式和布局的标记语言。通过 CSS&#xff0c;可以定义网页中的元素&#xff08;如文字、图像、链接等&#xff09;的外观和排版方式&#xff0c;包括字体、颜色、大小、间距、…

通义千问接口

接口文档 请求 import random from http import HTTPStatus from dashscope import Generation # 建议dashscope SDK 的版本 > 1.14.0def call_with_messages():messages [{role: system, content: You are a helpful assistant.},{role: user, content: 如何做西红柿炒…

产品推荐 | 基于 AMD Alveo V80 数据中心的FPGA加速器卡

1、产品概述 Alveo V80 卡采用强大的 AMD Versal™ XCV80 HBM 系列自适应 SoC&#xff0c;将高带宽存储器 (HBM2e) 和 800 Gb/s 高速网络封装到全高、 长外形尺寸的双插槽卡中&#xff0c;专为在本地服务器或云中部署而设计。 V80 加速器经过优化&#xff0c;可通过 AMD Vers…