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

《用MATLAB玩转游戏开发:从零开始打造你的数字乐园》基础篇(2D图形交互)-俄罗斯方块:用旋转矩阵打造经典

《用MATLAB玩转游戏开发:从零开始打造你的数字乐园》基础篇(2D图形交互)-🎮 俄罗斯方块:用旋转矩阵打造经典 🧊

大家好!今天我将带大家用MATLAB实现经典的俄罗斯方块游戏。我们将从数学原理出发,通过旋转矩阵实现方块的变形,最终完成一个可玩的游戏版本。让我们一起进入这个充满趣味的编程之旅吧!✨

文章目录

  • 《用MATLAB玩转游戏开发:从零开始打造你的数字乐园》基础篇(2D图形交互)-🎮 俄罗斯方块:用旋转矩阵打造经典 🧊
    • 1. 游戏设计思路 🧠
      • 1.1 模块设计
      • 1.2 流程设计
        • 1.2.1 流程图说明
        • 1.2.2 关键路径说明
    • 2. 旋转矩阵原理(重点) 🔄
      • 2.1 旋转矩阵基础
      • 2.2 方块旋转实现
    • 3. 游戏架构设计 🏗️
    • 4. MATLAB实现详解 💻
      • 4.1 初始化游戏
      • 4.2 旋转函数实现
      • 4.3 碰撞检测
    • 5. 完整代码 🎮
    • 6. 总结与扩展 🚀

在这里插入图片描述
🎉 正文开始前,先来看看最终效果图! 🎉
在这里插入图片描述
奈何我自己的水平有点菜🐣,只得了 900分……你们也来玩一局试试吧!看看自己能拿多少分💪

🔥 挑战一下,把你的得分打在评论区 🔥
看看谁的分数最高🏆,说不定你就是那个隐藏的大神哦!✨

(快来PK吧!😎)

1. 游戏设计思路 🧠

1.1 模块设计

俄罗斯方块的核心机制可以分解为以下几个部分:

  • 方块生成:7种基本形状(I, J, L, O, S, T, Z)
  • 方块旋转:通过旋转矩阵实现90°旋转
  • 方块移动:左右移动和加速下落
  • 碰撞检测:判断方块是否可以移动或旋转
  • 消行计分:当一行填满时消除并计分
  • 游戏结束:当方块堆叠到顶部时结束游戏

1.2 流程设计

以下是俄罗斯方块游戏的完整流程图设计,包含移动、碰撞检测、旋转处理等流程:

旋转处理
碰撞检测
左箭头
右箭头
下箭头
上箭头
空格
计算旋转后坐标
旋转方块
应用旋转矩阵
检查旋转合法性
检查边界
移动合法?
检查已有方块
返回检测结果
开始游戏
初始化游戏板
生成新方块
游戏结束?
游戏结束
绘制游戏界面
玩家输入
尝试左移
尝试右移
加速下落
快速下落
更新方块位置
固定方块
检查消除行
有完整行?
消除行并计分
自动下落计时结束?
尝试下落
1.2.1 流程图说明

1.2.1.1. 游戏初始化阶段

  • 初始化游戏板(20x10矩阵)
  • 生成第一个方块

1.2.1.2. 主游戏循环

绘制界面
处理输入
自动下落

1.2.1.3. 输入处理分支

  • 左右移动:修改x坐标
  • 旋转:应用旋转矩阵
  • 下落:修改y坐标

1.2.1.4. 关键判断节点

  • 移动/旋转合法性检查(碰撞检测)
  • 自动下落计时器
  • 行消除判断

1.2.1.5. 特殊处理流程

  • 旋转计算:应用旋转矩阵后必须通过碰撞检测
  • 快速下落:连续执行下落直到碰撞
1.2.2 关键路径说明

1.2.2.1. 方块移动流程

玩家输入 → 计算新位置 → 碰撞检测 → 更新位置/固定方块

1.2.2.2. 旋转特殊处理

旋转请求 → 计算旋转坐标 → 矩阵变换 → 合法性检查 → 更新状态

1.2.2.3. 自动下落逻辑

计时结束 → 尝试下落 → 成功则更新/失败则固定

这个流程图完整展示了游戏的所有可能状态转换,特别是突出了旋转矩阵的应用位置(在旋转处理子流程中)。建议在阅读代码时对照此流程图理解游戏逻辑。

今天我们将重点讲解旋转矩阵的实现,这是游戏中最有趣的数学部分!🤓

2. 旋转矩阵原理(重点) 🔄

2.1 旋转矩阵基础

在二维空间中,旋转矩阵可以将任何点绕原点旋转θ角度。对于90°旋转(θ=π/2),旋转矩阵为:

R = [ 0 − 1 1 0 ] R = \begin{bmatrix} 0 & -1 \\ 1 & 0 \end{bmatrix} R=[0110]

应用到点(x,y)上:
x ′ = 0 ⋅ x + ( − 1 ) ⋅ y = − y y ′ = 1 ⋅ x + 0 ⋅ y = x \begin{aligned} x' &= 0 \cdot x + (-1) \cdot y = -y \\ y' &= 1 \cdot x + 0 \cdot y = x \end{aligned} xy=0x+(1)y=y=1x+0y=x

2.2 方块旋转实现

俄罗斯方块中,每个方块由4个小方块(我们称为"方块块")组成。旋转时,我们需要:

  1. 找到方块的旋转中心(通常是中心块或靠近中心的位置)
  2. 将每个方块块相对于旋转中心应用旋转矩阵
  3. 确保旋转后的位置是合法的(不超出边界或与已有方块重叠)

💡 小技巧:我们可以将方块表示为相对坐标,这样旋转计算会更方便!

3. 游戏架构设计 🏗️

我们的MATLAB实现将采用以下结构:

  1. 主循环:控制游戏流程
  2. 游戏板:20行×10列的矩阵表示
  3. 当前方块:存储当前下落方块的信息
  4. 绘图函数:实时更新游戏界面
  5. 键盘回调:处理玩家输入

4. MATLAB实现详解 💻

4.1 初始化游戏

function tetris()% 游戏参数boardWidth = 10;boardHeight = 20;blockSize = 25;  % 每个小方块的像素大小% 创建图形窗口fig = figure('Name','俄罗斯方块','NumberTitle','off',...'KeyPressFcn',@keyPress,...'Position',[200 200 boardWidth*blockSize+100 boardHeight*blockSize+100]);% 创建游戏板ax = axes('Parent',fig,'Position',[0.05 0.05 0.7 0.9]);axis equal; axis([0 boardWidth 0 boardHeight]);set(ax,'XTick',0:boardWidth,'YTick',0:boardHeight,'XColor','k','YColor','k');grid on; hold on;title('俄罗斯方块 - MATLAB版');% 初始化游戏板矩阵 (0=空, 1-7=不同颜色方块)board = zeros(boardHeight, boardWidth);% 方块形状定义 (相对坐标)shapes = {[0 0; 0 1; 0 2; 0 3],    % I[0 0; 0 1; 0 2; 1 0],     % J[0 0; 0 1; 0 2; 1 2],     % L[0 0; 0 1; 1 0; 1 1],     % O[0 0; 0 1; 1 1; 1 2],     % S[0 0; 0 1; 0 2; 1 1],     % T[0 0; 1 0; 1 1; 2 1]      % Z};% 方块颜色colors = [0 1 1;    % 青色 - I0 0 1;    % 蓝色 - J1 0.5 0;  % 橙色 - L1 1 0;    % 黄色 - O0 1 0;    % 绿色 - S1 0 1;    % 紫色 - T1 0 0     % 红色 - Z];

4.2 旋转函数实现

这是最核心的部分!✨

    % 旋转当前方块function rotatePiece()% 获取当前方块的旋转中心 (通常是第一个方块块)pivot = currentPiece(1,:);% 应用旋转矩阵rotated = zeros(size(currentPiece));for i = 1:size(currentPiece,1)% 相对于旋转中心的坐标relPos = currentPiece(i,:) - pivot;% 应用90度旋转矩阵newRelPos = [-relPos(2), relPos(1)];% 计算新位置rotated(i,:) = pivot + newRelPos;end% 检查旋转后是否合法if canMove(rotated, currentPos)currentPiece = rotated;drawBoard();endend

4.3 碰撞检测

    % 检查移动/旋转是否合法function valid = canMove(piece, pos)valid = true;for i = 1:size(piece,1)% 计算实际位置x = pos(1) + piece(i,1);y = pos(2) + piece(i,2);% 检查边界if x < 1 || x > boardWidth || y < 1 || y > boardHeightvalid = false;return;end% 检查是否与已有方块重叠if y <= boardHeight && board(y,x) ~= 0valid = false;return;endendend

5. 完整代码 🎮

以下是适配MATLAB 2016b的完整可运行代码:

function tetris()% 游戏参数boardWidth = 10;boardHeight = 20;blockSize = 25;  % 每个小方块的像素大小% 创建图形窗口fig = figure('Name','俄罗斯方块','NumberTitle','off',...'KeyPressFcn',@keyPress,...'Position',[200 200 boardWidth*blockSize+100 boardHeight*blockSize+100]);% 创建游戏板ax = axes('Parent',fig,'Position',[0.05 0.05 0.7 0.9]);axis equal; axis([0 boardWidth 0 boardHeight]);set(ax,'XTick',0:boardWidth,'YTick',0:boardHeight,'XColor','k','YColor','k');grid on; hold on;title('俄罗斯方块 - MATLAB版');% 初始化游戏板矩阵 (0=空, 1-7=不同颜色方块)board = zeros(boardHeight, boardWidth);% 方块形状定义 (相对坐标)shapes = {[0 0; 0 1; 0 2; 0 3],    % I[0 0; 0 1; 0 2; 1 0],     % J[0 0; 0 1; 0 2; 1 2],     % L[0 0; 0 1; 1 0; 1 1],     % O[0 0; 0 1; 1 1; 1 2],     % S[0 0; 0 1; 0 2; 1 1],     % T[0 0; 1 0; 1 1; 2 1]      % Z};% 方块颜色colors = [0 1 1;    % 青色 - I0 0 1;    % 蓝色 - J1 0.5 0;  % 橙色 - L1 1 0;    % 黄色 - O0 1 0;    % 绿色 - S1 0 1;    % 紫色 - T1 0 0     % 红色 - Z];% 游戏状态变量currentPiece = [];currentPos = [];currentColor = [];gameOver = false;score = 0;scoreText = uicontrol('Style','text','Position',[boardWidth*blockSize+20 300 80 30],...'String',['分数: ' num2str(score)],...'FontSize',12);% 开始新游戏newGame();% 主游戏循环while ~gameOvermoveDown();pause(0.5);  % 控制下落速度end% 新游戏初始化function newGame()board = zeros(boardHeight, boardWidth);gameOver = false;score = 0;set(scoreText,'String',['分数: ' num2str(score)]);newPiece();drawBoard();end% 生成新方块function newPiece()shapeIdx = randi(7);currentPiece = shapes{shapeIdx};currentColor = colors(shapeIdx,:);currentPos = [floor(boardWidth/2), boardHeight];% 检查游戏是否结束if ~canMove(currentPiece, currentPos)gameOver = true;msgbox(['游戏结束! 最终分数: ' num2str(score)],'游戏结束');endend% 绘制游戏板function drawBoard()cla;  % 清除当前轴% 绘制已固定的方块for y = 1:boardHeightfor x = 1:boardWidthif board(y,x) ~= 0color = colors(board(y,x),:);rectangle('Position',[x-1 y-1 1 1],'FaceColor',color,'EdgeColor','k');endendend% 绘制当前方块for i = 1:size(currentPiece,1)x = currentPos(1) + currentPiece(i,1);y = currentPos(2) + currentPiece(i,2);if y >= 1 && y <= boardHeightrectangle('Position',[x-1 y-1 1 1],'FaceColor',currentColor,'EdgeColor','k');endenddrawnow;end% 旋转当前方块function rotatePiece()% 获取当前方块的旋转中心 (通常是第一个方块块)pivot = currentPiece(1,:);% 应用旋转矩阵rotated = zeros(size(currentPiece));for i = 1:size(currentPiece,1)% 相对于旋转中心的坐标relPos = currentPiece(i,:) - pivot;% 应用90度旋转矩阵newRelPos = [-relPos(2), relPos(1)];% 计算新位置rotated(i,:) = pivot + newRelPos;end% 检查旋转后是否合法if canMove(rotated, currentPos)currentPiece = rotated;drawBoard();endend% 检查移动/旋转是否合法function valid = canMove(piece, pos)valid = true;for i = 1:size(piece,1)% 计算实际位置x = pos(1) + piece(i,1);y = pos(2) + piece(i,2);% 检查边界if x < 1 || x > boardWidth || y < 1valid = false;return;end% 检查是否与已有方块重叠if y <= boardHeight && board(y,x) ~= 0valid = false;return;endendend% 移动方块function movePiece(dx, dy)newPos = currentPos + [dx, dy];if canMove(currentPiece, newPos)currentPos = newPos;drawBoard();return;end% 如果不能向下移动,固定方块if dy < 0fixPiece();endend% 快速下落function dropPiece()while canMove(currentPiece, currentPos + [0 -1])currentPos = currentPos + [0 -1];endfixPiece();end% 向下移动function moveDown()movePiece(0, -1);end% 固定方块到游戏板function fixPiece()for i = 1:size(currentPiece,1)x = currentPos(1) + currentPiece(i,1);y = currentPos(2) + currentPiece(i,2);if y >= 1 && y <= boardHeight% 确定颜色索引colorIdx = find(ismember(colors, currentColor, 'rows'));board(y,x) = colorIdx;endend% 检查是否有行可以消除checkLines();% 生成新方块newPiece();drawBoard();end% 检查并消除完整的行function checkLines()linesToClear = [];for y = 1:boardHeightif all(board(y,:) ~= 0)linesToClear = [linesToClear y];endendif ~isempty(linesToClear)% 消除行board(linesToClear,:) = [];% 添加新的空行newRows = zeros(length(linesToClear), boardWidth);board = [newRows; board];% 更新分数score = score + length(linesToClear) * 100;set(scoreText,'String',['分数: ' num2str(score)]);endend% 键盘回调函数function keyPress(~, event)if gameOver, return; endswitch event.Keycase 'leftarrow'movePiece(-1, 0);case 'rightarrow'movePiece(1, 0);case 'downarrow'moveDown();case 'uparrow'rotatePiece();case 'space'dropPiece();endend
end

在这里插入图片描述 在这里插入图片描述

6. 总结与扩展 🚀

恭喜你完成了MATLAB俄罗斯方块的实现!🎉 通过这个项目,我们学到了:

  1. 旋转矩阵在游戏开发中的应用
  2. 二维游戏的基本架构设计
  3. MATLAB图形界面和回调函数的用法

扩展思路

  • 添加音效和动画效果 🎵
  • 实现"下一个方块"预览功能 👀
  • 添加难度随分数增加而提高的机制 📈
  • 保存最高分记录 🏆

希望这篇教程对你有所帮助!如果有任何问题或建议,欢迎留言讨论。Happy coding! 💻😊

相关文章:

《用MATLAB玩转游戏开发:从零开始打造你的数字乐园》基础篇(2D图形交互)-俄罗斯方块:用旋转矩阵打造经典

《用MATLAB玩转游戏开发&#xff1a;从零开始打造你的数字乐园》基础篇&#xff08;2D图形交互&#xff09;-&#x1f3ae; 俄罗斯方块&#xff1a;用旋转矩阵打造经典 &#x1f9ca; 大家好&#xff01;今天我将带大家用MATLAB实现经典的俄罗斯方块游戏。我们将从数学原理出发…...

通过user-agent来源判断阻止爬虫访问网站,并防止生成[ error ] NULL日志

一、TP5.0通过行为&#xff08;Behavior&#xff09;拦截爬虫并避免生成 [ error ] NULL 错误日志 1. 创建行为类&#xff08;拦截爬虫&#xff09; 在 application/common/behavior 目录下新建BlockBot.php &#xff0c;用于识别并拦截爬虫请求&#xff1a; <?php name…...

微服务的“迷宫” - 我们为何需要服务网格?

微服务的“迷宫” - 我们为何需要服务网格? 你好!欢迎来到我们的服务网格探索之旅。近年来,“微服务架构”无疑是软件开发领域最热门的词汇之一。它将庞大的单体应用拆分成一组小而独立的、可以独立开发、部署和扩展的服务单元,带来了前所未有的敏捷性和弹性。开发团队可以…...

Ubuntu 安装 HAProxy

HAProxy 是什么 HAProxy&#xff08;High Availability Proxy&#xff09; 是一个 高性能、高可用的 TCP 和 HTTP 负载均衡器与代理服务器。 HAProxy 的特点 特性说明支持协议HTTP、HTTPS、TCP高性能使用 C 语言编写&#xff0c;性能极高高可用与 Keepalived 配合可实现主备健…...

VUE CLI - 使用VUE脚手架创建前端项目工程

前言 前端从这里开始&#xff0c;本文将介绍如何使用VUE脚手架创建前端工程项目 1.预准备&#xff08;编辑器和管理器&#xff09; 编辑器&#xff1a;推荐使用Vscode&#xff0c;WebStorm&#xff0c;或者Hbuilder&#xff08;适合刚开始练手使用&#xff09;&#xff0c;个…...

Nginx高级配置

目录 一.网页的状态页 二. Nginx第三方模块 2.1 echo模块 三. 变量 3.1 内置变量 3.2 自定义变量 四. 自定义访问日志 (优化) 4.1 自定义访问日志的格式 4.2 自定义json 格式日志 五. Nginx压缩功能 六 . HTTPS 功能 6.1 https概述 6.2 配置实例-----自签名证…...

Docker镜像搬运工:深入解析export与import,实现容器环境无缝迁移!

Docker作为现代开发运维的利器&#xff0c;其镜像和容器的管理技巧直接影响效率。当我们需要跨环境迁移容器状态时&#xff0c;docker export和docker import这对组合命令就能大显身手。本文带你彻底搞懂它们的核心逻辑、使用场景及避坑指南&#xff01; 一、Docker export&…...

数字孪生实战笔记(1)数字孪生的含义、应用及技术体系

一、含义 数字孪生&#xff08;Digital Twin&#xff09;是一种通过数字化模型在虚拟世界中实时映射和模拟物理实体、系统或过程的技术。它的核心目的是通过对现实对象的建模、感知、分析和预测&#xff0c;实现对物理世界的全面感知、智能控制和优化决策。数字孪生 实体对象 …...

计算机网络 4-2-2 网络层(IPv4)

2.7 网络地址转换NAT 引入端口号&#xff1a;IP地址端口号→一个特定的进程&#xff0c;&#xff08;不同主机可能存在相同端口号&#xff09; 网络层实现了“主机到主机”的通信。网络层在IP数据报的首部&#xff0c;指明源IP地址、目的IP地址 传输层实现了“端到端” &#…...

第二个简单的SpringBoot和Vue前后端全栈的todoapp案例

项目源于哔哩哔哩&#xff0c;按视频手敲了一下&#xff0c;补充上代码和一些细节。 全栈项目实践&#xff1a;1小时快速入门SpringBootvue3element-plus_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1LH4y1w7Nd/?spm_id_from333.1387.favlist.content.click&vd_…...

探秘 Canva AI 图像生成器:重塑设计创作新范式

Canva 凭借简洁易用的界面和海量模板资源&#xff0c;早已成为设计师和普通用户的心头好。而 Canva AI 图像生成器的推出&#xff0c;更是为设计领域带来了一场深刻变革&#xff0c;以智能化的手段重塑了图像创作的方式与边界。 技术内核&#xff1a;AI 如何驱动图像生成 Can…...

栈应用:辅助站(c++)

干货 今天讲讲最大辅助栈和最小辅助栈 主栈进入元素的时候 最大辅助栈:保证新元素大于等于(辅助栈)顶的时候&#xff0c;再进入辅助栈这样就能保证最大辅助栈的栈顶元素 是主栈中的最大值 主栈出栈的时候 最大辅助栈:主栈出栈元素如果等于(辅助栈)的栈顶元素&#xff0c;再…...

AI时代的数据可视化:未来已来

你有没有想过&#xff0c;数据可视化在未来会变成什么样&#xff1f;随着人工智能&#xff08;AI&#xff09;的飞速发展&#xff0c;数据可视化已经不再是简单的图表和图形&#xff0c;而是一个充满无限可能的智能领域。AI时代的可视化不仅能自动解读数据&#xff0c;还能预测…...

常见音频主控芯片以及相关厂家总结

音频主控芯片是音频设备&#xff08;如蓝牙耳机、音箱、功放等&#xff09;的核心组件&#xff0c;负责音频信号的解码、编码、处理和传输。以下是常见的音频主控芯片及其相关厂家&#xff0c;按应用领域分类&#xff1a; 蓝牙音频芯片 主要用于无线耳机、音箱等设备&#xff0…...

湖仓一体架构在金融典型数据分析场景中的实践

在数字经济与金融科技深度融合的今天&#xff0c;数据已成为金融机构的核心战略资产。然而&#xff0c;传统数据架构面临着三大困局&#xff0c;制约着金融机构数据价值的充分释放。 一、需求驱动更多银行数据分析场景 金融机构&#xff0c;特别是银行业&#xff0c;面临着双重…...

VBA —— 学习Day5

子程序与函数 子程序&#xff1a;实现特定功能的程序代码块 子程序语法&#xff1a; [修饰符] Sub 子程序名称([参数1&#xff0c;参数2&#xff0c;参数3]) 代码块 End Sub 子程序如何调用&#xff1a; 1 . 子程序名 [参数1&#xff0c;参数2&#xff0c;...] 2. Cal…...

Flink 实时数据一致性与 Exactly-Once 语义保障实战

在构建企业级实时数仓的过程中,“数据一致性” 是保障指标准确性的核心能力,尤其是在金融、电商、医疗等对数据敏感度极高的场景中。Flink 作为流批一体的实时计算引擎,其内建的 Exactly-Once 语义为我们提供了强有力的保障机制。本篇将围绕如何实现端到端的数据一致性、如何…...

Java云原生到底是啥,有哪些技术

☁️ Java云原生&#xff1a;程序员の修仙飞升指南&#xff08;附渡劫技巧&#xff09; 一、修仙世界观&#xff1a;传统程序 vs 云原生程序 &#x1f3e1; 传统Java程序&#xff08;老宅院&#xff09; 特点&#xff1a;单体大瓦房、扩建要拆墙&#xff08;耦合度高&#xf…...

IPM IMI111T-026H 高效风扇控制板

概述&#xff1a; REF-MHA50WIMI111T 是一款专为风扇驱动设计的参考开发板&#xff0c;搭载了英飞凌的IMI111T-026H iMOTION™智能功率模块(IPM)。这个模块集成了运动控制引擎(MCE)、三相栅极驱动器和基于IGBT的功率级&#xff0c;全部封装在一个紧凑的DSO22封装中。REF-MHA50…...

JavaScript基础-局部作用域

在JavaScript中&#xff0c;理解不同种类的作用域是掌握这门语言的关键之一。作用域决定了变量和函数的可访问性&#xff08;即可见性和生命周期&#xff09;。与全局作用域相对应的是局部作用域&#xff0c;它限制了变量和函数只能在其定义的特定范围内被访问。本文将深入探讨…...

[特殊字符]Meilisearch:AI驱动的现代搜索引擎

前言 大家好&#xff0c;我是MAI麦造&#xff01; 上文介绍一了Manticore Search 这款轻量级的搜索引擎&#xff0c;这次又有了新的发现&#xff01;传送门&#xff1a; Elasticsearch太重&#xff1f;它的超轻量的替代品找到了&#xff01; 这是一个让我超级兴奋的AI搜索引…...

K8S Svc Port-forward 访问方式

在 Kubernetes 中&#xff0c;kubectl port-forward 是一种 本地与集群内资源&#xff08;Pod/Service&#xff09;建立临时网络隧道 的访问方式&#xff0c;无需暴露服务到公网&#xff0c;适合开发调试、临时访问等场景。以下是详细使用方法及注意事项&#xff1a; 1. 基础用…...

SD06_前后端分离项目部署流程(采用Nginx)

本文档详细描述了如何在Ubuntu 20.04服务器上从零开始部署Tlias前后端分离系统。Tlias系统由Spring Boot后端&#xff08;tlias-web-management&#xff09;和Vue前端&#xff08;vue-tlias-management&#xff09;组成。 目录 环境准备安装MySQL数据库部署后端项目部署前端项…...

计算机网络:家庭路由器WiFi信号的发射和手机终端接收信号原理?

WiFi路由器与手机之间的信号传输涉及多个技术层面的协作,以下是其工作原理的详细步骤: 一、数据封装与协议处理 应用层数据生成 用户操作(如浏览网页、视频播放)产生数据包,经TCP/IP协议栈逐层封装,添加IP地址(网络层)和MAC地址(数据链路层)。协议封装 数据包被封装…...

【Redis】string

文章目录 string 字符串常用命令设置和获取setgetmget & mset 计数操作incr & incrbydecr & decrbyincrbyfloat 字符串操作appendstrlengetrangesetrange string 字符串 关于 Redis 的字符串&#xff0c;有几点需要注意 Redis 所有的 key 的类型都是字符串类型va…...

vue3的响应式设计原理

Vue 3 的响应式设计是其核心特性之一&#xff0c;依赖于 Proxy 和 依赖收集机制&#xff0c;相比 Vue 2 的 Object.defineProperty&#xff0c;Vue 3 的响应式系统更加高效、灵活且易于维护。 以下是 Vue 3 响应式设计的核心原理&#xff1a; 一、核心机制概览 使用 Proxy 实现…...

学习黑客5 分钟深入浅出理解Linux Logs [特殊字符]

5 分钟深入浅出理解Linux Logs &#x1f4dd; 大家好&#xff01;今天我们将探索Linux系统中的日志机制——这是系统管理和安全分析的重要组成部分。在网络安全学习特别是TryHackMe平台上的挑战中&#xff0c;理解和分析日志是发现入侵痕迹、追踪攻击者行为和收集证据的关键技…...

【Docker系列】docker inspect查看容器部署位置

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...

journalctl使用

journalctl 可以查看很多服务的日志&#xff0c;比如 docker&#xff0c;ollama 等。 1. 查看 xx 服务的最新日志&#xff08;实时滚动&#xff09; sudo journalctl -u docker -f -f 参数表示 跟随&#xff08;follow&#xff09;&#xff0c;会持续输出最新日志&#xff0…...

Satori:元动作 + 内建搜索机制,实现超级推理能力

Satori&#xff1a;元动作 内建搜索机制&#xff0c;实现超级推理能力 论文大纲一、背景&#xff1a;LLM 推理增强的三类方法1. 基于大规模监督微调&#xff08;SFT&#xff09;的推理增强2. 借助外部机制在推理时进行搜索 (RLHF / 多模型 / 工具)3. 现有局限性总结 二、Sator…...

基于语言模型的依存关系分句 和 主题变换检测(基于词频和句段得分)的 意思

&#x1f9e0; 一、基于语言模型的依存关系分句&#xff08;Dependency-based Segmentation&#xff09; ✅ 说人话&#xff1a; 用语言模型判断句子里的语法结构&#xff08;谁依赖谁&#xff09;&#xff0c;找到合理的“断点”&#xff0c;把太长的句子拆成语法上更自然的小…...

计算机体系结构一些笔记

1、异构计算&#xff1a;CPU也像人类社会一样存在专业分工。 异构计算&#xff08;Heterogeneous Computing&#xff09;是指不同类型的计算单元合作完 成计算任务。每个计算单元采用不同的架构&#xff0c;分别擅长处理某一种类型 的计算任务。整个计算任务分解为小的单位&…...

Go语言——goflow工作流使用

一、引入依赖 这个很坑&#xff0c;他不允许连接带密码的redis&#xff0c;只能使用不带密码的redis&#xff0c;要带密码的话得自己改一下源代码&#xff0c;无语 go get github.com/s8sg/goflow二、画出我们的工作流程 三、编写代码 package mainimport ("encoding/j…...

理性地倾听与表达:检索算法的语言学改进

论文标题 Rational Retrieval Acts: Leveraging Pragmatic Reasoning to Improve Sparse Retrieval 论文地址 https://arxiv.org/pdf/2505.03676 代码地址 https://github.com/arthur-75/Rational-Retrieval-Acts 作者背景 巴黎萨克雷大学&#xff0c;索邦大学&#xff…...

RV1126 ROS2环境交叉编译及部署(基于官方Docker)

RV1126 ROS2环境交叉编译及部署(基于官方Docker) 0 前言1 SDK源码更新1.1 启动Docker容器1.2 更新SDK源码1.3 SDK更新问题2 ROS2编译配置3 Buildroot rootfs编译ROS2的依赖包3.1 编译问题解决4 使用Docker交叉编译ROS24.1 准备Linux(Ubuntu) PC机的依赖环境4.1.1 Ubuntu PC机…...

每日脚本学习5.10 - XOR脚本

xor运算的简介 异或就是对于二进制的数据可以 进行同0异1 简单的演示 &#xff1a; 结果是 这个就是异或 异或的作用 1、比较两数是否相等 2、可以进行加密 加密就是需要key 明文 :0b010110 key : 0b1010001 这个时候就能进行加密 明文 ^ key密文 还有这个加密比…...

深圳SMT贴片加工厂制造流程解析

内容概要 作为大湾区电子制造产业链的重要节点&#xff0c;深圳SMT贴片加工厂凭借精密的生产体系与技术创新&#xff0c;构建了涵盖12道核心工序的标准化流程。从PCB基板的来料检验开始&#xff0c;通过全自动贴片机的高精度元件定位、SPI三维锡膏检测、智能温控回流焊接等关键…...

英语六级---2019.6 卷二 仔细阅读2

文章 Officials at the White House announced a new space policy focused on managing the increasing number of satellites that companies and governments are launching into space. Space Policy Directive-3 lays out general guidelines for the United States to mi…...

【小沐学GIS】基于C++绘制二维瓦片地图2D Map(QT、OpenGL、GIS)

&#x1f37a;三维数字地球系列相关文章如下&#x1f37a;&#xff1a;1【小沐学GIS】基于C绘制三维数字地球Earth&#xff08;OpenGL、glfw、glut&#xff09;第一期2【小沐学GIS】基于C绘制三维数字地球Earth&#xff08;OpenGL、glfw、glut、GIS&#xff09;第二期3【小沐学…...

Windows 系统 - Trae 内 终端 无法使用 node (重新配置 nodejs 路径)

想在 Trae 中尝试一下 mcp, 所以 Windows 系统下安装了 node.js. 安装成功后, 在 Windows 的 powershell 下可以 node -v, 但是在 Trae 的终端下输入 node -v 时, 识别提示不能识别 node 命令. 参考了 vscode 下的一种解决方式 VS Code 内终端无法使用 node 解决方案是相似的…...

AI编程: 使用Trae1小时做成的音视频工具,提取音频并识别文本

背景 在上个月&#xff0c;有网页咨询我怎么才能获取视频中的音频并识别成文本&#xff0c;我当时给他的回答是去问一下AI&#xff0c;让AI来给你答案。 他觉得我在敷衍他&#xff0c;大骂了我一顿&#xff0c;大家觉得我的回答对吗&#xff1f; 小编心里委屈&#xff0c;我…...

springCloud/Alibaba常用中间件之Nacos服务注册与发现

文章目录 SpringCloud Alibaba:依赖版本补充六、Nacos:服务注册与发现1、下载安装Nacos2、服务注册1. 导入依赖(这里以服务提供者为例)2. 修改配置文件和主启动类3. 创建业务类4. 测试 3.服务映射1. 导入依赖2. 修改配置文件和主启动类3. 创建业务类和RestTemplate配置类用来提…...

鸿蒙 所有API缩略图鉴

从HarmonyOS NEXT Developer Preview1&#xff08;API 11&#xff09;版本开始&#xff0c;HarmonyOS SDK以 Kit 维度提供丰富、完备的开放能力&#xff0c;涵盖应用框架、应用服务、系统、媒体、AI、图形在内的六大领域&#xff0c;共计30000个API...

互联网大厂Java求职面试:AI集成场景下的技术挑战与架构设计

标题&#xff1a;互联网大厂Java求职面试&#xff1a;AI集成场景下的技术挑战与架构设计 第一幕&#xff1a;向量数据库选型与性能调优 技术总监&#xff08;严肃脸&#xff09;&#xff1a; 郑薪苦&#xff0c;我们最近在做一个基于大语言模型的企业级AI应用&#xff0c;需要…...

搜索与图论

文章目录 搜索与图论深度优先搜索 DFS[843. n-皇后问题 - AcWing题库](https://www.acwing.com/problem/content/845/) 宽度优先搜索 BFS[844. 走迷宫 - AcWing题库](https://www.acwing.com/problem/content/description/846/) 树与图的存储[846. 树的重心 - AcWing题库](http…...

【递归、搜索和回溯】二叉树中的深搜

个人主页 &#xff1a; zxctscl 专栏 【C】、 【C语言】、 【Linux】、 【数据结构】、 【算法】 如有转载请先通知 文章目录 前言1 2331. 计算布尔二叉树的值1.1 分析1.2 代码 2 129. 求根节点到叶节点数字之和2.1 分析2.2 代码 3 814. 二叉树剪枝3.1 分析3.2 代码 4 98. 验证…...

通俗的理解MFC消息机制

1. 消息是什么&#xff1f; 想象你家的门铃响了&#xff08;比如有人按门铃、敲门、或者有快递&#xff09;&#xff0c;这些都是“消息”。 在 MFC 中&#xff0c;消息就是系统或用户触发的各种事件&#xff0c;比如鼠标点击&#xff08;WM_LBUTTONDOWN&#xff09;、键盘输入…...

Windows CMD通过adb检查触摸屏Linux驱动是否被编译

检查 CONFIG_TOUCHSCREEN_GT9XX 是否启用&#xff0c;检查内核是否编译了Goodix GT9XX系列触摸屏的驱动支持 Windows CMD.exe输入&#xff1a; adb shell “zcat /proc/config.gz | grep CONFIG_TOUCHSCREEN_GT9XX” 如果返回CONFIG_TOUCHSCREEN_GT9XXy&#xff0c;表示驱动已编…...

Java并发编程-锁(八)

文章目录 Condition的使用和实现使用add(T t) 实现等待队列await()signal()signalAll() 总结 Condition的使用和实现 我们知道&#xff0c;任意一个Java Object&#xff0c;都拥有一组监视器方法&#xff0c;主要包括wait()、 wait(long timeout)、notify()以及notifyAll()方法…...

idea如何快速生成测试类

点击 code -> generate -> Test...