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

news2025/5/13 5:15:41

《用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 exitFlag
        break;
    end
    
    % 移动蛇
    [snake, ateFood] = moveSnake(snake, direction, food, width, height);
    
    % 检查游戏结束条件
    gameOver = checkCollision(snake, width, height);
    
    % 如果吃到食物
    if ateFood
        score = 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 true
        food = [randi(height), randi(width)];
        if ~ismember(food, snake, 'rows')
            break;
        end
    end
end

移动蛇函数

function [newSnake, ateFood] = moveSnake(snake, direction, food, width, height)
    % 计算新头部位置
    head = snake(1,:);
    switch direction
        case 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 ateFood
        newSnake = [newHead; snake]; % 吃到食物,不删除尾部
    else
        newSnake = [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:width
        for j = 1:height
            rectangle('Position',[i-0.5,j-0.5,1,1],...
                     'EdgeColor',[0.3 0.3 0.3],...
                     'FaceColor',[0.15 0.15 0.15]);
        end
    end
    
    % 绘制蛇
    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) > width
        collision = 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;
    end
    collision = 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.8
        foodType = 'normal';
    elseif r < 0.95
        foodType = 'golden';
    else
        foodType = 'toxic';
    end
    
    % 生成位置
    while true
        food = [randi(height), randi(width)];
        if ~ismember(food, snake, 'rows')
            break;
        end
    end
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
            
            % 计算从起点到邻居的临时gScore
            tempGScore = 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];
                end
            end
        end
    end
    
    % 开放集为空但未找到路径
    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; % 右
        else
            direction = 4; % 左
        end
    else
        % 没有找到路径,采取避险策略
        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];
            end
        end
        
        % 如果有安全方向,随机选择一个
        if ~isempty(validDirections)
            direction = validDirections(randi(length(validDirections)));
        else
            direction = 1; % 没有安全方向,默认向上(游戏结束)
        end
    end
end

🎉 完整代码 🎉

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

function snakeGame()
    % 主贪吃蛇游戏函数
    % 初始化游戏参数
    clc
    clear
    close all
    
    width = 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 aiMode
            direction = decideAIMove(snake, food, width, height, obstacles);
            modeText.String = '模式: AI自动';
        else
            modeText.String = '模式: 手动';
        end
        
        % 移动蛇
        [snake, ateFood] = moveSnake(snake, direction, food, width, height);
        
        % 检查游戏结束条件
        gameOver = checkCollision(snake, width, height, obstacles);
        
        % 如果吃到食物
        if ateFood
            switch foodType
                case '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) > 3
                        snake = snake(1:end-1,:); % 缩短
                    end
            end
            [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.Key
            case 'uparrow'
                if direction ~= 3 % 不能直接反向
                    direction = 1;
                end
            case 'rightarrow'
                if direction ~= 4
                    direction = 2;
                end
            case 'downarrow'
                if direction ~= 1
                    direction = 3;
                end
            case 'leftarrow'
                if direction ~= 2
                    direction = 4;
                end
            case 'space'
                aiMode = ~aiMode; % 切换AI模式
            case 'escape'
                gameOver = true;
        end
    end
end

function [food, foodType] = generateFood(width, height, snake)
    % 80%普通食物,15%黄金食物,5%有毒食物
    r = rand();
    if r < 0.8
        foodType = 'normal';
    elseif r < 0.95
        foodType = 'golden';
    else
        foodType = 'toxic';
    end
    
    % 生成位置
    while true
        food = [randi(height), randi(width)];
        if ~ismember(food, snake, 'rows')
            break;
        end
    end
end

function [newSnake, ateFood] = moveSnake(snake, direction, food, width, height)
    % 计算新头部位置
    head = snake(1,:);
    switch direction
        case 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 ateFood
        newSnake = [newHead; snake]; % 吃到食物,不删除尾部
    else
        newSnake = [newHead; snake(1:end-1,:)]; % 没吃到,删除尾部
    end
end

function collision = checkCollision(snake, width, height, obstacles)
    head = snake(1,:);
    % 检查边界碰撞
    if head(1) < 1 || head(1) > height || head(2) < 1 || head(2) > width
        collision = 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;
    end
    collision = false;
end

function drawGame(snake, food, width, height, score, obstacles, foodType)
    cla; % 清除当前轴
    
    % 绘制网格
    for i = 1:width
        for j = 1:height
            rectangle('Position',[i-0.5,j-0.5,1,1],...
                     'EdgeColor',[0.3 0.3 0.3],...
                     'FaceColor',[0.15 0.15 0.15]);
        end
    end
    
    % 绘制障碍物
    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');
        end
    end
    
    % 绘制蛇
    for i = 1:size(snake,1)
        pos = snake(i,:);
        color = [0 0.8 0]; % 身体绿色
        if i == 1
            color = [0 1 0]; % 头部亮绿色
        end
        rectangle('Position',[pos(2)-0.5,pos(1)-0.5,1,1],...
                 'Curvature',[0.3 0.3],...
                 'FaceColor',color,...
                 'EdgeColor','none');
    end
    
    % 绘制食物
    switch foodType
        case 'normal'
            foodColor = [1 0 0]; % 红色
        case 'golden'
            foodColor = [1 1 0]; % 黄色
        case 'toxic'
            foodColor = [0 1 0]; % 绿色
    end
    rectangle('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)];
        end
    end
    
    drawnow;
end

function 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; % 右
        else
            direction = 4; % 左
        end
    else
        % 没有找到路径,采取避险策略
        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];
            end
        end
        
        % 如果有安全方向,随机选择一个
        if ~isempty(validDirections)
            direction = validDirections(randi(length(validDirections)));
        else
            direction = 1; % 没有安全方向,默认向上(游戏结束)
        end
    end
end

function path = findPath(snake, food, width, height, obstacles)
    % 简化版A*路径寻找算法
    
    start = snake(1,:);
    goal = food;
    
    % 如果可以直接移动,直接返回
    if abs(start(1)-goal(1)) + abs(start(2)-goal(2)) == 1
        path = 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];
        end
    end
    
    % 尝试先垂直后水平
    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];
        end
    end
    
    % 返回找到的路径
    if ~isempty(path1)
        path = path1;
    elseif ~isempty(path2)
        path = path2;
    else
        path = [];
    end
end

在这里插入图片描述

在这里插入图片描述

结语 🏁

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

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

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

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

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

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

相关文章

【数据结构与算法】图的基本概念与遍历

目录 一、图的基本概念 1.1 图的基本组成 1.2 图的分类 1.3 顶点的度数 1.4 路径与回路 1.5 子图与特殊图 二. 图的存储结构 2.1 邻接矩阵 2.2 邻接表 三、深度优先遍历 3.1 原理 3.2 实现步骤 3.3 代码实现 四、广度优先遍历 4.1 原理 4.2 实现步骤 4.3 代码…

Linux云服务器配置git开发环境

文章目录 1. 安装 git2. git clone3. git add .4. git commit -m 提交记录5. git push&#x1f351; 异常原因&#x1f351; 解决办法 6. git pull7. git log8. git rm9. git mv10. git status 1. 安装 git sudo yum install git -y2. git clone 此命令的作用是从远程仓库把代…

手机浏览器IP归属地查询全指南:方法与常见问题解答

在当今数字化时代&#xff0c;手机浏览器已成为人们日常生活中不可或缺的工具之一。然而&#xff0c;在使用手机浏览器的过程中&#xff0c;有时我们需要了解当前网络连接的IP归属地信息&#xff0c;那么&#xff0c;手机浏览器IP归属地怎么查看呢&#xff1f;本文将详细介绍几…

Microsoft Azure DevOps针对Angular项目创建build版本的yaml

Azure DevOps针对Angular项目创建build版本的yaml&#xff0c;并通过变量控制相应job的执行与否。 注意事项&#xff1a;代码前面的空格是通过Tab控制的而不是通过Space控制的。 yaml文件中包含一下内容&#xff1a; 1. 自动触发build 通过指定code branch使提交到此代码库的…

Linux系统管理与编程16:PXE自动化安装部署centos7.9操作系统

兰生幽谷&#xff0c;不为莫服而不芳&#xff1b; 君子行义&#xff0c;不为莫知而止休。 0.准备 1&#xff09;防火墙和SELinux systemctl stop firewalld systemctl disable firewalld setenforce 0 sed -i s/^SELINUX.*/SELINUXdisabled/ /etc/selinux/config (很不好的…

如何通过ABAP获取SAP生产订单的目标成本

SAP存储生产订单成本的主要底表包括&#xff1a; COBK: CO凭证表头COEP: CO凭证行项目COSS: 来自CO内部的汇总数据COSP: 来自CO外部部的汇总数据 先说结论&#xff1a;SAP 对生产订单的目标成本是没有保存到底表的。那么如何通过代码的方式获取呢&#xff1f; K_KKB_KKBCS_O…

【leetcode100】最长重复子数组

1、题目描述 给两个整数数组 nums1 和 nums2 &#xff0c;返回 两个数组中 公共的 、长度最长的子数组的长度 。 示例 1&#xff1a; 输入&#xff1a;nums1 [1,2,3,2,1], nums2 [3,2,1,4,7] 输出&#xff1a;3 解释&#xff1a;长度最长的公共子数组是 [3,2,1] 。示例 2&…

基于Django框架的股票分红数据爬虫和展示系统

项目截图 一、项目简介 本项目是一个基于 Django 框架的股票分红数据爬虫和展示系统。它可以从东方财富网站爬取股票分红数据&#xff0c;并将数据存储到 Django 数据库中&#xff0c;同时提供数据查询、导出和图表展示功能。该系统为用户提供了一个方便的平台&#xff0c;用于…

QT高级(1)QTableView自定义委托集合,一个类实现若干委托

自定义委托集合 1同系列文章2 功能3 源码 1同系列文章 QT中级&#xff08;1&#xff09;QTableView自定义委托&#xff08;一&#xff09;实现QSpinBox、QDoubleSpinBox委托 QT中级&#xff08;2&#xff09;QTableView自定义委托&#xff08;二&#xff09;实现QProgressBar委…

小芯片大战略:Chiplet技术如何重构全球半导体竞争格局?

在科技飞速发展的今天&#xff0c;半导体行业作为信息技术的核心领域之一&#xff0c;其发展速度和创新水平对全球经济的发展具有举足轻重的影响。然而&#xff0c;随着芯片制造工艺的不断进步&#xff0c;传统的单片集成方式逐渐遇到了技术瓶颈&#xff0c;如摩尔定律逐渐逼近…

普通IT的股票交易成长史--股价起伏的真相-缺口(2)

声明&#xff1a;本文章的内容只是自己学习的总结&#xff0c;不构成投资建议。价格行为理论学习可参考简介中的几位&#xff0c;感谢他们的无私奉献。 送给自己的话&#xff1a; 仓位就是生命&#xff0c;绝对不能满仓&#xff01;&#xff01;&#xff01;&#xff01;&…

MindSpore框架学习项目-ResNet药物分类-模型优化

目录 5.模型优化 5.1模型优化 6.结语 参考内容&#xff1a; 昇思MindSpore | 全场景AI框架 | 昇思MindSpore社区官网 华为自研的国产AI框架&#xff0c;训推一体&#xff0c;支持动态图、静态图&#xff0c;全场景适用&#xff0c;有着不错的生态 本项目可以在华为云modelar…

Kubernetes(k8s)学习笔记(八)--KubeSphere定制化安装

1执行下面的命令修改上一篇中yaml文件来实现定制化安装devops kubectl edit cm -n kubesphere-system ks-installer 主要是将devops几个配置由False改为True 然后使用下面的命令查看安装日志 kubectl logs -n kubesphere-system $(kubectl get pod -n kubesphere-system -l …

养生:为健康生活筑牢根基

养生并非遥不可及的目标&#xff0c;而是贯穿于日常生活的点滴之中。从饮食、运动到心态调节&#xff0c;每一个环节都对我们的健康有着重要意义。以下为你详细介绍养生的实用策略&#xff0c;助力你开启健康生活模式。 饮食养生&#xff1a;科学搭配&#xff0c;滋养生命 合…

Linux510 ssh服务 ssh连接

arning: Permanently added ‘11.1.1.100’ (ECDSA) to the list of known hosts. rooot11.1.1.100’s password: Permission denied, please try again. rooot11.1.1.100’s password: Permission denied, please try again 还没生效 登不上了 失效了 sshcaozx26成功登录 …

关键点检测--使用YOLOv8对Leeds Sports Pose(LSP)关键点检测

目录 1. Leeds Sports Pose数据集下载2. 数据集处理2.1 获取标签2.2 将图像文件和标签文件处理成YOLO能使用的格式 3. 用YOLOv8进行训练3.1 训练3.2 预测 1. Leeds Sports Pose数据集下载 从kaggle官网下载这个数据集&#xff0c;地址为link&#xff0c;下载好的数据集文件如下…

独立按键控制LED

目录 1.独立按键介绍 2.原理图 3.C51数据运输 解释&#xff1a;<< >> ​编辑 解释&#xff1a;& | 解释&#xff1a;^ ~ ​编辑 4.C51基本语句 5.按键的跳动 6.独立按键控制LED亮灭代码 第一步&#xff1a; 第二步&#xff1a; 第三步&#xff1…

计算机科技笔记: 容错计算机设计03 系统可信性的度量 偶发故障期 浴盆曲线 韦布尔分布

可靠性 简化表达式 偶发故障期&#xff0c;系统发生故障概率趋近于一个常数 浴盆曲线 MTTF和计算 韦布尔分布 马尔可夫链 可靠度

爬虫准备前工作

1.Pycham的下载 网址&#xff1a;PyCharm: The only Python IDE you need 2.Python的下载 网址&#xff1a;python.org&#xff08;python3.9版本之后都可以&#xff09; 3.node.js的下载 网址&#xff1a;Node.js — 在任何地方运行 JavaScript&#xff08;版本使用18就可…

【PostgreSQL数据分析实战:从数据清洗到可视化全流程】7.1 主流可视化工具对比(Tableau/Matplotlib/Python库)

&#x1f449; 点击关注不迷路 &#x1f449; 点击关注不迷路 &#x1f449; 点击关注不迷路 文章大纲 第七章 可视化工具集成&#xff1a;Tableau、Matplotlib与Python库深度对比7.1 主流可视化工具对比&#xff1a;技术选型的决策框架7.1.1 工具定位与核心能力矩阵7.1.2 数据…