【GUI】-- 14 GUI编程总结

GUI编程

05 GUI总结

在总结之前,先给出之前的贪吃蛇小游戏全代码。

  • 游戏的主启动类:
package com.duo.snake;import javax.swing.*;//游戏的主启动类
public class StartGame {public static void main(String[] args) {JFrame frame = new JFrame();frame.add(new GamePanel());  //此行代码的位置会影响后续按下空格时游戏的反应(Tab键问题)!!!frame.setVisible(true);frame.setResizable(false);frame.setTitle("贪吃蛇-2023");frame.setBounds(5, 10, 915, 740);frame.setLocationRelativeTo(null);frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);}
}
  • GamePanel类:
package com.duo.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坐标 25*25int[] snakeY = new int[500];  //蛇的Y坐标 25*25String direction;  //蛇头方向boolean isStart = false;  //默认未开始游戏boolean isFail = false;  //游戏失败状态Timer timer = new Timer(100, this);  //定时器,100ms执行一次//食物的坐标int foodX;int foodY;Random random = new Random();//积分面板数据结构int score;//构造器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";  //蛇头初始向右//将食物随机分布于游戏界面foodX = 25 + 25 * random.nextInt(34);foodY = 75 + 25 * random.nextInt(24);score = 0;  //定义初始得分}//绘制静态面板@Overrideprotected void paintComponent(Graphics g) {super.paintComponent(g);  //起到清屏的作用Data.header.paintIcon(this, g, 25, 11);  //将广告栏画入面板g.fillRect(25, 75, 850, 600);  //默认的游戏界面(黑色区域)this.setBackground(Color.white);//画出积分面板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);//将小蛇(头)画入面板中的游戏区域,且蛇头部分需要判断方向switch (direction) {case "R":Data.right.paintIcon(this, g, snakeX[0], snakeY[0]);break;case "L":Data.left.paintIcon(this, g, snakeX[0], snakeY[0]);break;case "U":Data.up.paintIcon(this, g, snakeX[0], snakeY[0]);break;case "D":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("按下空格开始游戏", 270, 300);}if (isFail) {g.setColor(Color.red);g.setFont(new Font("宋体", Font.BOLD, 40));g.drawString("游戏失败,按下空格重新开始", 220, 300);}}//键盘监听事件@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("D")) {direction = "U";} else if (keyCode == KeyEvent.VK_DOWN && !direction.equals("U")) {direction = "D";} else if (keyCode == KeyEvent.VK_LEFT && !direction.equals("R")) {direction = "L";} else if (keyCode == KeyEvent.VK_RIGHT && !direction.equals("L")) {direction = "R";}}//事件监听需要定时器来实现,即通过固定的时间进行刷新(例如1s=10次)@Overridepublic void actionPerformed(ActionEvent e) {if (isStart && !isFail) {//小蛇身体右移for (int i = length - 1; i > 0; i--) {  //后一节身体移动至前一节 snakeX[1] = snakeX[0]snakeX[i] = snakeX[i - 1];snakeY[i] = snakeY[i - 1];}//判断蛇头是否吃到食物if (snakeX[0] == foodX && snakeY[0] == foodY) {length++;foodX = 25 + 25 * random.nextInt(34);foodY = 75 + 25 * random.nextInt(24);score += 10;}//判断蛇头走向switch (direction) {case "R":snakeX[0] += 25;//边界判断if (snakeX[0] > 850) {snakeX[0] = 25;}break;case "L":snakeX[0] -= 25;//边界判断if (snakeX[0] < 25) {snakeX[0] = 850;}break;case "U":snakeY[0] -= 25;//边界判断if (snakeY[0] < 75) {snakeY[0] = 650;}break;case "D":snakeY[0] += 25;//边界判断if (snakeY[0] > 650) {snakeY[0] = 75;}break;}//游戏失败判定for (int i = 1; i < length; i++) {if (snakeX[0] == snakeX[i] && snakeY[0] == snakeY[i]) {isFail = true;break;}}repaint();}timer.start();}@Overridepublic void keyReleased(KeyEvent e) {}@Overridepublic void keyTyped(KeyEvent e) {}
}

游戏的数据中心类:

package com.duo.snake;import javax.swing.*;
import java.net.URL;//数据中心
public class Data {//相对路径  tx.jpg//绝对路径  /:相当于当前的项目public static URL headerURL = Data.class.getResource("static/header.png");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 URL bodyURL = Data.class.getResource("static/body.png");public static URL foodURL = Data.class.getResource("static/food.png");public static ImageIcon header = new ImageIcon(headerURL);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 ImageIcon food = new ImageIcon(foodURL);}

游戏运行结果已于前节展示,可实现小蛇移动、吃到食物长大并且分数增加、失败判定等操作。下面将对此阶段GUI编程作一简单总结。

GUI编程:

  • AWT
    1. 组件
    2. 容器
    3. 面板
    4. 事件监听
    5. 文本框监听
    6. 画图类paint(g)
    7. 鼠标/窗口/键盘监听器
  • Swing
    1. 容器
    2. 面板(可带有滚动条)
    3. label
      • 普通标签
      • 图片标签
      • 图像标签
    4. 按钮
      • 普通按钮
      • 图片按钮
      • 单选框按钮
      • 多选框按钮
    5. 列表
      • 下拉框
      • 列表框
    6. 文本框
      • 普通文本框
      • 密码框
      • 文本域
  • 贪吃蛇小游戏

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

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

相关文章

Java面试-微服务篇-SpringCloud

Java面试-微服务篇-SpringCloud SpringCloud 常见组件注册中心Eureka, Nacos负载均衡Ribbon服务雪崩, 熔断降级微服务的监控来源 SpringCloud 常见组件 通常情况下 Eureka: 注册中心Ribbon: 负载均衡Feign: 远程调用Hystrix: 服务熔断Zuul/Gateway: 网关 SpringCloudAlibaba…

【开源】基于Vue.js的天然气工程运维系统的设计和实现

项目编号&#xff1a; S 022 &#xff0c;文末获取源码。 \color{red}{项目编号&#xff1a;S022&#xff0c;文末获取源码。} 项目编号&#xff1a;S022&#xff0c;文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 系统角色分类2.2 核心功能2.2.1 流程…

服务限流算法:从令人头疼到信手拈来

前言 随着系统规模的扩大和用户量的增加&#xff0c;服务限流成为了一个非常重要的话题。一方面&#xff0c;系统需要能够处理大量的请求&#xff0c;不至于因为负载过高而崩溃&#xff1b;另一方面&#xff0c;又需要避免恶意攻击或者其他异常情况对系统造成影响。本文将介绍…

npm相关和私有云

安装node时npm会自动安装&#xff0c;npm也可以单独安装。 package.json 在使用npm时&#xff0c;package.json文件是非常重要的&#xff0c;因为它包含了关于项目的必要信息&#xff0c;比如名称、版本、依赖项等。在初始化新项目时&#xff0c;通常会使用npm init命令生成一…

pip安装python包到指定python版本下

python -m pip install 包名1.命令行进入到指定python安装目录。比如我电脑上有python3.8也有python3.9。准备给python3.9安装指定的包

【青书学堂】 2023年第二学期 HTML5+CSS3(直播课) 作业

【青书学堂】 2023年第二学期 HTML5CSS3(直播课) 作业 为了方便日后复习&#xff0c;青书学堂成人大专试题整理。 若有未整理的课程&#xff0c;请私信我补充&#xff0c;欢迎爱学习的同学们收藏点赞关注&#xff01;文章内容仅限学习使用&#xff01;&#xff01;&#xff01;…

3.OpenFeign的使用

OpenFeign 文章目录 OpenFeign一. 什么是OpenFeign二. OpenFeign基础使用1.添加依赖2.配置Nacos配置信息3.在项目中开启OpenFeign4.编写OpenFeign调用代码5.调用OpenFeign接口 三. OpenFeign内置的超时重试机制1.配置超时重试2.覆盖Retryer对象 四.自定义超时重试机制1.自定义超…

Hive中常出现的错误(不定时更新)

1.加载数据失败 hive> load data local inpath /home/user/hive.txt into table studentl> ; FAILED: SemanticException [Error 10001]: Line 1:56 Table not found studentl hive> load data local inpath /home/user/hive.txt into table student; Loading data to…

技术分享| anyRTC之RTN网络

RTN(Real-time Network)中文名&#xff1a;实时音视频传输网络。 RTN是最近几年由各大RTC的云厂商提出的一个全新架构的音视频实时传输网络概念。类似于直播的CDN网络&#xff0c;RTN是对音视频的实时性又强烈要求的场景而设计的&#xff0c;原理上全球端到端的时延通过RTN网络…

JSP EL表达式获取list/Map集合与java Bean对象

上文 JSP EL表达式基本使用 中 我们对EL表达式做了一个基本的了解 也做了基础的字符串数据使用 那么 我们可以来看一下我们的集合 首先 list 这个比较简单 我们直接这样写代码 <% page import"java.util.ArrayList" %> <% page import"java.util.Lis…

基于C#实现优先队列

一、堆结构 1.1性质 堆是一种很松散的序结构树&#xff0c;只保存了父节点和孩子节点的大小关系&#xff0c;并不规定左右孩子的大小&#xff0c;不像排序树那样严格&#xff0c;又因为堆是一种完全二叉树&#xff0c;设节点为 i,则 i/2 是 i 的父节点&#xff0c;2i 是 i 的…

安卓开发之HTTP API服务接口设计(基于okhttp3请求)

安卓中的请求 OkHttp3 是一个开源的 Java/Android HTTP 客户端库,由 Square 公司开发。它提供了简洁和高效 的 API ,用于进行 HTTP 请求、处理响应以及与服务器进行通信。 以下是 OkHttp3 的一些主要特点和功能: 简单易用: OkHttp3 提供了简洁的 API ,使得发送 HTTP 请求变…

信息系统的安全保护等级的五个级别

信息系统的安全保护等级分为五级&#xff1a;第一级为自主保护级、第二级为指导保护级、第三级为监督保护级、第四级为强制保护级、第五级为专控保护级。 法律依据&#xff1a;《信息安全等级保护管理办法》第四条 信息系统的安全保护等级分为以下五级&#xff1a;   &#…

【C语言】计算实时太阳角度(高度角、方位角),以及使用stm32单片机实时获取时间戳

整体计算方法 在编写该代码的过程中寻找了多篇博文和论文&#xff0c;综合所有文章且按网上的以0时的方位角的0&#xff0c;且随时间累加累加至360度。我修改了博文和论文的一些角度的计算方法。得到一下代码与网站计算的方位角相互验证过&#xff0c;误差不超过1 验证网站 太…

LoRaWAN 中国地区文件详细解读

目录 一、LoRaWAN简介 二、CN470-510地区参数分析 1.信道频率 2.支持功率 3.支持空速 4.最大负载大小 5.接受窗口参数 三、CN470_510默认参数 Lora LoraWAN教程 一、LoRaWAN简介 LoraWAN是一种基于LoRa远距离通信技术配套设计的一套通讯协议和系统架构。LoRaWAN网络通…

Java实现拼图游戏

1、了解拼图游戏基本功能&#xff1a; 拼图游戏内容由若干小图像块组成的&#xff0c;通过鼠标点击图像块上下左右移动&#xff0c;完成图像的拼凑。 2、拼图游戏交互界面设计与开发&#xff1a; 通过创建窗体类、菜单、中间面板和左右面板完成设计拼图的交互界面 &#xff…

外贸自建站服务器怎么选?网站搭建的工具?

外贸自建站服务器用哪个好&#xff1f;如何选海洋建站的服务器&#xff1f; 外贸自建站是企业拓展海外市场的重要手段之一。而在这个过程中&#xff0c;选择一个适合的服务器对于网站的稳定运行和优化至关重要。海洋建站将为您介绍如何选择适合的外贸自建站服务器。 外贸自建…

CSDN如何完整转载别人的文章并做自己的笔记

1、这篇文章介绍主体的转载&#xff08;粘贴&#xff09;方法&#xff1a; 转载&#xff1a;CSDN快速转载文章方法&#xff08;简单&#xff09;_csdn转载_biggolden1的博客-CSDN博客 2、这篇文章解决&#xff0c;对于含有代码块的文章粘贴后&#xff0c;出现的额外行号块问题…

【STM32外设系列】GPS定位模块(ATGM336H)

&#x1f380; 文章作者&#xff1a;二土电子 &#x1f338; 关注公众号获取更多资料&#xff01; &#x1f438; 期待大家一起学习交流&#xff01; 文章目录 一、GPS模块简介二、使用方法2.1 引脚介绍2.2 数据帧介绍2.3 关于不同的启动方式 三、前置知识3.1 strstr函数3.2…