《用MATLAB玩转游戏开发》贪吃蛇的百变玩法:从命令行到AI对战

《用MATLAB玩转游戏开发:从零开始打造你的数字乐园》基础篇(2D图形交互)-🐍 贪吃蛇的百变玩法:从命令行到AI对战 🎮

欢迎来到这篇MATLAB贪吃蛇编程全攻略!本文将带你从零开始,一步步实现一个功能丰富的贪吃蛇游戏,最终进阶到AI自动对战。准备好你的MATLAB环境(2016b版本),让我们开始这段有趣的编程之旅吧!🚀

文章目录 📚

  • 《用MATLAB玩转游戏开发:从零开始打造你的数字乐园》基础篇(2D图形交互)-🐍 贪吃蛇的百变玩法:从命令行到AI对战 🎮
    • 1. 基础贪吃蛇实现 🏗️
      • 1.1 设计思路
      • 1.2 整体实现流程
        • 1.2.1 流程图说明
        • 1.2.2 关键路径说明
      • 1.3 实现步骤
        • 1.3.1 初始化游戏参数
        • 1.3.2 主游戏循环
        • 1.3.3 关键函数实现
    • 2. 图形界面美化 🎨
      • 2.1 创建图形窗口
      • 2.2 改进绘制函数
    • 3. 游戏功能扩展 ✨
      • 3.1 障碍物模式
      • 3.2 特殊食物效果
    • 4. AI对战实现 🤖
      • 4.1 路径寻找算法
      • 4.2 启发式函数
      • 4.3 AI决策函数
    • 🎉 完整代码 🎉
    • 结语 🏁

在这里插入图片描述

1. 基础贪吃蛇实现 🏗️

1.1 设计思路

贪吃蛇的基本原理很简单:控制蛇头移动,吃到食物后身体变长,碰到边界或自身游戏结束。我们需要考虑以下几个核心组件:

  • 游戏区域:二维矩阵表示
  • 蛇的表示:用坐标序列存储蛇身
  • 食物生成:随机位置出现
  • 游戏循环:处理输入、更新状态、渲染画面

1.2 整体实现流程

以下是贪吃蛇游戏的完整流程图设计,包含游戏初始化、主循环、用户输入、AI决策、碰撞检测等关键模块:

食物系统
碰撞检测
AI决策
初始化
AI模式
手动模式
碰撞
无碰撞
吃到食物
未吃到
路径存在
无路径
随机位置生成
生成新食物
确定食物类型
不同颜色渲染
检测边界碰撞
检测碰撞
检测自身碰撞
检测障碍物碰撞
计算到食物路径
AI决策移动方向
沿路径移动
避险策略
随机选择安全方向
设置游戏区域大小
初始化游戏
创建蛇初始位置
生成第一个食物
设置初始分数/速度
开始
绘制游戏界面
游戏主循环
检测输入模式
检测键盘输入
更新蛇位置
游戏结束处理
检测是否吃到食物
增加蛇长+更新分数
正常移动
绘制新帧
结束
1.2.1 流程图说明
  1. 初始化阶段

    • 设置游戏区域(20x20网格)
    • 创建长度为3的初始蛇(水平放置)
    • 随机生成第一个食物(含不同类型)
    • 初始化分数(0)和游戏速度(0.1秒/帧)
  2. 主游戏循环

    • 检测当前控制模式(AI/手动)
    • AI模式使用简化A*算法寻路
    • 手动模式响应键盘方向键
  3. 移动处理

    H
    计算新头部位置
    是否吃到食物
    保留尾部
    删除尾部
  4. 碰撞检测系统

    头部越界
    碰到身体
    碰到障碍物
    I1
    J
    I2
    I3
  5. 食物系统

    80%
    15%
    5%
    N2
    普通食物+10分
    黄金食物+50分+加速
    有毒食物-20分+缩短
  6. AI决策逻辑

    F1
    计算水平优先路径
    计算垂直优先路径
    路径有效?
    F3
1.2.2 关键路径说明
  1. 正常游戏流程

    开始 → 初始化 → 主循环 → 输入处理 → 移动 → 碰撞检测 → 食物检测 → 画面更新 → 主循环
    
  2. 游戏结束条件

    碰撞检测 → 边界/自身/障碍物碰撞 → 结束画面 → 退出
    
  3. AI决策流程

    AI模式激活 → 路径计算 → 存在路径 → 沿路径移动↘ 无路径 → 避险移动
    

小总结,以上所有流程图完整呈现了以下几部分内容,请再吸收一下哦:

  • 游戏状态转换
  • 用户输入与AI决策的并行处理
  • 碰撞检测的三重判断
  • 食物系统的概率分支
  • 蛇移动的核心逻辑

建议读者在阅读后面的代码时可以对照此流程图咀嚼代码,便于清晰理解各模块的交互关系。

1.3 实现步骤

1.3.1 初始化游戏参数
% 游戏区域大小
width = 20;
height = 20;% 初始化蛇 (初始长度为3,水平放置)
snake = [10,10; 10,9; 10,8];  % 初始方向 (1=上, 2=右, 3=下, 4=左)
direction = 2;  % 生成第一个食物
food = generateFood(width, height, snake);% 游戏状态
gameOver = false;
score = 0;
1.3.2 主游戏循环
while ~gameOver% 处理键盘输入[direction, exitFlag] = processInput(direction);if exitFlagbreak;end% 移动蛇[snake, ateFood] = moveSnake(snake, direction, food, width, height);% 检查游戏结束条件gameOver = checkCollision(snake, width, height);% 如果吃到食物if ateFoodscore = score + 10;food = generateFood(width, height, snake);end% 绘制游戏画面drawGame(snake, food, width, height, score);% 控制游戏速度pause(0.1);
end
1.3.3 关键函数实现

食物生成函数

function food = generateFood(width, height, snake)% 生成不在蛇身上的随机位置while truefood = [randi(height), randi(width)];if ~ismember(food, snake, 'rows')break;endend
end

移动蛇函数

function [newSnake, ateFood] = moveSnake(snake, direction, food, width, height)% 计算新头部位置head = snake(1,:);switch directioncase 1 % 上newHead = [head(1)-1, head(2)];case 2 % 右newHead = [head(1), head(2)+1];case 3 % 下newHead = [head(1)+1, head(2)];case 4 % 左newHead = [head(1), head(2)-1];end% 检查是否吃到食物ateFood = isequal(newHead, food);% 更新蛇身if ateFoodnewSnake = [newHead; snake]; % 吃到食物,不删除尾部elsenewSnake = [newHead; snake(1:end-1,:)]; % 没吃到,删除尾部end
end

2. 图形界面美化 🎨

命令行版本虽然功能完整,但视觉效果欠佳。让我们用MATLAB的图形功能来美化它!

2.1 创建图形窗口

function initGUI()figure('Name','MATLAB贪吃蛇','NumberTitle','off',...'MenuBar','none','Color',[0.2 0.2 0.2],...'KeyPressFcn',@keyPressHandler);axis equal; axis off; hold on;% 设置游戏区域set(gca,'XLim',[0.5 width+0.5],'YLim',[0.5 height+0.5],...'XTick',[],'YTick',[],'Color',[0.1 0.1 0.1]);% 分数显示scoreText = text(width+2, height/2, ['分数: 0'],...'Color','w','FontSize',12);
end

2.2 改进绘制函数

function drawGame(snake, food, width, height, score)cla; % 清除当前轴% 绘制网格for i = 1:widthfor j = 1:heightrectangle('Position',[i-0.5,j-0.5,1,1],...'EdgeColor',[0.3 0.3 0.3],...'FaceColor',[0.15 0.15 0.15]);endend% 绘制蛇for i = 1:size(snake,1)pos = snake(i,:);rectangle('Position',[pos(2)-0.5,pos(1)-0.5,1,1],...'Curvature',[0.3 0.3],...'FaceColor',[0 0.8 0],...'EdgeColor','none');end% 绘制蛇头 (不同颜色)head = snake(1,:);rectangle('Position',[head(2)-0.5,head(1)-0.5,1,1],...'Curvature',[0.3 0.3],...'FaceColor',[0 1 0],...'EdgeColor','none');% 绘制食物rectangle('Position',[food(2)-0.5,food(1)-0.5,1,1],...'Curvature',[1 1],...'FaceColor',[1 0 0],...'EdgeColor','none');% 更新分数scoreText.String = ['分数: ' num2str(score)];drawnow;
end

3. 游戏功能扩展 ✨

让我们为游戏添加更多有趣的功能!

3.1 障碍物模式

% 初始化障碍物
obstacles = [5,5; 5,6; 5,7; 15,15; 15,16; 15,17];% 修改碰撞检测函数
function collision = checkCollision(snake, width, height, obstacles)head = snake(1,:);% 检查边界碰撞if head(1) < 1 || head(1) > height || head(2) < 1 || head(2) > widthcollision = true;return;end% 检查自身碰撞if size(snake,1) > 1 && ismember(head, snake(2:end,:), 'rows')collision = true;return;end% 检查障碍物碰撞if exist('obstacles','var') && ~isempty(obstacles) && ismember(head, obstacles, 'rows')collision = true;return;endcollision = false;
end

3.2 特殊食物效果

% 定义食物类型
foodTypes = struct(...'normal', struct('color',[1 0 0], 'score',10, 'effect','none'),...'golden', struct('color',[1 1 0], 'score',50, 'effect','speedUp'),...'toxic', struct('color',[0 1 0], 'score',-20, 'effect','shrink')...
);% 修改食物生成函数
function [food, foodType] = generateFood(width, height, snake)% 80%普通食物,15%黄金食物,5%有毒食物r = rand();if r < 0.8foodType = 'normal';elseif r < 0.95foodType = 'golden';elsefoodType = 'toxic';end% 生成位置while truefood = [randi(height), randi(width)];if ~ismember(food, snake, 'rows')break;endend
end

4. AI对战实现 🤖

现在让我们实现一个简单的AI自动玩贪吃蛇!

4.1 路径寻找算法

我们将使用A*算法来寻找蛇头到食物的最短路径。

function path = findPath(snake, food, width, height, obstacles)% 实现A*算法寻找路径start = snake(1,:);goal = food;% 初始化开放集和关闭集openSet = start;closedSet = [];% 来自节点的路径cameFrom = containers.Map();% gScore[node] = 从起点到node的实际距离gScore = containers.Map(mat2str(start), 0);% fScore[node] = gScore[node] + h(node) (估计总距离)fScore = containers.Map(mat2str(start), heuristic(start, goal));while ~isempty(openSet)% 在开放集中找到fScore最小的节点[~, currentIdx] = min(cell2mat(values(fScore, mat2str(openSet))));current = openSet(currentIdx,:);% 如果到达目标if isequal(current, goal)path = reconstructPath(cameFrom, current);return;end% 从开放集移动到关闭集openSet(currentIdx,:) = [];closedSet = [closedSet; current];% 检查所有邻居neighbors = getNeighbors(current, width, height, snake, obstacles);for i = 1:size(neighbors,1)neighbor = neighbors(i,:);% 如果邻居在关闭集中,跳过if ismember(neighbor, closedSet, 'rows')continue;end% 计算从起点到邻居的临时gScoretempGScore = gScore(mat2str(current)) + 1;% 如果邻居不在开放集中,或者找到更好的路径if ~ismember(neighbor, openSet, 'rows') || ...tempGScore < gScore(mat2str(neighbor))cameFrom(mat2str(neighbor)) = current;gScore(mat2str(neighbor)) = tempGScore;fScore(mat2str(neighbor)) = tempGScore + heuristic(neighbor, goal);if ~ismember(neighbor, openSet, 'rows')openSet = [openSet; neighbor];endendendend% 开放集为空但未找到路径path = [];
end

4.2 启发式函数

function h = heuristic(pos, goal)% 曼哈顿距离h = abs(pos(1)-goal(1)) + abs(pos(2)-goal(2));
end

4.3 AI决策函数

function direction = decideAIMove(snake, food, width, height, obstacles)% 寻找路径path = findPath(snake, food, width, height, obstacles);if ~isempty(path)% 路径存在,按路径移动nextPos = path(1,:);head = snake(1,:);% 确定方向if nextPos(1) < head(1)direction = 1; % 上elseif nextPos(1) > head(1)direction = 3; % 下elseif nextPos(2) > head(2)direction = 2; % 右elsedirection = 4; % 左endelse% 没有找到路径,采取避险策略directions = [1,2,3,4]; % 上,右,下,左validDirections = [];% 检查每个方向是否安全for dir = directions[newSnake, ~] = moveSnake(snake, dir, food, width, height);if ~checkCollision(newSnake, width, height, obstacles)validDirections = [validDirections, dir];endend% 如果有安全方向,随机选择一个if ~isempty(validDirections)direction = validDirections(randi(length(validDirections)));elsedirection = 1; % 没有安全方向,默认向上(游戏结束)endend
end

🎉 完整代码 🎉

下面是一个完整可运行的贪吃蛇游戏代码,适配MATLAB 2016b:

function snakeGame()% 主贪吃蛇游戏函数% 初始化游戏参数clcclearclose allwidth = 20;height = 20;snake = [10,10; 10,9; 10,8];  % 初始蛇direction = 2;                 % 初始方向 (右)[food, foodType] = generateFood(width, height, snake);gameOver = false;score = 0;speed = 0.1;obstacles = [5,5; 5,6; 5,7; 15,15; 15,16; 15,17]; % 障碍物
%     aiMode = false; % 是否启用AI模式aiMode = true; % 是否启用AI模式% 初始化图形界面fig = figure('Name','MATLAB贪吃蛇','NumberTitle','off',...'MenuBar','none','Color',[0.2 0.2 0.2],...'KeyPressFcn',@keyPressHandler);axis equal; axis off; hold on;set(gca,'XLim',[0.5 width+0.5],'YLim',[0.5 height+0.5],...'XTick',[],'YTick',[],'Color',[0.1 0.1 0.1]);% 分数显示scoreText = text(width+2, height/2, ['分数: 0'],...'Color','w','FontSize',12);% 游戏模式显示modeText.String = text(width+2, height/2+2, ['模式: 手动'],...'Color','w','FontSize',12);% 主游戏循环while ~gameOver% AI模式下的自动移动if aiModedirection = decideAIMove(snake, food, width, height, obstacles);modeText.String = '模式: AI自动';elsemodeText.String = '模式: 手动';end% 移动蛇[snake, ateFood] = moveSnake(snake, direction, food, width, height);% 检查游戏结束条件gameOver = checkCollision(snake, width, height, obstacles);% 如果吃到食物if ateFoodswitch foodTypecase 'normal'score = score + 10;case 'golden'score = score + 50;speed = max(0.05, speed * 0.9); % 加速case 'toxic'score = max(0, score - 20);if size(snake,1) > 3snake = snake(1:end-1,:); % 缩短endend[food, foodType] = generateFood(width, height, snake);end% 绘制游戏画面drawGame(snake, food, width, height, score, obstacles, foodType);% 控制游戏速度pause(speed);end% 游戏结束显示text(width/2-2, height/2, '游戏结束!', 'Color','r','FontSize',20);text(width/2-4, height/2-1, ['最终分数: ' num2str(score)],...'Color','w','FontSize',15);% 键盘处理函数function keyPressHandler(~, event)switch event.Keycase 'uparrow'if direction ~= 3 % 不能直接反向direction = 1;endcase 'rightarrow'if direction ~= 4direction = 2;endcase 'downarrow'if direction ~= 1direction = 3;endcase 'leftarrow'if direction ~= 2direction = 4;endcase 'space'aiMode = ~aiMode; % 切换AI模式case 'escape'gameOver = true;endend
endfunction [food, foodType] = generateFood(width, height, snake)% 80%普通食物,15%黄金食物,5%有毒食物r = rand();if r < 0.8foodType = 'normal';elseif r < 0.95foodType = 'golden';elsefoodType = 'toxic';end% 生成位置while truefood = [randi(height), randi(width)];if ~ismember(food, snake, 'rows')break;endend
endfunction [newSnake, ateFood] = moveSnake(snake, direction, food, width, height)% 计算新头部位置head = snake(1,:);switch directioncase 1 % 上newHead = [head(1)-1, head(2)];case 2 % 右newHead = [head(1), head(2)+1];case 3 % 下newHead = [head(1)+1, head(2)];case 4 % 左newHead = [head(1), head(2)-1];end% 检查是否吃到食物ateFood = isequal(newHead, food);% 更新蛇身if ateFoodnewSnake = [newHead; snake]; % 吃到食物,不删除尾部elsenewSnake = [newHead; snake(1:end-1,:)]; % 没吃到,删除尾部end
endfunction collision = checkCollision(snake, width, height, obstacles)head = snake(1,:);% 检查边界碰撞if head(1) < 1 || head(1) > height || head(2) < 1 || head(2) > widthcollision = true;return;end% 检查自身碰撞if size(snake,1) > 1 && ismember(head, snake(2:end,:), 'rows')collision = true;return;end% 检查障碍物碰撞if exist('obstacles','var') && ~isempty(obstacles) && ismember(head, obstacles, 'rows')collision = true;return;endcollision = false;
endfunction drawGame(snake, food, width, height, score, obstacles, foodType)cla; % 清除当前轴% 绘制网格for i = 1:widthfor j = 1:heightrectangle('Position',[i-0.5,j-0.5,1,1],...'EdgeColor',[0.3 0.3 0.3],...'FaceColor',[0.15 0.15 0.15]);endend% 绘制障碍物if exist('obstacles','var') && ~isempty(obstacles)for i = 1:size(obstacles,1)pos = obstacles(i,:);rectangle('Position',[pos(2)-0.5,pos(1)-0.5,1,1],...'FaceColor',[0.5 0.5 0.5],...'EdgeColor','none');endend% 绘制蛇for i = 1:size(snake,1)pos = snake(i,:);color = [0 0.8 0]; % 身体绿色if i == 1color = [0 1 0]; % 头部亮绿色endrectangle('Position',[pos(2)-0.5,pos(1)-0.5,1,1],...'Curvature',[0.3 0.3],...'FaceColor',color,...'EdgeColor','none');end% 绘制食物switch foodTypecase 'normal'foodColor = [1 0 0]; % 红色case 'golden'foodColor = [1 1 0]; % 黄色case 'toxic'foodColor = [0 1 0]; % 绿色endrectangle('Position',[food(2)-0.5,food(1)-0.5,1,1],...'Curvature',[1 1],...'FaceColor',foodColor,...'EdgeColor','none');% 更新分数textObjects = findobj(gca,'Type','text');for i = 1:length(textObjects)if strcmp(textObjects(i).String(1:2), '分数')textObjects(i).String = ['分数: ' num2str(score)];endenddrawnow;
endfunction direction = decideAIMove(snake, food, width, height, obstacles)% 简单AI决策:寻找食物路径或避险% 1. 尝试寻找路径到食物path = findPath(snake, food, width, height, obstacles);if ~isempty(path)% 路径存在,按路径移动nextPos = path(1,:);head = snake(1,:);% 确定方向if nextPos(1) < head(1)direction = 1; % 上elseif nextPos(1) > head(1)direction = 3; % 下elseif nextPos(2) > head(2)direction = 2; % 右elsedirection = 4; % 左endelse% 没有找到路径,采取避险策略directions = [1,2,3,4]; % 上,右,下,左validDirections = [];% 检查每个方向是否安全for dir = directions[newSnake, ~] = moveSnake(snake, dir, food, width, height);if ~checkCollision(newSnake, width, height, obstacles)validDirections = [validDirections, dir];endend% 如果有安全方向,随机选择一个if ~isempty(validDirections)direction = validDirections(randi(length(validDirections)));elsedirection = 1; % 没有安全方向,默认向上(游戏结束)endend
endfunction path = findPath(snake, food, width, height, obstacles)% 简化版A*路径寻找算法start = snake(1,:);goal = food;% 如果可以直接移动,直接返回if abs(start(1)-goal(1)) + abs(start(2)-goal(2)) == 1path = goal;return;end% 简单实现:总是尝试先水平后垂直或先垂直后水平path1 = []; path2 = [];% 尝试先水平后垂直if start(2) ~= goal(2)intermediate = [start(1), goal(2)];if ~checkCollision([intermediate; snake], width, height, obstacles) && ...~checkCollision([goal; intermediate; snake], width, height, obstacles)path1 = [intermediate; goal];endend% 尝试先垂直后水平if start(1) ~= goal(1)intermediate = [goal(1), start(2)];if ~checkCollision([intermediate; snake], width, height, obstacles) && ...~checkCollision([goal; intermediate; snake], width, height, obstacles)path2 = [intermediate; goal];endend% 返回找到的路径if ~isempty(path1)path = path1;elseif ~isempty(path2)path = path2;elsepath = [];end
end

在这里插入图片描述

在这里插入图片描述

结语 🏁

恭喜你完成了这个MATLAB贪吃蛇游戏的完整实现!🎉 从基础版本到图形界面,再到AI自动对战,我们一步步构建了一个功能丰富的游戏。

你可以进一步扩展这个项目:

  • 添加更多特殊食物效果 🍎🍇🍍
  • 实现多人对战模式 👥
  • 改进AI算法,使用更智能的路径规划 🧠
  • 添加音效和更多视觉特效 ✨

希望这篇教程对你有所帮助!Happy coding! 💻🐍

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

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

相关文章

Android平台FFmpeg音视频开发深度指南

一、FFmpeg在Android开发中的核心价值 FFmpeg作为业界领先的多媒体处理框架&#xff0c;在Android音视频开发中扮演着至关重要的角色。它提供了&#xff1a; 跨平台支持&#xff1a;统一的API处理各种音视频格式完整功能链&#xff1a;从解码、编码到滤镜处理的全套解决方案灵…

AI大模型驱动的智能座舱研发体系重构

随着AI大模型&#xff08;如LLM、多模态模型&#xff09;的快速发展&#xff0c;传统智能座舱研发流程面临巨大挑战。传统座舱研发以需求驱动、功能固定、架构封闭为特点&#xff0c;而AI大模型的引入使得座舱系统向自主决策、动态适应、持续进化的方向发展。 因此思考并提出一…

Day20 常见降维算法分析

一、常见的降维算法 LDA线性判别PCA主成分分析t-sne降维 二、降维算法原理 2.1 LDA 线性判别 原理 &#xff1a;LDA&#xff08;Linear Discriminant Analysis&#xff09;线性判别分析是一种有监督的降维方法。它的目标是找到一个投影方向&#xff0c;使得不同类别的数据在…

Python----机器学习(模型评估:准确率、损失函数值、精确度、召回率、F1分数、混淆矩阵、ROC曲线和AUC值、Top-k精度)

一、模型评估 1. 准确率&#xff08;Accuracy&#xff09;&#xff1a;这是最基本的评估指标之一&#xff0c;表示模型在测试集上正确 分类样本的比例。对于分类任务而言&#xff0c;准确率是衡量模型性能的直观标准。 2. 损失函数值&#xff08;Loss&#xff09;&#xff1…

cdn 是什么?

内容分发网络&#xff0c;Content Delivery Network 介绍 CDN&#xff08;Content Delivery Network&#xff09;是一种将内容分发到靠近用户的边缘服务器&#xff0c;以加速访问速度、减少延迟、降低源站压力的网络系统。 CDN 把网站的静态资源&#xff08;如 HTML、JS、CSS、…

BUCK基本原理学习总结-20250509

一、电感伏秒平衡特性 处于稳定状态的电感,开关导通时间(电流上升段)的伏秒数须与开关关断(电流下降段)时的伏秒数在数值上相等,尽管两者符号相反。这也表示,绘出电感电压对时间的曲线,导通时段曲线的面积必须等于关断时段曲线的面积。 二、BUCK的基本概念和原理 基…

【K8S系列】Kubernetes常用 命令

以下为的 Kubernetes 超全常用命令文档&#xff0c;涵盖集群管理、资源操作、调试排错等核心场景&#xff0c;结合示例与解析&#xff0c; 高效运维 Kubernetes 环境。 一、集群与节点管理 1. 集群信息查看 查看集群基本信息kubectl cluster-info # 显示API Server、DNS等核…

【Django】REST 常用类

ModelSerializer serializers.ModelSerializer 是 Django REST framework&#xff08;DRF&#xff09;里的一个强大工具&#xff0c;它能极大简化序列化和反序列化 Django 模型实例的流程。下面从多个方面详细介绍它&#xff1a; 1. 基本概念 序列化是把 Django 模型实例转化…

GuassDB如何创建兼容MySQL语法的数据库

GaussDB简介 GaussDB是由华为推出的一款全面支持OLTP和OLAP的分布式关系型数据库管理系统。它采用了分布式架构和高可靠性设计&#xff0c;可以满足大规模数据存储和处理的需求。GaussDB具有高性能、高可靠性和可扩展性等特点&#xff0c;适用于各种复杂的业务场景&#xff0c…

【无标题】I/O复用(epoll)三者区别▲

一、SOCKET-IO复用技术 定义&#xff1a;SOCKET - IO复用技术是一种高效处理多个套接字&#xff08;socket&#xff09;的手段&#xff0c;能让单个线程同时监听多个文件描述符&#xff08;如套接字&#xff09;上的I/O事件&#xff08;像可读、可写、异常&#xff09;&#x…

spring中的@Qualifier注解详解

1. 核心作用 Qualifier是Spring框架中用于解决依赖注入歧义性的关键注解。当容器中存在多个相同类型的Bean时&#xff0c;Autowired默认按类型自动装配会抛出NoUniqueBeanDefinitionException异常&#xff0c;此时通过Qualifier指定Bean的唯一标识符&#xff08;名称或自定义限…

Python爬虫实战:获取文学网站四大名著并保存到本地

一、引言 1.1 研究背景 中国古典四大名著承载着深厚的文化底蕴,是中华民族的宝贵精神财富。在互联网时代,网络文学资源虽丰富多样,但存在分散、质量参差不齐等问题 。部分文学网站存在访问限制、资源缺失等情况,用户难以便捷获取完整、高质量的经典著作内容。开发专业的爬…

【一】浏览器的copy as fetch和copy as bash的区别

浏览器的copy as fetch和copy as bash的区别 位置&#xff1a;devTools->network->请求列表右键 copy as fetch fetch("https://www.kuaishou.com/graphql", {"headers": {"accept": "*/*","accept-language": &qu…

渠道销售简历模板范文

模板信息 简历范文名称&#xff1a;渠道销售简历模板范文&#xff0c;所属行业&#xff1a;其他 | 职位&#xff0c;模板编号&#xff1a;KRZ3J3 专业的个人简历模板&#xff0c;逻辑清晰&#xff0c;排版简洁美观&#xff0c;让你的个人简历显得更专业&#xff0c;找到好工作…

Java大数据可视化在城市空气质量监测与污染溯源中的应用:GIS与实时数据流的技术融合

随着城市化进程加速&#xff0c;空气质量监测与污染溯源成为智慧城市建设的核心议题。传统监测手段受限于数据离散性、分析滞后性及可视化能力不足&#xff0c;难以支撑实时决策。2025年4月27日发布的《Java大数据可视化在城市空气质量监测与污染溯源中的应用》一文&#xff0c…

《面向对象程序设计-C++》实验五 虚函数的使用及抽象类

程序片段编程题 1.【问题描述】 基类shape类是一个表示形状的抽象类&#xff0c;area( )为求图形面积的函数。请从shape类派生三角形类(triangle)、圆类&#xff08;circles&#xff09;、并给出具体的求面积函数。注&#xff1a;圆周率取3.14 #include<iostream> #in…

用c语言实现——一个交互式的中序线索二叉树系统,支持用户动态构建、线索化、遍历和查询功能

知识补充&#xff1a;什么是中序线索化 中序遍历是什么 一、代码解释 1.结构体定义 Node 结构体&#xff1a; 成员说明&#xff1a; int data&#xff1a;存储节点的数据值。 struct Node* lchild&#xff1a;该节点的左孩子 struct Node* rchild&#xff1a;该节点的右孩子…

高拟人化客服机器人显著提升用户接受度

高拟人化客服机器人显著提升用户接受度 目录 高拟人化客服机器人显著提升用户接受度思维导图详细总结一、研究背景与目的二、理论基础与变量设计三、研究方法与实验设计四、核心结论与策略建议五、研究局限与未来方向关键问题与答案高拟人化客服机器人显著提升用户接受度,且与…

202534 | KafKa简介+应用场景+集群搭建+快速入门

Apache Kafka 简介 一、什么是 Kafka&#xff1f; Apache Kafka 是一个高吞吐量、分布式、可扩展的流处理平台&#xff0c;用于构建实时数据管道和流应用程序。它最初由 LinkedIn 开发&#xff0c;并于 2011 年开源&#xff0c;目前由 Apache 软件基金会进行维护。 Kafka 具备…

Blender 初学者指南 以及模型格式怎么下载

glbxz.com glbxz.com 可以直接下载Blender格式模型 第 1 步&#xff1a;打开 这就是 blender 打开时的样子。 您面对的是左侧和右侧的工具栏&#xff0c;顶部是文件作&#xff0c;底部是时间轴&#xff0c;中间是 3D 视图。 Blender 的默认起始网格是一个立方体&#xff0c…