百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

AI编程新对决:Deepseek与Qwen2.5谁能在扫雷游戏中更胜一筹?

myzbx 2025-03-20 16:52 8 浏览

在当今快速发展的科技时代,人工智能(AI)已经渗透到各个领域,软件开发也不例外。AI编程工具的出现不仅改变了传统的编码方式,还大大提高了开发效率和代码质量。在这场技术革命中,Deepseek和Qwen-2.5作为代表性的AI编程工具,展现了各自独特的功能和优势。

Deepseek以其快速响应和直观的代码生成能力著称,特别适合需要迅速完成原型开发的场景。它能够根据用户的需求,快速生成相应的代码片段或完整的项目结构,极大地简化了开发流程。而对于复杂任务的支持,则是Qwen-2.5的强项。支持多语言编程的Qwen-2.5在处理复杂的逻辑和优化代码性能方面表现出色,为开发者提供了更多可能性。



通过详细解析Deepseek和Qwen-2.5在实现扫雷游戏过程中的表现,我们将探讨它们各自的优势与不足。这不仅有助于理解AI编程工具的实际应用效果,也为开发者选择合适的开发工具有所启发。

第一部分:评测模型介绍

由于个人电脑配置限制,本次评测的两个国产明星大模型都是32b版本,其中由于Deepseek-r1 没有专门的编程版本,所以采用通用版本,Qwen2.5采用Qwen2.5-coder编程版本。

  • Deepseek-r1:32B: 模型大小20G,320亿参数,基础版,非蒸馏版本。


  • Qwen-code:32B


第二部分:模型表现

Qweb2.5-coder:32b

首先上场的是Qweb2.5-coder:32b, 首先是一段任务分析:

然后就开始进入代码编写阶段了,token生成速度还可以,一秒10个左右:

编写扫雷游戏代码

index.html




    
    
    网页版扫雷游戏
    


    

网页版扫雷游戏

<script src="script.js"></script>

styles.css

body {
    font-family: Arial, sans-serif;
    display: flex;
    justify-content: center;
    align-items: center;
    height: 100vh;
    margin: 0;
    background-color: #f4f4f9;
}

.container {
    text-align: center;
}

#game-board {
    display: grid;
    gap: 2px;
    width: fit-content;
    margin: auto;
}

.cell {
    width: 30px;
    height: 30px;
    background-color: #ddd;
    border: 1px solid #ccc;
    cursor: pointer;
    font-size: 18px;
    display: flex;
    justify-content: center;
    align-items: center;
}

.cell.revealed {
    background-color: #fff;
    border: 1px solid #999;
}

.cell.flagged {
    background-image: url('flag.png');
    background-size: cover;
}

#status {
    margin-top: 20px;
    font-weight: bold;
}

script.js

const gameBoard = document.getElementById('game-board');
const newGameBtn = document.getElementById('new-game-btn');
const statusDisplay = document.getElementById('status');

let boardSize = 10; // 游戏板大小(10x10)
let numMines = 20; // 地雷数量
let board = [];
let revealedCells = 0;

function createBoard() {
    gameBoard.innerHTML = '';
    board = Array.from({ length: boardSize }, () => Array(boardSize).fill(0));
    revealedCells = 0;
    statusDisplay.textContent = '';

    placeMines();
    calculateNumbers();

    for (let i = 0; i < boardSize; i++) {
        for (let j = 0; j < boardSize; j++) {
            const cell = document.createElement('div');
            cell.classList.add('cell');
            cell.dataset.row = i;
            cell.dataset.col = j;
            cell.addEventListener('click', handleCellClick);
            cell.addEventListener('contextmenu', handleRightClick);
            gameBoard.appendChild(cell);
        }
    }
}

function placeMines() {
    let minesPlaced = 0;
    while (minesPlaced < numMines) {
        const row = Math.floor(Math.random() * boardSize);
        const col = Math.floor(Math.random() * boardSize);
        if (board[row][col] !== -1) {
            board[row][col] = -1;
            minesPlaced++;
        }
    }
}

function calculateNumbers() {
    for (let i = 0; i < boardSize; i++) {
        for (let j = 0; j < boardSize; j++) {
            if (board[i][j] === -1) continue;
            let mineCount = 0;
            for (let x = Math.max(0, i - 1); x <= Math.min(boardSize - 1, i + 1); x++) {
                for (let y = Math.max(0, j - 1); y <= Math.min(boardSize - 1, j + 1); y++) {
                    if (board[x][y] === -1) mineCount++;
                }
            }
            board[i][j] = mineCount;
        }
    }
}

function handleCellClick(event) {
    const row = parseInt(event.target.dataset.row);
    const col = parseInt(event.target.dataset.col);

    if (board[row][col] === -1) {
        revealMines();
        statusDisplay.textContent = '游戏结束!你踩到地雷了!';
    } else {
        revealCell(row, col);
        if (revealedCells === boardSize * boardSize - numMines) {
            statusDisplay.textContent = '恭喜,你赢了!';
        }
    }
}

function revealCell(row, col) {
    const cell = document.querySelector(`.cell[data-row="${row}"][data-col="${col}"]`);
    if (cell.classList.contains('revealed') || cell.classList.contains('flagged')) return;

    cell.classList.add('revealed');
    revealedCells++;

    if (board[row][col] === 0) {
        for (let x = Math.max(0, row - 1); x <= Math.min(boardSize - 1, row + 1); x++) {
            for (let y = Math.max(0, col - 1); y <= Math.min(boardSize - 1, col + 1); y++) {
                revealCell(x, y);
            }
        }
    } else if (board[row][col] !== -1) {
        cell.textContent = board[row][col];
    }
}

function revealMines() {
    for (let i = 0; i < boardSize; i++) {
        for (let j = 0; j < boardSize; j++) {
            const cell = document.querySelector(`.cell[data-row="${i}"][data-col="${j}"]`);
            if (board[i][j] === -1) {
                cell.classList.add('revealed');
                cell.textContent = '';
            }
        }
    }
}

function handleRightClick(event) {
    event.preventDefault();
    const row = parseInt(event.target.dataset.row);
    const col = parseInt(event.target.dataset.col);
    const cell = document.querySelector(`.cell[data-row="${row}"][data-col="${col}"]`);

    if (cell.classList.contains('revealed')) return;

    if (cell.classList.contains('flagged')) {
        cell.classList.remove('flagged');
    } else {
        cell.classList.add('flagged');
    }
}

newGameBtn.addEventListener('click', createBoard);

createBoard();

代码写完了还提供了一段说明:


还是看看成品吧:


纳尼,这样式好像有些问题啊?但是还是可以点击的,多点几下就踩雷了:

总结:代码完成读30分,可玩性30分,需要二次样式调整优化。

Qweb2.5-coder:32b

接着上场的是Deepseek-r1:32b, 首先是一段任务分析:


接着进入正式编码阶段:

网页版扫雷游戏源代码实现步骤说明

为了创建一个网页版的扫雷游戏,我们将按照以下步骤进行:

1. 创建基本的HTML结构

首先,我们需要定义一个HTML页面,其中包含游戏的主要元素:网格容器、控制按钮和难度选择器。




    
    网页版扫雷
    


    

时间: 0

剩余地雷: 0

<script src="script.js"></script>

2. 添加CSS样式

body {
    font-family: Arial, sans-serif;
    display: flex;
    justify-content: center;
    align-items: center;
    height: 100vh;
    margin: 0;
    background-color: #f0f0f0;
}

.game-container {
    text-align: center;
    background-color: white;
    padding: 20px;
    border-radius: 10px;
    box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
}

.grid-container {
    margin: 10px auto;
}

.cell {
    width: 40px;
    height: 40px;
    border: 1px solid #ccc;
    display: inline-block;
    background-color: #eee;
    cursor: pointer;
}

.controls {
    margin-bottom: 10px;
}

.info p {
    margin: 5px 0;
}

3. 编写JavaScript核心逻辑


let grid = [];
let gridSize = { rows: 10, cols: 10 };
let mineCount = 10;
let gameOver = false;
let timer = null;
let firstClick = true;

// 初始化网格
function initGrid() {
    const container = document.getElementById('gridContainer');
    container.innerHTML = '';
    grid = [];
    
    for (let i = 0; i < gridSize.rows; i++) {
        grid[i] = [];
        const row = document.createElement('div');
        
        for (let j = 0; j < gridSize.cols; j++) {
            grid[i][j] = { isMine: false, isOpened: false, isFlagged: false };
            const cell = document.createElement('div');
            cell.className = 'cell';
            cell.dataset.row = i;
            cell.dataset.col = j;
            cell.addEventListener('click', handleClick);
            row.appendChild(cell);
        }
        
        container.appendChild(row);
    }
}

// 设置地雷
function setMines(firstRow, firstCol) {
    let minesPlaced = 0;
    
    while (minesPlaced < mineCount) {
        const row = Math.floor(Math.random() * gridSize.rows);
        const col = Math.floor(Math.random() * gridSize.cols);
        
        if (!grid[row][col].isMine && !(row === firstRow && col === firstCol)) {
            grid[row][col].isMine = true;
            minesPlaced++;
        }
    }
}

// 计算相邻地雷数量
function getAdjacentMines(row, col) {
    let count = 0;
    
    for (let i = -1; i <= 1; i++) {
        for (let j = -1; j <= 1 j const newrow='row' i const newcol='col' j if newrow>= 0 && newRow < gridsize.rows newcol>= 0 && newCol < gridSize.cols &&
                grid[newRow][newCol].isMine) {
                count++;
            }
        }
    }
    
    return count;
}

// 处理点击事件
function handleClick() {
    if (gameOver || this.classList.contains('flagged')) return;

    const row = parseInt(this.dataset.row);
    const col = parseInt(this.dataset.col);

    if (firstClick) {
        firstClick = false;
        setMines(row, col);
        startTimer();
    }

    if (grid[row][col].isMine) {
        gameOver = true;
        revealAll();
        alert('游戏结束!');
        return;
    }

    const adjacentMines = getAdjacentMines(row, col);

    if (adjacentMines === 0) {
        floodFill(row, col);
    } else {
        grid[row][col].isOpened = true;
        this.textContent = adjacentMines.toString();
        checkWin();
    }
}

// 洪水填充算法,递归打开相邻空格
function floodFill(row, col) {
    if (row < 0 row>= gridSize.rows || 
        col < 0 col>= gridSize.cols ||
        grid[row][col].isOpened ||
        grid[row][col].isMine) {
        return;
    }

    const adjacentMines = getAdjacentMines(row, col);
    
    grid[row][col].isOpened = true;
    this.textContent = (adjacentMines > 0 ? adjacentMines.toString() : '');
    
    if (adjacentMines === 0) {
        // 递归检查相邻的八个格子
        for (let i = -1; i <= 1; i++) {
            for (let j = -1; j <= 1 j floodfillrow i col j checkwin function checkwin let remainingcells='0;' for let row of grid for let cell of row if cell.ismine cell.isopened remainingcells if remainingcells='== 0)' gameover='true;' clearintervaltimer alert function revealall for let row of grid for let cell of row if cell.ismine const element='document.querySelector(`[data-row="${row}"][data-col="${col}"]`);' element.textcontent function starttimer let seconds='0;' timer='setInterval(()'> {
        document.getElementById('time').textContent = seconds++;
    }, 1000);
}

// 新游戏
function newGame() {
    gameOver = false;
    firstClick = true;
    clearInterval(timer);
    initGrid();
}

// 设置难度
function setDifficulty(rows, cols, mines) {
    gridSize.rows = rows;
    gridSize.cols = cols;
    mineCount = mines;
    newGame();
}

// 初始化游戏
initGrid();

// 绑定事件监听器到难度按钮
document.querySelectorAll('.difficulty-btn').forEach(btn => {
    btn.addEventListener('click', () => {
        const difficulty = btn.dataset.difficulty;
        switch(difficulty) {
            case 'easy':
                setDifficulty(10, 10, 10);
                break;
            case 'medium':
                setDifficulty(20, 20, 40);
                break;
            case 'hard':
                setDifficulty(30, 30, 90);
                break;
        }
    });
});

// 绑定右键点击事件
document.addEventListener('contextmenu', (e) => {
    if (!gameOver && e.target.classList.contains('cell')) {
        e.preventDefault();
        
        const cell = e.target;
        if (!cell.classList.contains('flagged') && !cell.classList.contains('opened')) {
            cell.classList.toggle('flagged');
            updateMineCount();
        }
    }
});

// 更新剩余地雷数量
function updateMineCount() {
    let flaggedMines = 0;
    
    document.querySelectorAll('.cell').forEach(cell => {
        if (cell.classList.contains('flagged')) flaggedMines++;
    });
    
    const mineDisplay = document.getElementById('mine-count');
    mineDisplay.textContent = mineCount - flaggedMines;
}

// 初始化剩余地雷显示
updateMineCount();


### 回答

为了帮助你逐步解决这个问题,我将提供一个分步骤的解决方案。以下是详细的步骤说明:

### 步骤 1:理解需求

我们需要开发一个经典的“扫雷”游戏,该游戏需要以下功能:
- **开始新游戏**:点击按钮后,重置游戏状态。
- **难度选择**:支持三种不同的难度级别(简单、中等、困难)。
- **显示剩余地雷数量**:实时更新剩余未标记的地雷数量。
- **右键标记功能**:允许玩家用右键标记可能包含地雷的方块。

### 步骤 2:规划游戏逻辑

首先,我们需要明确扫雷游戏的基本规则和逻辑:
1. **网格初始化**:根据选择的难度级别,创建一个指定大小的网格。
2. **放置地雷**:在网格中随机放置一定数量的地雷。注意,在第一次点击时,不能将地雷放在被点击的方块及其相邻的方块内。
3. **揭开方块**:当玩家点击一个方块时,如果该方块是地雷,则游戏结束;否则,显示该方块周围地雷的数量。如果数量为零,则递归打开所有相邻的空白方块( floods fill 算法)。
4. **标记功能**:允许玩家用右键标记可能包含地雷的方块。
5. **胜利条件**:当所有非地雷方块都被正确揭开时,玩家获胜。

### 步骤 3:设计数据结构

为了实现上述逻辑,我们需要以下数据结构:
- **网格表示**:使用一个二维数组 `grid` 来存储每个方块的状态。每个元素是一个对象,包含以下属性:
  - `isMine`:布尔值,指示该方块是否为地雷。
  - `isOpened`:布尔值,指示该方块是否已被揭开。
  - `isFlagged`:布尔值,指示该方块是否被标记。

### 步骤 4:实现网格初始化

在游戏开始或难度改变时,我们需要重新初始化网格。这包括:
1. 根据当前难度级别创建指定大小的网格。
2. 初始化所有方块的状态为默认状态(非地雷、未揭开、未标记)。

### 步骤 5:放置地雷

在第一次点击某个方块时,需要确保该方块及其相邻的方块内不放置地雷。这可以通过以下步骤实现:
1. 记录第一次点击的位置。
2. 随机在网格中选择位置放置地雷,避开第一次点击的位置及其周围的八个格子。

### 步骤 6:揭开方块逻辑

当玩家点击一个未标记且未揭开的方块时:
- 如果该方块是地雷,则游戏结束。
- 否则,计算该方块周围地雷的数量并显示。如果数量为零,则递归打开所有相邻的空白方块。

### 步骤 7:标记功能

允许玩家用右键点击方块来标记可能的地雷:
1. 在右键事件中,切换方块的 `isFlagged` 状态。
2. 更新剩余地雷计数器。

### 步骤 8:胜利和失败检测

- **失败条件**:当玩家点击一个地雷时,游戏结束,并显示所有地雷的位置。
- **胜利条件**:当所有非地雷方块都被正确揭开(即没有被标记或揭开的所有空白方块都已打开)。

### 步骤 9:用户界面设计

创建一个简单的 HTML 页面,包含:
1. 游戏网格区域。
2. 难度选择按钮。
3. 新游戏按钮。
4. 剩余地雷计数器。

### 步骤 10:实现 JavaScript 逻辑

编写 JavaScript 代码来控制游戏的逻辑,包括:
- 初始化网格。
- 处理玩家点击和右键事件。
- 更新剩余地雷计数器。
- 检测胜利或失败条件。

### 步骤 11:测试和调试

在完成上述步骤后,进行全面的测试以确保所有功能正常工作。特别注意以下方面:
- **第一次点击无地雷**:确认第一次点击的位置不会触发地雷。
- **标记功能**:确保右键标记正确更新剩余地雷计数器,并且无法揭开已被标记的方块。
- **胜利和失败条件**:测试各种情况,确保游戏能够正确检测到胜利或失败。

### 步骤 12:优化用户体验

根据测试反馈,进行以下优化:
- 添加视觉效果(如颜色变化)以增强用户反馈。
- 提供清晰的游戏状态提示(如“已获胜”或“已爆炸”)。
- 确保界面在不同难度级别下响应良好。

### 步骤 13:最终部署

将所有代码整合到一个完整的 HTML 文件中,并进行最后的测试,确保没有遗漏的功能或错误。然后,将该文件部署到服务器或共享位置,供用户访问和游玩。

通过以上步骤,你可以逐步开发出一个功能完善的扫雷游戏,满足基本的游戏规则和用户体验要求。

好了,我们来看看成品:


样式看的有模有样,玩一把看看,竟然还有计时器功能,只是点击之后的格子会掉下来,有一点点小样式问题。

多点击几个格子后,突然没反应了,打开调试代码窗口看看:


原来遇到了Javascript语法错误,。详细找了一下,出错的行是这里第六行,现实col没有定义错误。

// 显示所有地雷
function revealAll() {
    for (let row of grid) {
        for (let cell of row) {
            if (cell.isMine) {
                const element = document.querySelector(`[data-row="${row}"][data-col="${col}"]`);
                element.textContent = '';
            }
        }
    }
}

从头看了一下代码,发现这里有语法错误,row和cell都不是简单的数值类型,而是object类型,简单修改一下让他可以跑:

// 初始化网格
function initGrid() {
    const container = document.getElementById('gridContainer');
    container.innerHTML = '';
    grid = [];
    
    for (let i = 0; i < gridSize.rows; i++) {
        grid[i] = [];
        const row = document.createElement('div');
        
        for (let j = 0; j < gridSize.cols; j++) {
            // 代码手动修改部分,增加r和c两个字段分别表示cell所在的行和列序号
            grid[i][j] = { isMine: false, isOpened: false, isFlagged: false, r: i, c:j };
            const cell = document.createElement('div');
            cell.className = 'cell';
            cell.dataset.row = i;
            cell.dataset.col = j;
            cell.addEventListener('click', handleClick);
            row.appendChild(cell);
        }
        
        container.appendChild(row);
    }
}

function revealAll() {
    for (let row of grid) {
        for (let cell of row) {
            if (cell.isMine) {
                // 代码手动修改部分,修改为从cell.r和cell.c 来找到对应的格子
                const element = document.querySelector(`[data-row="${cell.r}"][data-col="${cell.c}"]`);
                element.textContent = '';
            }
        }
    }
}

修改后基本可以正常玩了。

总结:相比于Qwen2.5-coder,Deepseek-r1非常贴心的引入了游戏计时和游戏难度选择两个额外功能,是的游戏的可玩性大大增加,可以打90分;代码完成读方面,由于Bug的存在,只能打80分。

第三部分:模型评判

通过此次对Deepseek-r1和Qwen-2.5-coder在实现扫雷游戏中的对比分析,我们得出了几个值得注意的结论。首先,Deepseek-r1的表现大大超出了预期,在编程领域展现了不俗的实力。它不仅能够快速完成扫雷游戏的核心功能,还额外提供了“游戏计时”和“难度选择”等实用功能,极大地提升了用户体验。尽管在实现过程中出现了一些小的代码Bug,导致整体评分略有下降,但这些瑕不掩瑜,Deepseek-r1的整体表现令人印象深刻。

反观Qwen-2.5,作为一款专门针对编程任务的大模型,其表现却让人略感失望。在实现扫雷游戏的过程中,Qwen-2.5不仅缺少“计时功能”和“难度设置”的支持,甚至连基本的网页样式设计都显得不够完善,导致最终的游戏体验大打折扣。这一结果或许与我们对它的高期望形成了鲜明对比。

从这次实践来看,Deepseek-r1作为一款通用型AI模型,在编程领域的表现已经足够令人惊艳。它不仅能够完成基础功能开发,还能在一定程度上满足用户对复杂需求的期待。而Qwen-2.5虽然专注于编程任务,但在实际应用中却显得力不从心,其短板暴露了当前AI编程工具在功能完善性和用户体验上的不足。

总的来说,随着AI技术的不断进步,未来像Deepseek-r1这样的通用型模型可能会在更多领域展现出更强的适应能力。而对于Qwen-2.5这类专业编程模型来说,如何提升实用性、优化功能设计,将是其未来发展的重要方向。无论选择哪种工具,开发者都需要根据自己的需求和场景进行权衡,才能最大化AI带来的价值。

希望这篇文章能为开发者提供一些参考,在选择AI编程工具时更加明智,同时也期待未来能看到更多优秀的AI工具诞生,为软件开发注入新的活力!

相关推荐

Luminati代理动态IP教程指南配置代理VMLogin中文版反指纹浏览器

介绍如何使用在VMLogin中文版设置Luminati代理。首先下载VMLogin中文版反指纹浏览器(https://cn.vmlogin.com)对于刚接触Luminati动态ip的朋友,是不是不懂...

文档中图形及子图形的处理(word中的图形对象有何特点)

【分享成果,随喜正能量】走得越远,见识越多,认识的人越多,你就越能体会到,人这一辈子,你真的在意的,同时又在意你的人,就那么几个,这几个人,就是你全部的世界。三两知己,爱人在侧,父母康健,听起来平淡无...

Python爬虫破解滑动验证码教程(python绕过滑动验证码)

破解滑动验证码通常需要结合图像识别和模拟人类操作,以下是分步骤的解决方案:1.分析验证码类型缺口识别型:背景图带缺口,滑块图带凸块轨迹验证型:除了位置还需模拟人类移动轨迹2.获取验证码图片方法一:...

「教程」5 分钟带你入门 kivy(新手kp教学)

原创:星安果AirPythonkivy语言通过编写界面UI,然后利用Python定义一些业务逻辑,可以移植很多功能模块到移动端直接执行。下面对kivy常见用法做一个汇总。1、什么是...

比呀比: Fossil Estate Canvas EW 男式复古邮差包 $70.99

Fossil是一个来自美国的全球性生活时尚品牌,始建于1984年,专注于时尚配件,是第一个将手表的价值与款式完美结合的美国品牌,如今Fossil已跃身成为美国最受欢迎的品牌之一。这款FossilE...

智能教学:如何在网上授课(网上授课怎么弄)

摘要:因为担心传统课堂可能会传播冠状病毒,许多大学已经开始在网上授课。耶鲁-新加坡国立大学的讲师凯瑟琳·谢伊·桑格(CatherineSheaSanger)解释了如何快速而有效地做到这一点。当新型冠...

wxPython库教程系列之图片:托盘图标和图片缩放、移动

1概要:=====1.1托盘图标设置1.2普通图片显示:原图显示,缩放显示,窗口与图片大小相互适应。1.3按钮图片设置1.4移动图片和zoom菜单按钮联动设置2托盘图标:========2...

UE4渲染目标开发教程(ue4渲染效果图质量怎么样)

渲染目标(RenderTarget)是你可以在运行时写入的纹理。在引擎方面,它们存储基础颜色、法线和环境光遮蔽等信息。在用户方面,渲染目标主要用作一种辅助相机。你可以将场景捕捉指向某物并将图像存储到...

比呀比: Fossil 化石 Canvas NS 男士复古帆布斜挎包 $57.59

FossilCanvasNS男士复古帆布斜挎包,尺寸约为26.5*11*33厘米。采用100%纯棉帆布面料,融合了休闲与百搭的外形,在经典的款型呈现复古质感。内设1个拉链袋,2个搭扣数码产品袋和...

比呀比: Timberland 添柏岚 Canvas Cord Case 帆布旅行手包 $5.99

Timberland添柏岚这款耐用帆布旅行手包,虽然一眼过去,觉得不咋地,但是品牌和质量还是妥妥滴,非常适合装一些零零碎碎的小东西,便于携带,多色可选,重点是价格更是感动价啊。目前这款包在6pm报价...

提炼文章/知识资料,两键转换成小红书图片

现在AI的功能已经越来越强大了,通过AI可以提高我们不少工作效率。刚好前几天做了一个几乎“一气呵成”,把长文章转成小红书卡片的流程Demo,分享给大家。之前发过两篇利用AI把长文章转成小红书图片...

python海龟绘图turtle(一):画布和窗体

海龟绘图(turtle)是python的一个有趣的内置模块,是python语言的标准库之一,是入门级的图形绘制函数库。海龟绘图(turtle)可以根据编写的控制指令(代码),让一个小“海龟”在屏幕上来...

在文档中添加画布及图片(word中如何添加画布)

【分享成果,随喜正能量】宁可正而不足,不可邪而有余。相识满天下,知心能几人。书七成,戏三分,牛皮灯影胡编成。布施不如还债,修福不如避祸。勿以恶小而为之,勿以善小而不为。。《VBA之Word应用》,是我...

知识管理神器 Obsidian,终于有了白板功能!

沙牛提示阅读本文需要3分钟,Obsidian白板功能来了!如果你喜欢本文,就分享给你的小伙伴!01白板继双链笔记之后,这一年,白板类工具开始火了起来。顾名思义,白板类工具,它给了你一张无限尺寸...

虚拟背景第一弹!教你如何在家中优雅地“学在交大”!

交大将于3月2日正式开始线上教学(3月1日举行线上教学第一课|视频直播课)目前正处于网课试课阶段交大在线课程教学以ZOOM、Canvas等作为主平台平台的虚拟背景功能可以具特别的环境效果更好地沉浸课堂...