自学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、统计移动步骤,重启游戏6、拓展问题 准备环节 技术: 1、GUI界面编程 2、二维数组 3、程序流程控制 4、面向对象编程 ∙ \bulle…...
NetLogon 权限提升漏洞
参考文章:CVE-2020-1472NetLogon权限提升漏洞_cve-2020-1472复现 谢公子-CSDN博客 域控机器账户:WIN-0V0GAORDC17 域控 ip:192.168.72.163 域内攻击者机器 ip:192.168.72.158,host:WIN10-01 攻击者 kali…...
UDP和TCP
UDP协议 报文中应该包含 源IP,源端口号目的IP,目的端口号UDP/TCP 一个进程是否可以绑定多个端口号? 可以。多个进程是否可以绑定一个端口号? 不可以,因为端口号的主要作用是唯一标识一台计算机上的一个特定服务或应…...
2025 年 1 月公链行业研报:比特币主导地位强化
2025 年 1 月公链行业研报 作者:Stella L (stellafootprint.network) 数据来源:Footprint Analytics 公链研究页面 2025 年 1 月,加密市场总市值增长 7.2% 至 2.8 万亿美元,主要区块链平台表现分化。在新的监管政策与人工智能基…...
在低功耗MCU上实现人工智能和机器学习
作者:Silicon Labs 人工智能(AI)和机器学习(ML)技术不仅正在快速发展,还逐渐被创新性地应用于低功耗的微控制器(MCU)中,从而实现边缘AI/ML解决方案。这些MCU是许多嵌入式…...
新数据结构(11)——Java类的产生和反射
反射是获取类信息的一种能力 类信息包括属性、方法、构造器、父类、接口等 类信息的来源 来自类的加载器,这是从.class文件到内存中的java虚拟器(JVM)中间的一个阶段(如下图) 类的加载器里,用Field数组存…...
智能网络感知,打造极致流畅的鸿蒙原生版中国移动云盘图文体验
背景 中国移动云盘(原“和彩云网盘”)是中国移动重磅推出的安全、智能、不限速、移动用户免流的智能云盘,致力于成为5G时代用户个人与家庭的数字资产管理中心,是中国移动继语音、短信、流量后的“第四项基础服务”。 照片、音视…...
MySQL查看视图
《MySQL 9从入门到性能优化(视频教学版)(数据库技术丛书)》(王英英)【摘要 书评 试读】- 京东图书 (jd.com) MySQL9数据库技术_夏天又到了的博客-CSDN博客 查看视图是查看数据库中已存在的视图的定义。查看视图必须要有SHOW VIE…...
量子计算的基本运算:Hadamard 门、CNOT 门、Pauli 门详解
量子计算是现代计算科学的前沿领域,它与经典计算机在处理信息的方式上有着本质的区别。量子计算机利用量子比特(qubit)的叠加态和量子纠缠等特性来进行计算,从而在某些特定任务上超越传统计算机。量子计算的核心运算单元是量子门,它们通过作用于量子比特来操控量子状态。本…...
java(spring boot)实现向deepseek/GPT等模型的api发送请求/多轮对话(附源码)
我们再启动应用并获取api密钥后就可以对它发送请求了,但是官方文档对于如何进行多轮对话以及怎么自定义参数并没有说的很清楚,给的模板也没有java的,因此我们需要自己实现。 import org.json.JSONArray; import org.json.JSONObject;import j…...
Flask flash() 消息示例
目录 安装 Flask 入门:Flask flash() 基本示例 进阶:使用 Flask-WTF Flash 登录结果消息 详解:get_flashed_messages() 详解:flash() 消息的完整生命周期 Flask 提供 flash() 用于向 用户传递临时消息,通常用于: • 表单提交成功或失败 • 用户登录、注册、退出提…...
ubuntu环境编译ffmepg支持nvidia显卡加速
文章目录 1. 安装NVIDIA驱动2. 安装CUDA&NV-CODEC2.1 安装CUDA2.2 安装NV-CODEC 3. 编译ffmpeg3.1 安装依赖3.2 下载源码安装依赖3.3 验证 4. 使用 1. 安装NVIDIA驱动 安装依赖包 sudo apt install -y ubuntu-drivers-common编辑 /etc/modprobe.d/blacklist-nouveau.conf 文…...
C++类与对象深度解析(一):从引用、内联函数到构造析构的编程实践
目录 一.引用 引用的特征:1.引用必须初始化 2.本质是别名 3.函数参数传递 4.常引用 5.函数返回值 6.权限 放大 缩小 平移 引用 vs 指针 二.内联函数 关键点说明 三.宏函数 四.类 什么是类? 简单的类 五.构造函数与析构函数 1. 构造函数&…...
SpringCloud-使用FFmpeg对视频压缩处理
在现代的视频处理系统中,压缩视频以减小存储空间、加快传输速度是一项非常重要的任务。FFmpeg作为一个强大的开源工具,广泛应用于音视频的处理,包括视频的压缩和格式转换等。本文将通过Java代码示例,向您展示如何使用FFmpeg进行视…...
Pytorch实现之粒子群优化算法在GAN中的应用
简介 简介:主要是采用了粒子群优化(PSO)算法来优化GAN的一个训练。PSO是一种是一种基于种群的随机优化技术。这种优化技术是通过粒子群进行的,粒子群在每次迭代中都会更新自己。对于给定的目标函数,这种方法利用一个搜索空间,在那里粒子群移动,找到所需的全局最小值。这…...
http+nginx
HTTP协议:超文本传输协议,Hyper Text transfer protocol(发明者:蒂姆.伯纳斯.李) 1.超文本 包含超链接(link)和各种多媒体元素的文本,这些超文本文件彼此相连,形成网状(web&…...
网络运维学习笔记 014网工初级(HCIA-Datacom与CCNA-EI)ACL访问控制列表
文章目录 ACL(Access Control List,访问控制列表)思科:实验1(标准ACL):实验2(扩展ACL):实验3(ACL在VTY的使用场景): 华为&…...
002 SpringCloudAlibaba整合 - Feign远程调用、Loadbalancer负载均衡
前文地址: 001 SpringCloudAlibaba整合 - Nacos注册配置中心、Sentinel流控、Zipkin链路追踪、Admin监控 文章目录 8.Feign远程调用、loadbalancer负载均衡整合1.OpenFeign整合1.引入依赖2.启动类添加EnableFeignClients注解3.yml配置4.日志配置5.远程调用测试6.服务…...
机器视觉检测中,2D面阵相机和线扫相机的区别
2D面阵相机和线扫相机是工业视觉系统中常用的两种相机类型,各有其特点和应用场景。 2D面阵相机 特点: 成像方式:通过二维传感器一次性捕捉整个场景的图像。 分辨率:分辨率由传感器的像素数决定,常见的有百万像素到几千…...
解锁观察者模式:Java编程中的高效事件管理之道
系列文章目录 后续补充~~~ 文章目录 一、引言:探索观察者模式的奥秘二、观察者模式的核心原理2.1 模式定义与概念2.2 关键角色剖析2.3 工作机制深度解析 三、观察者模式在 Java 中的实现3.1 手动实现观察者模式3.2 使用 JDK 内置的观察者模式3.3 代码示例解析与对比…...
Ubuntu编译ZLMediaKit
下载 git clone https://gitee.com/xia-chu/ZLMediaKit cd ZLMediaKit git submodule update --init安装工具 sudo apt install -y build-essential sudo apt install -y gcc g sudo apt install -y cmakesudo apt install -y build-essential cmake git libssl-dev libsdl1.…...
全面指南:使用JMeter进行性能压测与性能优化(中间件压测、数据库压测、分布式集群压测、调优)
目录 一、性能测试的指标 1、并发量 2、响应时间 3、错误率 4、吞吐量 5、资源使用率 二、压测全流程 三、其他注意点 1、并发和吞吐量的关系 2、并发和线程的关系 四、调优及分布式集群压测(待仔细学习) 1.线程数量超过单机承载能力时的解决…...
鸿蒙初学者学习手册(HarmonyOSNext_API14)_自定义动画API(@ohos.animator (动画) )
前言 在纯血鸿蒙中最具有用户特色的效果就是自定义的动画效果。在纯血鸿蒙中有多种定义方式,但是今天介绍的是ApI中的自定义动画。 注意: 动画本身具有生命周期,但是不支持在UIAbility的文件使用,简单而言就是不允许在UIAbility生命周期中…...
Grok 3.0 Beta 版大语言模型评测
2025年2月17日至18日,全球首富埃隆马斯克(Elon Musk)携手其人工智能公司xAI,在美国重磅发布了Grok 3.0 Beta版。这款被誉为“迄今为止世界上最智能的语言模型”的AI,不仅集成了先进的“DeepSearch”搜索功能࿰…...
IDEA中查询Maven项目的依赖树
在Maven项目中,查看项目的依赖树是一个常见的需求,特别是当你需要了解项目中直接或间接依赖了哪些库及其版本时。你可以通过命令行使用Maven的dependency:tree插件来做到这一点。这个命令会列出项目中所有依赖的树状结构。 打开idea项目的终端ÿ…...
学习aigc
DALLE2 论文 Hierarchical Text-Conditional Image Generation with CLIP Latents [2204.06125] Hierarchical Text-Conditional Image Generation with CLIP LatentsAbstract page for arXiv paper 2204.06125: Hierarchical Text-Conditional Image Generation with CLIP L…...
springboot整合mybatis-plus【详细版】
目录 一,简介 1. 什么是mybatis-plus2.mybatis-plus特点 二,搭建基本环境 1. 导入基本依赖:2. 编写配置文件3. 创建实体类4. 编写controller层5. 编写service接口6. 编写service层7. 编写mapper层 三,基本知识介绍 1. 基本注解 T…...
【2024 CSDN博客之星】大学四年,我如何在CSDN实现学业与事业的“双逆袭”?
前言: Hello大家好,我是Dream。不知不觉2024年已经过去,自己也马上迈入23岁,感慨时间飞快,从19岁刚入大学加入CSDN,到现在大学毕业已经整整四年了。CSDN陪伴我走过了最青涩的四年大学时光,在这里…...
在VS中通过vcpkg包管理器来安装使用qt5
常用指令 .\vcpkg install 库名 .\vcpkg install 库名版本号.\vcpkg install 库名 --trip x86-windows.\vcpkg list.\vcpkg search 库名 .\vcpkg x-all-installed --7zip PS G:\vcpkg> .\vcpkg help usage: vcpkg <command> [--switches] [--optionsvalues] [argume…...
【C++篇】树影摇曳,旋转无声:探寻AVL树的平衡之道
文章目录 从结构到操作:手撕AVL树的实现一、AVL树介绍1.1 什么是AVL树1.2 平衡因子的定义1.3 平衡的意义1.4 AVL树的操作 二、AVL树的节点结构2.1 节点结构的定义: 三、插入操作3.1 插入操作概述3.2 步骤1:按二叉查找树规则插入节点3.3 步骤2…...
CPU、SOC、MPU、MCU--详细分析四者的区别
一、CPU 与SOC的区别 1.CPU 对于电脑,我们经常提到,处理器,内存,显卡,硬盘四大部分可以组成一个基本的电脑。其中的处理器——Central Processing Unit(中央处理器)。CPU是一台计算机的运算核…...
nacos编写瀚高数据库插件
1、下载nacos源码 git clone gitgithub.com:alibaba/nacos.git 2、引入瀚高驱动 <dependency><groupId>com.highgo</groupId><artifactId>jdbc</artifactId><version>${highgo.version}</version></dependency> 3、DataSource…...
使用excel中的VBA合并多个excel文件
需求是这样的: 在Windows下,用excel文件让多个小组填写了统计信息,现在我需要把收集的多个文件汇总到一个文件中,前三行为标题可以忽略,第四行为收集信息的列名,处理每一行数据的时候,发现某一行…...
linux 安装启动zookeeper全过程及遇到的坑
1、下载安装zookeeper 参考文章:https://blog.csdn.net/weixin_48887095/article/details/132397448 2、启动失败 1、启动失败JAVA_HOME is not set and java could not be found in PATH 已安装 JAVA 配置了JAVA_HOME,还是报错解决方法:参考…...
JAVA JUC 并发编程学习笔记(一)
文章目录 JUC进程概述对比 线程创建线程ThreadRunnableCallable 线程方法APIrun startsleep yieldjoininterrupt打断线程打断 park终止模式 daemon不推荐 线程原理运行机制线程调度未来优化 线程状态查看线程 同步临界区syn-ed使用锁同步块同步方法线程八锁 锁原理Monitor字节码…...
内容中台架构下智能推荐系统的算法优化与分发策略
内容概要 在数字化内容生态中,智能推荐系统作为内容中台的核心引擎,承担着用户需求与内容资源精准匹配的关键任务。其算法架构的优化路径围绕动态特征建模与多模态数据融合展开,通过深度强化学习技术实现用户行为特征的实时捕捉与动态更新&a…...
Java 内存区域详解
1 常见面试题 1.1 基本问题 介绍下Java内存区域(运行时数据区)Java对象的创建过程(五步,建议能够默写出来并且要知道每一步虚拟机做了什么)对象的访问定位的两种方式(句柄和直接指针两种方式)…...
jEasyUI 创建学校课程表
jEasyUI 创建学校课程表 引言 随着信息技术的飞速发展,教育行业也迎来了数字化转型的浪潮。学校课程表的创建和管理作为教育信息化的重要组成部分,其效率和准确性直接影响到学校的教学秩序。jEasyUI,作为一款优秀的开源UI框架,凭借其易用性、灵活性和丰富的组件,成为了许…...
利用 OpenCV 进行棋盘检测与透视变换
利用 OpenCV 进行棋盘检测与透视变换 1. 引言 在计算机视觉领域,棋盘检测与透视变换是一个常见的任务,广泛应用于 摄像机标定、文档扫描、增强现实(AR) 等场景。本篇文章将详细介绍如何使用 OpenCV 进行 棋盘检测,并…...
git-提交时间和作者时间的区别
1.介绍 定义介绍 提交时间(Committer Date):决定了提交在 Git 历史中的位置,通常影响 GitHub 上提交显示的顺序。 作者时间(Author Date):虽然不影响提交的排序,但在每个提交详情页…...
解决双系统开机显示gnu grub version 2.06 Minimal BASH Like Line Editing is Supported
找了好多教程都没有用,终于解决了!!我是因为ubuntu分区的时候出问题了 问题描述: 双系统装好,隔天开机找不到引导项,黑屏显示下列 因为我用的D盘划分出来的部分空闲空间,而不是全部,…...
基于Flask的京东商品信息可视化分析系统的设计与实现
【Flask】基于Flask的京东商品信息可视化分析系统的设计与实现(完整系统源码开发笔记详细部署教程)✅ 目录 一、项目简介二、项目界面展示三、项目视频展示 一、项目简介 系统能够灵活地执行SQL查询,提取出用于分析的关键数据指标。为了将这…...
期权帮|股指期货中的套期保值如何操作?
锦鲤三三每日分享期权知识,帮助期权新手及时有效地掌握即市趋势与新资讯! 股指期货中的套期保值如何操作? 一、股指期货中的套期保值准备阶段 确定套保需求,投资者依据市场预判与投资组合分析,决定是否套保。 &…...
用Chrome Recorder轻松完成自动化测试脚本录制
前言 入门自动化测试,录制回放通常是小白测试首先用到的功能。而录制回放工具也一直是各大Web自动化测试必然会着重提供的一块功能。 早期WinRunner、QTP这样的工具,自动化测试可以说是围绕录制回放开展的。近年像Selenium也提供有录制工具 Selenium IDE,Playwright也包含…...
C/C++面试知识点总结
目录 1. 指针1.1 智能指针1.2 指针和引用的区别1.3 数组和指针的区别1.4 数组指针和指针数组的区别1.5 迭代器和指针的区别1.6 strcpy 和 memcpy 的区别 2. 内存管理与分配2.1 内存分配与存储区2.2 malloc / free2.3 volatile和extern的区别2.4 拷贝构造函数2.5 预处理、编译、…...
springboot三层架构详细讲解
目录 springBoot三层架构 0.简介1.各层架构 1.1 Controller层1.2 Service层1.3 ServiceImpl1.4 Mapper1.5 Entity1.6 Mapper.xml 2.各层之间的联系 2.1 Controller 与 Service2.2 Service 与 ServiceImpl2.3 Service 与 Mapper2.4 Mapper 与 Mapper.xml2.5 Service 与 Entity2…...
助力DeepSeek私有化部署服务:让企业AI落地更简单、更安全
在数字化转型的浪潮中,越来越多的企业选择私有化部署AI技术,以保障数据安全、提升业务效率并实现自主可控。DeepSeek作为行业领先的AI开源技术,其技术可以支持企业私有化部署,企业需要一站式服务私有化部署,涵盖硬件采…...
Mac book Air M2 用VMware安装 Ubuntu22.04
安装 VMware Fusion 下载 Ubuntu 安装VMware 完成之后运行新建 将对应Ubuntu 版本拖拽 如图 选择第一个回车 选绿色 回车 为空 相关命令行 sudo apt install net-tools sudo apt install ubuntu-desktop sudo reboot 常用命令行 uname uname -a clear ll ifconfig (查…...
Spring Boot接收参数的19种方式
Spring Boot是一个强大的框架,允许开发人员通过多种方式接收和处理参数。无论是HTTP请求参数、路径变量,还是请求体中的数据,Spring Boot都能提供灵活的处理方式。本文将介绍19种不同的方式来接收参数。 1. 查询参数(Query Param…...
Linux firewalld 常用命令
本文参考RedHat官网文章How to configure a firewall on Linux with firewalld。 Firewalld 是守护进程名,对应命令为firewall-cmd。帮助详见以下命令: $ firewall-cmd --helpUsage: firewall-cmd [OPTIONS...]General Options-h, --help Pr…...