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

自学Java-AI结合GUI开发一个石头迷阵的游戏

自学Java-AI结合GUI开发一个石头迷阵的游戏

  • 准备环节
  • 1、创建石头迷阵的界面
  • 2、打乱顺序
  • 3、控制上下左右移动
  • 4、判断是否通关
  • 5、统计移动步骤,重启游戏
  • 6、拓展问题

准备环节

在这里插入图片描述
技术:
1、GUI界面编程
2、二维数组
3、程序流程控制
4、面向对象编程

∙ \bullet 创建一个模块用于开发石头迷阵游戏,模块名称取名为:stone-maze
∙ \bullet 导入项目需要的资源包到src目录下:主要是一些图片文件,在image文件夹下
∙ \bullet 创建项目包:com.itheima.

1、创建石头迷阵的界面

∙ \bullet 定义主界面类,MainFrame继承JFrame
∙ \bullet 初始化窗口大小
∙ \bullet 初始化界面图片
∙ \bullet 初始化界面菜单:系统退出,重启游戏

完成代码如下:

package com.itheima;import javax.swing.*;
// 自定义窗口类,创建对象,展示一个主窗口。
public class MainFrame extends JFrame {// 设置图片位置private static final String imagePath = "stone-maze/src/image/";// 准备一个数组,用户存储数字色块的行列位置:4行4列private int[][] imageData = {{1, 2, 3, 4},{5, 6, 7, 8},{9, 10, 11, 12},{13, 14, 15, 0}};public MainFrame() {// 1、调用一个初始化方法:初始化窗口大小等信息。initFrame();// 2、初始化界面:展示数字色块。initImage();// 3、初始化系统菜单:点击弹出菜单信息是系统退出,重启游戏。initMenu();// 设置窗口可见this.setVisible(true);}private void initMenu() {JMenuBar menuBar = new JMenuBar(); // 创建一个菜单栏JMenu menu = new JMenu("系统");JMenuItem exitJi = new JMenuItem("退出");menu.add(exitJi); // 添加子菜单exitJi.addActionListener(e -> { // 添加点击事件// 退出游戏dispose();});JMenuItem restartJi = new JMenuItem("重启");menu.add(restartJi);restartJi.addActionListener(e -> { // 添加点击事件// 重启游戏});menuBar.add(menu); // 添加到菜单栏中this.setJMenuBar(menuBar);}private void initImage() {// 1、展示一个行列矩阵的图片色块依次铺满窗口(4 * 4)for (int i = 0; i < imageData.length; i++) { // 遍历行for (int j = 0; j < imageData[i].length; j++) { // 遍历列// 拿到图片的名称String imageName = imageData[i][j] + ".png";// 2、创建一个JLabel对象,设置图片给他展示。JLabel label = new JLabel();// 3、设置图片到label对象中去。label.setIcon(new ImageIcon(imagePath + imageName));// 4、设置数字色块的位置label.setBounds(25 + j * 100, 60 + i * 100, 100, 100);// 5、把这个图片展示到窗口中this.add(label);}}// 设置窗口的背景图片JLabel background = new JLabel(new ImageIcon(imagePath + "background.png"));background.setBounds(0, 0, 450, 484);this.add(background);}private void initFrame() {// 设置窗口标题this.setTitle("石子迷宫 V 1.0");// 设置窗口大小this.setSize(465, 575);// 设置窗口关闭方式this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);// 设置窗口的居中显示this.setLocationRelativeTo(null);// 设置布局方式为绝对位置定位this.setLayout(null);}
}

2、打乱顺序

∙ \bullet 打乱界面的图片顺序,让游戏具备可玩性:使用方法如下

打乱二维数组中的元素顺序:initRandomArray();

完成代码如下:

private void initRandomArray() {// 1、打乱数组for (int i = 0; i < imageData.length; i++) { // 遍历行for (int j = 0; j < imageData[i].length; j++) { // 遍历列// 随机两个行列位置,让这两个位置交换。int i1 = (int)(Math.random() * imageData.length);int j1 = (int)(Math.random() * imageData.length);int i2 = (int)(Math.random() * imageData.length);int j2 = (int)(Math.random() * imageData.length);int temp = imageData[i1][j1];imageData[i1][j1] = imageData[i2][j2];imageData[i2][j2] = temp;}}}

3、控制上下左右移动

∙ \bullet 给窗口绑定上下左右按键事件

∙ \bullet 控制位置的交换
–定位当前空白色块的位置。
–根据用户点击的方位确定交换哪个数据,到数组中交换。

∙ \bullet 重新绘制主界面的内容
–让主界面按照二维数组的最新内容刷新界面

public enum Direction {UP, DOWN, LEFT, RIGHT;
}

完成代码如下:

package com.itheima;import javax.swing.*;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;// 自定义窗口类,创建对象,展示一个主窗口。
public class MainFrame extends JFrame {// 设置图片位置private static final String imagePath = "stone-maze/src/image/";// 准备一个数组,用户存储数字色块的行列位置:4行4列private int[][] imageData = {{1, 2, 3, 4},{5, 6, 7, 8},{9, 10, 11, 12},{13, 14, 15, 0}};// 定义两个整数变量记录当前空白色块的位置。private int row; // 当前空白色块的行位置private int col; // 当前空白色块的列位置public MainFrame() {// 1、调用一个初始化方法:初始化窗口大小等信息。initFrame();// 4、打乱数组色块的顺序,再提示图片initRandomArray();// 2、初始化界面:展示数字色块。initImage();// 3、初始化系统菜单:点击弹出菜单信息是系统退出,重启游戏。initMenu();// 5、给当前窗口绑定上下左右按键事件。initKeyPressEvent();// 设置窗口可见this.setVisible(true);}private void initKeyPressEvent() {// 给当前窗口绑定上下左右按键事件。this.addKeyListener(new KeyAdapter() {@Overridepublic void keyPressed(KeyEvent e) {// 判断当前按键的编号int keyCode = e.getKeyCode();// 判断按键编号,上下左右switch (keyCode) {case KeyEvent.VK_UP:switchAndMove(Direction.UP);// 用户按下上键,把图片上移。break;case KeyEvent.VK_DOWN:switchAndMove(Direction.DOWN);// 用户按下下键,把图片下移。break;case KeyEvent.VK_LEFT:switchAndMove(Direction.LEFT);// 用户按下左键,把图片左移。break;case KeyEvent.VK_RIGHT:switchAndMove(Direction.RIGHT);// 用户按下右键,把图片右移。break;}}});}// 控制数据交换和图片移动private void switchAndMove(Direction r) {// 判断图片的方向,再控制图片移动。switch (r) {case UP:// 上交换的条件是行必须 < 3,然后才开始交换。if (row < imageData.length - 1) {// 当前空白色块位置:rol  col// 需要被交换的位置:row + 1  colint temp = imageData[row][col];imageData[row][col] = imageData[row + 1][col];imageData[row + 1][col] = temp;// 更新当前空白色块的位置。row++;}break;case DOWN:if (row > 0) {// 当前空白色块位置:row  col// 需要被交换的位置:row - 1  colint temp = imageData[row][col];imageData[row][col] = imageData[row - 1][col];imageData[row - 1][col] = temp;// 更新当前空白色块的位置。row--;}break;case LEFT:// 左交换的条件是列必须 < 3,然后才开始交换。if (col < imageData.length - 1) {// 当前空白色块位置:row  col// 需要被交换的位置:row  col + 1int temp = imageData[row][col];imageData[row][col] = imageData[row][col + 1];imageData[row][col + 1] = temp;// 更新当前空白色块的位置。col++;}break;case RIGHT:if (col > 0) {int temp = imageData[row][col];imageData[row][col] = imageData[row][col - 1];imageData[row][col - 1] = temp;col--;}break;}// 重新刷新界面!!!initImage();}private void initRandomArray() {// 1、打乱数组for (int i = 0; i < imageData.length; i++) { // 遍历行for (int j = 0; j < imageData[i].length; j++) { // 遍历列// 随机两个行列位置,让这两个位置交换。int i1 = (int)(Math.random() * imageData.length);int j1 = (int)(Math.random() * imageData.length);int i2 = (int)(Math.random() * imageData.length);int j2 = (int)(Math.random() * imageData.length);int temp = imageData[i1][j1];imageData[i1][j1] = imageData[i2][j2];imageData[i2][j2] = temp;}}// 定义空白色块的位置。// 去二维数组中遍历每个数据,只要发现这个数据等于0,这个位置就是当前空白色块的位置。OUT:for (int i = 0; i < imageData.length; i++) { // 遍历行for (int j = 0; j < imageData[i].length; j++) { // 遍历列if (imageData[i][j] == 0) {// 定位空白色块的位置row = i;col = j;break OUT; // 跳出两个for循环}}}}private void initMenu() {JMenuBar menuBar = new JMenuBar(); // 创建一个菜单栏JMenu menu = new JMenu("系统");JMenuItem exitJi = new JMenuItem("退出");menu.add(exitJi); // 添加子菜单exitJi.addActionListener(e -> { // 添加点击事件// 退出游戏dispose();});JMenuItem restartJi = new JMenuItem("重启");menu.add(restartJi);restartJi.addActionListener(e -> { // 添加点击事件// 重启游戏});menuBar.add(menu); // 添加到菜单栏中this.setJMenuBar(menuBar);}private void initImage() {// 先清空窗口上的全部图层this.getContentPane().removeAll();// 1、展示一个行列矩阵的图片色块依次铺满窗口(4 * 4)for (int i = 0; i < imageData.length; i++) { // 遍历行for (int j = 0; j < imageData[i].length; j++) { // 遍历列// 拿到图片的名称String imageName = imageData[i][j] + ".png";// 2、创建一个JLabel对象,设置图片给他展示。JLabel label = new JLabel();// 3、设置图片到label对象中去。label.setIcon(new ImageIcon(imagePath + imageName));// 4、设置数字色块的位置label.setBounds(20 + j * 100, 60 + i * 100, 100, 100);// 5、把这个图片展示到窗口中this.add(label);}}// 设置窗口的背景图片JLabel background = new JLabel(new ImageIcon(imagePath + "background.png"));background.setBounds(0, 0, 450, 484);this.add(background);// 刷新新图层,重新绘制窗口this.repaint();}private void initFrame() {// 设置窗口标题this.setTitle("石子迷宫 V 1.0");// 设置窗口大小this.setSize(463, 543);// 设置窗口关闭方式this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);// 设置窗口的居中显示this.setLocationRelativeTo(null);// 设置布局方式为绝对位置定位this.setLayout(null);}
}

4、判断是否通关

∙ \bullet 用户每操作一步,需要立即判断是否已经通关,如果通过,需要显示胜利的标记。
在这里插入图片描述

完成代码如下:

package com.itheima;import javax.swing.*;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;// 自定义窗口类,创建对象,展示一个主窗口。
public class MainFrame extends JFrame {// 设置图片位置private static final String imagePath = "stone-maze/src/image/";// 准备一个数组,用户存储数字色块的行列位置:4行4列private int[][] imageData = {{1, 2, 3, 4},{5, 6, 7, 8},{9, 10, 11, 12},{13, 14, 15, 0}};// 定义一个二维数组,用于存储最终游戏成功的数据顺序private int[][] winData = new int[][] {{1, 2, 3, 4},{5, 6, 7, 8},{9, 10, 11, 12},{13, 14, 15, 0}};// 定义两个整数变量记录当前空白色块的位置。private int row; // 当前空白色块的行位置private int col; // 当前空白色块的列位置public MainFrame() {// 1、调用一个初始化方法:初始化窗口大小等信息。initFrame();// 4、打乱数组色块的顺序,再提示图片initRandomArray();// 2、初始化界面:展示数字色块。initImage();// 3、初始化系统菜单:点击弹出菜单信息是系统退出,重启游戏。initMenu();// 5、给当前窗口绑定上下左右按键事件。initKeyPressEvent();// 设置窗口可见this.setVisible(true);}private void initKeyPressEvent() {// 给当前窗口绑定上下左右按键事件。this.addKeyListener(new KeyAdapter() {@Overridepublic void keyPressed(KeyEvent e) {// 判断当前按键的编号int keyCode = e.getKeyCode();// 判断按键编号,上下左右switch (keyCode) {case KeyEvent.VK_UP:switchAndMove(Direction.UP);// 用户按下上键,把图片上移。break;case KeyEvent.VK_DOWN:switchAndMove(Direction.DOWN);// 用户按下下键,把图片下移。break;case KeyEvent.VK_LEFT:switchAndMove(Direction.LEFT);// 用户按下左键,把图片左移。break;case KeyEvent.VK_RIGHT:switchAndMove(Direction.RIGHT);// 用户按下右键,把图片右移。break;}}});}// 控制数据交换和图片移动private void switchAndMove(Direction r) {// 判断图片的方向,再控制图片移动。switch (r) {case UP:// 上交换的条件是行必须 < 3,然后才开始交换。if (row < imageData.length - 1) {// 当前空白色块位置:rol  col// 需要被交换的位置:row + 1  colint temp = imageData[row][col];imageData[row][col] = imageData[row + 1][col];imageData[row + 1][col] = temp;// 更新当前空白色块的位置。row++;}break;case DOWN:if (row > 0) {// 当前空白色块位置:row  col// 需要被交换的位置:row - 1  colint temp = imageData[row][col];imageData[row][col] = imageData[row - 1][col];imageData[row - 1][col] = temp;// 更新当前空白色块的位置。row--;}break;case LEFT:// 左交换的条件是列必须 < 3,然后才开始交换。if (col < imageData.length - 1) {// 当前空白色块位置:row  col// 需要被交换的位置:row  col + 1int temp = imageData[row][col];imageData[row][col] = imageData[row][col + 1];imageData[row][col + 1] = temp;// 更新当前空白色块的位置。col++;}break;case RIGHT:if (col > 0) {int temp = imageData[row][col];imageData[row][col] = imageData[row][col - 1];imageData[row][col - 1] = temp;col--;}break;}// 重新刷新界面!!!initImage();}private void initRandomArray() {// 1、打乱数组for (int i = 0; i < imageData.length; i++) { // 遍历行for (int j = 0; j < imageData[i].length; j++) { // 遍历列// 随机两个行列位置,让这两个位置交换。int i1 = (int)(Math.random() * imageData.length);int j1 = (int)(Math.random() * imageData.length);int i2 = (int)(Math.random() * imageData.length);int j2 = (int)(Math.random() * imageData.length);int temp = imageData[i1][j1];imageData[i1][j1] = imageData[i2][j2];imageData[i2][j2] = temp;}}// 定义空白色块的位置。// 去二维数组中遍历每个数据,只要发现这个数据等于0,这个位置就是当前空白色块的位置。OUT:for (int i = 0; i < imageData.length; i++) { // 遍历行for (int j = 0; j < imageData[i].length; j++) { // 遍历列if (imageData[i][j] == 0) {// 定位空白色块的位置row = i;col = j;break OUT; // 跳出两个for循环}}}}private void initMenu() {JMenuBar menuBar = new JMenuBar(); // 创建一个菜单栏JMenu menu = new JMenu("系统");JMenuItem exitJi = new JMenuItem("退出");menu.add(exitJi); // 添加子菜单exitJi.addActionListener(e -> { // 添加点击事件// 退出游戏dispose();});JMenuItem restartJi = new JMenuItem("重启");menu.add(restartJi);restartJi.addActionListener(e -> { // 添加点击事件// 重启游戏});menuBar.add(menu); // 添加到菜单栏中this.setJMenuBar(menuBar);}private void initImage() {// 先清空窗口上的全部图层this.getContentPane().removeAll();// 判断是否赢了if (isWin()) {// 展示胜利的图片JLabel label = new JLabel(new ImageIcon(imagePath + "win.png"));label.setBounds(124, 230, 266, 88);this.add(label);}// 1、展示一个行列矩阵的图片色块依次铺满窗口(4 * 4)for (int i = 0; i < imageData.length; i++) { // 遍历行for (int j = 0; j < imageData[i].length; j++) { // 遍历列// 拿到图片的名称String imageName = imageData[i][j] + ".png";// 2、创建一个JLabel对象,设置图片给他展示。JLabel label = new JLabel();// 3、设置图片到label对象中去。label.setIcon(new ImageIcon(imagePath + imageName));// 4、设置数字色块的位置label.setBounds(20 + j * 100, 60 + i * 100, 100, 100);// 5、把这个图片展示到窗口中this.add(label);}}// 设置窗口的背景图片JLabel background = new JLabel(new ImageIcon(imagePath + "background.png"));background.setBounds(0, 0, 450, 484);this.add(background);// 刷新新图层,重新绘制窗口this.repaint();}private boolean isWin() {// 判断是否赢了for (int i = 0; i < imageData.length; i++) { // 遍历行for (int j = 0; j < imageData[i].length; j++) { // 遍历列// 判断当前遍历到的数据是否和winData中的数据是否一致if (imageData[i][j] != winData[i][j]) {// 如果不一致,则返回falsereturn false;}}}// 如果一致,则返回true,则显示胜利的图片return true;}private void initFrame() {// 设置窗口标题this.setTitle("石子迷宫 V 1.0");// 设置窗口大小this.setSize(463, 543);// 设置窗口关闭方式this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);// 设置窗口的居中显示this.setLocationRelativeTo(null);// 设置布局方式为绝对位置定位this.setLayout(null);}
}

5、统计移动步骤,重启游戏

∙ \bullet 每成功移动一步,都需要累加一次步数
∙ \bullet 定义一个变量用于累加步数,并实时展示到界面上

6、拓展问题

∙ \bullet 数字华容道的乱序操作,并不是可以随意打乱的,必须满足一定的算法去打乱顺序,这样才是有解的,才能让玩家恢复到有序。有没有简单的算法???在这里插入图片描述

相关文章:

自学Java-AI结合GUI开发一个石头迷阵的游戏

自学Java-AI结合GUI开发一个石头迷阵的游戏 准备环节1、创建石头迷阵的界面2、打乱顺序3、控制上下左右移动4、判断是否通关5、统计移动步骤&#xff0c;重启游戏6、拓展问题 准备环节 技术&#xff1a; 1、GUI界面编程 2、二维数组 3、程序流程控制 4、面向对象编程 ∙ \bulle…...

buuctf-[极客大挑战 2019]Knife题解

一个很简单的web题&#xff0c;进入界面 网页名还加白给的shell&#xff0c;并且给的提示也很明显&#xff0c;给了一个一句话木马再加上菜刀&#xff0c;很怀疑是一个webshell题&#xff0c;那么直接打开蚁剑测试连接拿shell 用提示的一句话木马的密码&#xff0c;测试链接发现…...

Spring MVC 对象转换器:初级开发者入门指南

Spring MVC 对象转换器&#xff1a;初级开发者入门指南 为什么需要对象转换器&#xff1f; 在 Web 应用中&#xff0c;我们经常需要处理不同类型的对象。例如&#xff1a;前端数据到后端对象 &#xff1a;用户通过表单提交的数据通常是HttpServletRequest 对象&#xff0c;我们…...

语音直播交友app出海:语音直播交友系统软件源码搭建国际化发展技术层面分析

随着移动互联网的普及和全球社交需求的增长以及国内如火如荼的Ai大模型引起的全球发展热潮&#xff0c;语音直播软件出海成为了具有巨大发展潜力的业务领域。以下是一些关键的技术方向&#xff0c;将为语音直播软件在国际市场的成功推广及搭建合作奠定基础。 通信技术 实时语音…...

Web Scraper,强大的浏览器爬虫插件!

Web Scraper是一款功能丰富的浏览器扩展爬虫工具&#xff0c;有着直观的图形界面&#xff0c;无需编写代码即可自定义数据抓取规则&#xff0c;高效地从网页中提取结构化数据&#xff0c;而且它支持灵活的数据导出选项&#xff0c;广泛应用于电商监控、内容聚合、市场调研等多元…...

EasyRTC:基于WebRTC与P2P技术,开启智能硬件音视频交互的全新时代

在数字化浪潮的席卷下&#xff0c;智能硬件已成为我们日常生活的重要组成部分&#xff0c;从智能家居到智能穿戴&#xff0c;从工业物联网到远程协作&#xff0c;设备间的互联互通已成为不可或缺的趋势。然而&#xff0c;高效、低延迟且稳定的音视频交互一直是智能硬件领域亟待…...

go 定时任务 gocron timer

选型推荐&#xff08;DeepSeek&#xff09; 简单任务调度: 推荐使用 cron 或 gocron&#xff0c;它们轻量且易用。 复杂任务调度: 推荐使用 go-quartz&#xff0c;支持任务依赖和持久化。 分布式任务调度: 推荐使用 asynq&#xff0c;基于 Redis 实现&#xff0c;适合分布式…...

uniapp引入uview组件库(可以引用多个组件)

第一步安装 npm install uview-ui2.0.31 第二步更新uview npm update uview-ui 第三步在main.js中引入uview组件库 第四步在uni.scss中引入import "uview-ui/theme.scss"样式 第五步在文件中使用组件...

MySQL主从架构

MySQL主从架构 MySQL REPLICATION 在实际生产环境中&#xff0c;如果对数据库的读和写都在一个数据库服务器中操作。无论是在安全性、高可用性&#xff0c;还是高并发等各个方面都是完全不能满足实际需求的&#xff0c;因此&#xff0c;一般来说都是通过主从复制&#xff08;…...

科普mfc100.dll丢失怎么办?有没有简单的方法修复mfc100.dll文件

当电脑频繁弹窗提示“mfc100.dll丢失”或应用程序突然闪退时&#xff0c;这个看似普通的系统文件已成为影响用户体验的核心痛点。作为微软基础类库&#xff08;MFC&#xff09;的核心组件&#xff0c;mfc100.dll直接关联着Visual Studio 2010开发的大量软件运行命脉。从工业设计…...

论文笔记:How Much Can Time-related Features Enhance Time Series Forecasting?

202412arxiv 许多时间序列预测方法靠变量建模&#xff0c;却忽略了时间戳相关特征&#xff08;如季节、月份、星期几、小时、分钟等&#xff09; ——>论文尝试仅基于时间戳进行预测&#xff08;这个仅我觉得其实不是很严谨&#xff0c;还是用了时间序列变量的数据【不可能…...

Qt学习(六) 软件启动界面 ,注册表使用 ,QT绘图, 视图和窗口绘图,Graphics View绘图框架:简易CAD

一 软件启动界面 注册表使用 知识点1&#xff1a;这样创建的界面是不可以拖动的&#xff0c;需要手动创建函数来进行拖动&#xff0c;以下的3个函数是从父类继承过来的函数 virtual void mousePressEvent(QMouseEvent *event);virtual void mouseReleaseEvent(QMouseEvent *eve…...

JavaScript系列(80)--WebAssembly 基础入门

WebAssembly 基础入门 &#x1f680; WebAssembly&#xff08;简称Wasm&#xff09;是一种低级的类汇编语言&#xff0c;它具有紧凑的二进制格式&#xff0c;能够以接近原生的性能在现代Web浏览器中运行。让我们深入了解这项革命性的技术。 WebAssembly 概述 &#x1f31f; &…...

蓝桥杯刷题2.21|笔记

参考的是蓝桥云课十四天的那个题单&#xff0c;不知道我发这个有没有问题&#xff0c;如果有问题找我我立马删文。&#xff08;参考蓝桥云课里边的题单&#xff0c;跟着大佬走&#xff0c;应该是没错滴&#xff0c;加油加油&#xff09; 一、握手问题 #include <iostream&g…...

053 性能压测 单机锁 setnx

文章目录 性能压测-压力测试索引thymeleafnginx减少数据库查询&#xff08;代码有bug&#xff09;缓存 安全单机锁&#xff08;防止缓存击穿&#xff09;setnx pom.xml 性能压测-压力测试 1 响应时间&#xff08;Response Time: RT&#xff09;&#xff1a;响应时间指用户从客…...

【天线】IFA天线知识点摘抄

MIFA天线的尺寸与性能关系 1&#xff0c;辐射效率 天线越小&#xff0c;辐射效率越低。唯一好处是减少PCB占用空间 2&#xff0c;带宽 一般MIFA天线在2.4G频段内的带宽&#xff1a;S11≤-10dB的范围为2.44GHz230MHz。较小的尺寸可能会限制带宽 3&#xff0c;增益 MIFA天线的…...

Mysql视图有什么作用?你是否使用过视图?

MySQL视图&#xff08;View&#xff09;是一种虚拟表&#xff0c;其内容由查询定义。视图并不实际存储数据&#xff0c;而是基于一个或多个表的查询结果生成。以下是关于MySQL视图的详细说明&#xff1a; 1. 视图的定义 概念&#xff1a;视图是一个虚拟表&#xff0c;其内容由…...

【vue项目如何利用event-stream实现文字流式输出效果】

引言 在现代 Web 应用中&#xff0c;实时数据展示是一个常见需求&#xff0c;例如聊天消息逐字显示、日志实时推送、股票行情更新等。传统的轮询或一次性数据加载方式无法满足这类场景的流畅体验&#xff0c;而 流式传输&#xff08;Streaming&#xff09; 技术则能实现数据的…...

微信问题总结(onpageshow ,popstate事件)

此坑描述 订单详情某按钮点击&#xff0c;通过window.location.href跳转到&#xff08;外部&#xff09;第三方链接后&#xff0c;回退后&#xff0c;在ios中生命周期和路由导航钩子都失效了&#xff0c;无法触发。 在安卓中无视此坑&#xff0c; 回退没有问题 解决 原因&am…...

【Gin-Web】Bluebell社区项目梳理3:社区相关接口开发

本文目录 一、接口详情1. 获取分类社区列表接口2. 根据id查询社区 二、值类型与引用类型 一、接口详情 跟社区有关的接口详情如下。 1. 获取分类社区列表接口 首先是Controller层&#xff0c;然后跳转到Logic层业务逻辑的开发。 这是Logic层&#xff0c;再做一次跳转&#…...

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…...

Cesium1.95中高性能加载1500个点

一、基本方式&#xff1a; 图标使用.png比.svg性能要好 <template><div id"cesiumContainer"></div><div class"toolbar"><button id"resetButton">重新生成点</button><span id"countDisplay&qu…...

《从零掌握MIPI CSI-2: 协议精解与FPGA摄像头开发实战》-- CSI-2 协议详细解析 (一)

CSI-2 协议详细解析 (一&#xff09; 1. CSI-2层定义&#xff08;CSI-2 Layer Definitions&#xff09; 分层结构 &#xff1a;CSI-2协议分为6层&#xff1a; 物理层&#xff08;PHY Layer&#xff09; &#xff1a; 定义电气特性、时钟机制和传输介质&#xff08;导线&#…...

生成 Git SSH 证书

&#x1f511; 1. ​​生成 SSH 密钥对​​ 在终端&#xff08;Windows 使用 Git Bash&#xff0c;Mac/Linux 使用 Terminal&#xff09;执行命令&#xff1a; ssh-keygen -t rsa -b 4096 -C "your_emailexample.com" ​​参数说明​​&#xff1a; -t rsa&#x…...

Java 加密常用的各种算法及其选择

在数字化时代&#xff0c;数据安全至关重要&#xff0c;Java 作为广泛应用的编程语言&#xff0c;提供了丰富的加密算法来保障数据的保密性、完整性和真实性。了解这些常用加密算法及其适用场景&#xff0c;有助于开发者在不同的业务需求中做出正确的选择。​ 一、对称加密算法…...

Android15默认授权浮窗权限

我们经常有那种需求&#xff0c;客户需要定制的apk集成在ROM中&#xff0c;并且默认授予其【显示在其他应用的上层】权限&#xff0c;也就是我们常说的浮窗权限&#xff0c;那么我们就可以通过以下方法在wms、ams等系统服务的systemReady()方法中调用即可实现预置应用默认授权浮…...

Fabric V2.5 通用溯源系统——增加图片上传与下载功能

fabric-trace项目在发布一年后,部署量已突破1000次,为支持更多场景,现新增支持图片信息上链,本文对图片上传、下载功能代码进行梳理,包含智能合约、后端、前端部分。 一、智能合约修改 为了增加图片信息上链溯源,需要对底层数据结构进行修改,在此对智能合约中的农产品数…...

安卓基础(Java 和 Gradle 版本)

1. 设置项目的 JDK 版本 方法1&#xff1a;通过 Project Structure File → Project Structure... (或按 CtrlAltShiftS) 左侧选择 SDK Location 在 Gradle Settings 部分&#xff0c;设置 Gradle JDK 方法2&#xff1a;通过 Settings File → Settings... (或 CtrlAltS)…...

API网关Kong的鉴权与限流:高并发场景下的核心实践

&#x1f525;「炎码工坊」技术弹药已装填&#xff01; 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 引言 在微服务架构中&#xff0c;API网关承担着流量调度、安全防护和协议转换的核心职责。作为云原生时代的代表性网关&#xff0c;Kong凭借其插件化架构…...

算术操作符与类型转换:从基础到精通

目录 前言&#xff1a;从基础到实践——探索运算符与类型转换的奥秘 算术操作符超级详解 算术操作符&#xff1a;、-、*、/、% 赋值操作符&#xff1a;和复合赋值 单⽬操作符&#xff1a;、--、、- 前言&#xff1a;从基础到实践——探索运算符与类型转换的奥秘 在先前的文…...