《用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=[01−10]
应用到点(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} x′y′=0⋅x+(−1)⋅y=−y=1⋅x+0⋅y=x
2.2 方块旋转实现
俄罗斯方块中,每个方块由4个小方块(我们称为"方块块")组成。旋转时,我们需要:
- 找到方块的旋转中心(通常是中心块或靠近中心的位置)
- 将每个方块块相对于旋转中心应用旋转矩阵
- 确保旋转后的位置是合法的(不超出边界或与已有方块重叠)
💡 小技巧:我们可以将方块表示为相对坐标,这样旋转计算会更方便!
3. 游戏架构设计 🏗️
我们的MATLAB实现将采用以下结构:
- 主循环:控制游戏流程
- 游戏板:20行×10列的矩阵表示
- 当前方块:存储当前下落方块的信息
- 绘图函数:实时更新游戏界面
- 键盘回调:处理玩家输入
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俄罗斯方块的实现!🎉 通过这个项目,我们学到了:
- 旋转矩阵在游戏开发中的应用
- 二维游戏的基本架构设计
- MATLAB图形界面和回调函数的用法
扩展思路:
- 添加音效和动画效果 🎵
- 实现"下一个方块"预览功能 👀
- 添加难度随分数增加而提高的机制 📈
- 保存最高分记录 🏆
希望这篇教程对你有所帮助!如果有任何问题或建议,欢迎留言讨论。Happy coding! 💻😊
相关文章:
《用MATLAB玩转游戏开发:从零开始打造你的数字乐园》基础篇(2D图形交互)-俄罗斯方块:用旋转矩阵打造经典
《用MATLAB玩转游戏开发:从零开始打造你的数字乐园》基础篇(2D图形交互)-🎮 俄罗斯方块:用旋转矩阵打造经典 🧊 大家好!今天我将带大家用MATLAB实现经典的俄罗斯方块游戏。我们将从数学原理出发…...
通过user-agent来源判断阻止爬虫访问网站,并防止生成[ error ] NULL日志
一、TP5.0通过行为(Behavior)拦截爬虫并避免生成 [ error ] NULL 错误日志 1. 创建行为类(拦截爬虫) 在 application/common/behavior 目录下新建BlockBot.php ,用于识别并拦截爬虫请求: <?php name…...
微服务的“迷宫” - 我们为何需要服务网格?
微服务的“迷宫” - 我们为何需要服务网格? 你好!欢迎来到我们的服务网格探索之旅。近年来,“微服务架构”无疑是软件开发领域最热门的词汇之一。它将庞大的单体应用拆分成一组小而独立的、可以独立开发、部署和扩展的服务单元,带来了前所未有的敏捷性和弹性。开发团队可以…...
Ubuntu 安装 HAProxy
HAProxy 是什么 HAProxy(High Availability Proxy) 是一个 高性能、高可用的 TCP 和 HTTP 负载均衡器与代理服务器。 HAProxy 的特点 特性说明支持协议HTTP、HTTPS、TCP高性能使用 C 语言编写,性能极高高可用与 Keepalived 配合可实现主备健…...
VUE CLI - 使用VUE脚手架创建前端项目工程
前言 前端从这里开始,本文将介绍如何使用VUE脚手架创建前端工程项目 1.预准备(编辑器和管理器) 编辑器:推荐使用Vscode,WebStorm,或者Hbuilder(适合刚开始练手使用),个…...
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作为现代开发运维的利器,其镜像和容器的管理技巧直接影响效率。当我们需要跨环境迁移容器状态时,docker export和docker import这对组合命令就能大显身手。本文带你彻底搞懂它们的核心逻辑、使用场景及避坑指南! 一、Docker export&…...
数字孪生实战笔记(1)数字孪生的含义、应用及技术体系
一、含义 数字孪生(Digital Twin)是一种通过数字化模型在虚拟世界中实时映射和模拟物理实体、系统或过程的技术。它的核心目的是通过对现实对象的建模、感知、分析和预测,实现对物理世界的全面感知、智能控制和优化决策。数字孪生 实体对象 …...
计算机网络 4-2-2 网络层(IPv4)
2.7 网络地址转换NAT 引入端口号:IP地址端口号→一个特定的进程,(不同主机可能存在相同端口号) 网络层实现了“主机到主机”的通信。网络层在IP数据报的首部,指明源IP地址、目的IP地址 传输层实现了“端到端” &#…...
第二个简单的SpringBoot和Vue前后端全栈的todoapp案例
项目源于哔哩哔哩,按视频手敲了一下,补充上代码和一些细节。 全栈项目实践:1小时快速入门SpringBootvue3element-plus_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1LH4y1w7Nd/?spm_id_from333.1387.favlist.content.click&vd_…...
探秘 Canva AI 图像生成器:重塑设计创作新范式
Canva 凭借简洁易用的界面和海量模板资源,早已成为设计师和普通用户的心头好。而 Canva AI 图像生成器的推出,更是为设计领域带来了一场深刻变革,以智能化的手段重塑了图像创作的方式与边界。 技术内核:AI 如何驱动图像生成 Can…...
栈应用:辅助站(c++)
干货 今天讲讲最大辅助栈和最小辅助栈 主栈进入元素的时候 最大辅助栈:保证新元素大于等于(辅助栈)顶的时候,再进入辅助栈这样就能保证最大辅助栈的栈顶元素 是主栈中的最大值 主栈出栈的时候 最大辅助栈:主栈出栈元素如果等于(辅助栈)的栈顶元素,再…...
AI时代的数据可视化:未来已来
你有没有想过,数据可视化在未来会变成什么样?随着人工智能(AI)的飞速发展,数据可视化已经不再是简单的图表和图形,而是一个充满无限可能的智能领域。AI时代的可视化不仅能自动解读数据,还能预测…...
常见音频主控芯片以及相关厂家总结
音频主控芯片是音频设备(如蓝牙耳机、音箱、功放等)的核心组件,负责音频信号的解码、编码、处理和传输。以下是常见的音频主控芯片及其相关厂家,按应用领域分类: 蓝牙音频芯片 主要用于无线耳机、音箱等设备࿰…...
湖仓一体架构在金融典型数据分析场景中的实践
在数字经济与金融科技深度融合的今天,数据已成为金融机构的核心战略资产。然而,传统数据架构面临着三大困局,制约着金融机构数据价值的充分释放。 一、需求驱动更多银行数据分析场景 金融机构,特别是银行业,面临着双重…...
VBA —— 学习Day5
子程序与函数 子程序:实现特定功能的程序代码块 子程序语法: [修饰符] Sub 子程序名称([参数1,参数2,参数3]) 代码块 End Sub 子程序如何调用: 1 . 子程序名 [参数1,参数2,...] 2. Cal…...
Flink 实时数据一致性与 Exactly-Once 语义保障实战
在构建企业级实时数仓的过程中,“数据一致性” 是保障指标准确性的核心能力,尤其是在金融、电商、医疗等对数据敏感度极高的场景中。Flink 作为流批一体的实时计算引擎,其内建的 Exactly-Once 语义为我们提供了强有力的保障机制。本篇将围绕如何实现端到端的数据一致性、如何…...
Java云原生到底是啥,有哪些技术
☁️ Java云原生:程序员の修仙飞升指南(附渡劫技巧) 一、修仙世界观:传统程序 vs 云原生程序 🏡 传统Java程序(老宅院) 特点:单体大瓦房、扩建要拆墙(耦合度高…...
IPM IMI111T-026H 高效风扇控制板
概述: REF-MHA50WIMI111T 是一款专为风扇驱动设计的参考开发板,搭载了英飞凌的IMI111T-026H iMOTION™智能功率模块(IPM)。这个模块集成了运动控制引擎(MCE)、三相栅极驱动器和基于IGBT的功率级,全部封装在一个紧凑的DSO22封装中。REF-MHA50…...
JavaScript基础-局部作用域
在JavaScript中,理解不同种类的作用域是掌握这门语言的关键之一。作用域决定了变量和函数的可访问性(即可见性和生命周期)。与全局作用域相对应的是局部作用域,它限制了变量和函数只能在其定义的特定范围内被访问。本文将深入探讨…...
[特殊字符]Meilisearch:AI驱动的现代搜索引擎
前言 大家好,我是MAI麦造! 上文介绍一了Manticore Search 这款轻量级的搜索引擎,这次又有了新的发现!传送门: Elasticsearch太重?它的超轻量的替代品找到了! 这是一个让我超级兴奋的AI搜索引…...
K8S Svc Port-forward 访问方式
在 Kubernetes 中,kubectl port-forward 是一种 本地与集群内资源(Pod/Service)建立临时网络隧道 的访问方式,无需暴露服务到公网,适合开发调试、临时访问等场景。以下是详细使用方法及注意事项: 1. 基础用…...
SD06_前后端分离项目部署流程(采用Nginx)
本文档详细描述了如何在Ubuntu 20.04服务器上从零开始部署Tlias前后端分离系统。Tlias系统由Spring Boot后端(tlias-web-management)和Vue前端(vue-tlias-management)组成。 目录 环境准备安装MySQL数据库部署后端项目部署前端项…...
计算机网络:家庭路由器WiFi信号的发射和手机终端接收信号原理?
WiFi路由器与手机之间的信号传输涉及多个技术层面的协作,以下是其工作原理的详细步骤: 一、数据封装与协议处理 应用层数据生成 用户操作(如浏览网页、视频播放)产生数据包,经TCP/IP协议栈逐层封装,添加IP地址(网络层)和MAC地址(数据链路层)。协议封装 数据包被封装…...
【Redis】string
文章目录 string 字符串常用命令设置和获取setgetmget & mset 计数操作incr & incrbydecr & decrbyincrbyfloat 字符串操作appendstrlengetrangesetrange string 字符串 关于 Redis 的字符串,有几点需要注意 Redis 所有的 key 的类型都是字符串类型va…...
vue3的响应式设计原理
Vue 3 的响应式设计是其核心特性之一,依赖于 Proxy 和 依赖收集机制,相比 Vue 2 的 Object.defineProperty,Vue 3 的响应式系统更加高效、灵活且易于维护。 以下是 Vue 3 响应式设计的核心原理: 一、核心机制概览 使用 Proxy 实现…...
学习黑客5 分钟深入浅出理解Linux Logs [特殊字符]
5 分钟深入浅出理解Linux Logs 📝 大家好!今天我们将探索Linux系统中的日志机制——这是系统管理和安全分析的重要组成部分。在网络安全学习特别是TryHackMe平台上的挑战中,理解和分析日志是发现入侵痕迹、追踪攻击者行为和收集证据的关键技…...
【Docker系列】docker inspect查看容器部署位置
💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...
journalctl使用
journalctl 可以查看很多服务的日志,比如 docker,ollama 等。 1. 查看 xx 服务的最新日志(实时滚动) sudo journalctl -u docker -f -f 参数表示 跟随(follow),会持续输出最新日志࿰…...
Satori:元动作 + 内建搜索机制,实现超级推理能力
Satori:元动作 内建搜索机制,实现超级推理能力 论文大纲一、背景:LLM 推理增强的三类方法1. 基于大规模监督微调(SFT)的推理增强2. 借助外部机制在推理时进行搜索 (RLHF / 多模型 / 工具)3. 现有局限性总结 二、Sator…...
基于语言模型的依存关系分句 和 主题变换检测(基于词频和句段得分)的 意思
🧠 一、基于语言模型的依存关系分句(Dependency-based Segmentation) ✅ 说人话: 用语言模型判断句子里的语法结构(谁依赖谁),找到合理的“断点”,把太长的句子拆成语法上更自然的小…...
计算机体系结构一些笔记
1、异构计算:CPU也像人类社会一样存在专业分工。 异构计算(Heterogeneous Computing)是指不同类型的计算单元合作完 成计算任务。每个计算单元采用不同的架构,分别擅长处理某一种类型 的计算任务。整个计算任务分解为小的单位&…...
Go语言——goflow工作流使用
一、引入依赖 这个很坑,他不允许连接带密码的redis,只能使用不带密码的redis,要带密码的话得自己改一下源代码,无语 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 作者背景 巴黎萨克雷大学,索邦大学ÿ…...
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 简单的演示 : 结果是 这个就是异或 异或的作用 1、比较两数是否相等 2、可以进行加密 加密就是需要key 明文 :0b010110 key : 0b1010001 这个时候就能进行加密 明文 ^ key密文 还有这个加密比…...
深圳SMT贴片加工厂制造流程解析
内容概要 作为大湾区电子制造产业链的重要节点,深圳SMT贴片加工厂凭借精密的生产体系与技术创新,构建了涵盖12道核心工序的标准化流程。从PCB基板的来料检验开始,通过全自动贴片机的高精度元件定位、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)
🍺三维数字地球系列相关文章如下🍺:1【小沐学GIS】基于C绘制三维数字地球Earth(OpenGL、glfw、glut)第一期2【小沐学GIS】基于C绘制三维数字地球Earth(OpenGL、glfw、glut、GIS)第二期3【小沐学…...
Windows 系统 - Trae 内 终端 无法使用 node (重新配置 nodejs 路径)
想在 Trae 中尝试一下 mcp, 所以 Windows 系统下安装了 node.js. 安装成功后, 在 Windows 的 powershell 下可以 node -v, 但是在 Trae 的终端下输入 node -v 时, 识别提示不能识别 node 命令. 参考了 vscode 下的一种解决方式 VS Code 内终端无法使用 node 解决方案是相似的…...
AI编程: 使用Trae1小时做成的音视频工具,提取音频并识别文本
背景 在上个月,有网页咨询我怎么才能获取视频中的音频并识别成文本,我当时给他的回答是去问一下AI,让AI来给你答案。 他觉得我在敷衍他,大骂了我一顿,大家觉得我的回答对吗? 小编心里委屈,我…...
springCloud/Alibaba常用中间件之Nacos服务注册与发现
文章目录 SpringCloud Alibaba:依赖版本补充六、Nacos:服务注册与发现1、下载安装Nacos2、服务注册1. 导入依赖(这里以服务提供者为例)2. 修改配置文件和主启动类3. 创建业务类4. 测试 3.服务映射1. 导入依赖2. 修改配置文件和主启动类3. 创建业务类和RestTemplate配置类用来提…...
鸿蒙 所有API缩略图鉴
从HarmonyOS NEXT Developer Preview1(API 11)版本开始,HarmonyOS SDK以 Kit 维度提供丰富、完备的开放能力,涵盖应用框架、应用服务、系统、媒体、AI、图形在内的六大领域,共计30000个API...
互联网大厂Java求职面试:AI集成场景下的技术挑战与架构设计
标题:互联网大厂Java求职面试:AI集成场景下的技术挑战与架构设计 第一幕:向量数据库选型与性能调优 技术总监(严肃脸): 郑薪苦,我们最近在做一个基于大语言模型的企业级AI应用,需要…...
搜索与图论
文章目录 搜索与图论深度优先搜索 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…...
【递归、搜索和回溯】二叉树中的深搜
个人主页 : 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. 消息是什么? 想象你家的门铃响了(比如有人按门铃、敲门、或者有快递),这些都是“消息”。 在 MFC 中,消息就是系统或用户触发的各种事件,比如鼠标点击(WM_LBUTTONDOWN)、键盘输入…...
Windows CMD通过adb检查触摸屏Linux驱动是否被编译
检查 CONFIG_TOUCHSCREEN_GT9XX 是否启用,检查内核是否编译了Goodix GT9XX系列触摸屏的驱动支持 Windows CMD.exe输入: adb shell “zcat /proc/config.gz | grep CONFIG_TOUCHSCREEN_GT9XX” 如果返回CONFIG_TOUCHSCREEN_GT9XXy,表示驱动已编…...
Java并发编程-锁(八)
文章目录 Condition的使用和实现使用add(T t) 实现等待队列await()signal()signalAll() 总结 Condition的使用和实现 我们知道,任意一个Java Object,都拥有一组监视器方法,主要包括wait()、 wait(long timeout)、notify()以及notifyAll()方法…...
idea如何快速生成测试类
点击 code -> generate -> Test...