推箱子初体验,Trae如何复刻经典游戏?

前言

今天来还原初中时期记忆中的推箱子游戏,主要是让 Trae 用代码实现这个游戏的核心功能,

你是否还记得曾经初中时期在课余时间沉迷推箱子,今天就看看 Trae 是怎么实现。

游戏的核心逻辑

先把这个核心逻辑发给 Trae,看看他完成的是不是你想要的经典的推箱子游戏。

  1. 游戏开始时,玩家会看到一个由方格组成的网格,其中一些方格上有箱子,部分方格是目标位置。
  2. 玩家通过控制角色推动箱子,当所有箱子都被推到目标位置时,游戏胜利。
  3. 玩家一次只能推动一个箱子,不能斜推。
  4. 玩家在推动箱子时,若前方有障碍物或箱子挡住,则无法推动。
  5. 玩家需要在有限的步数内或规定时间内,将所有箱子推到目标位置,才算通关。

启动页面,发现推箱子的小人不见了,也无法进行操作,只能让Trae修复一下这个致命的bug

将控制台的报错发给Trae,把CSS类名中包含空格字符,DOMTokenList.add()方法不接受包含空格的类名处理掉即可完美的运行

Trae 代码解读

通过设定网格的行列数、箱子和目标位置的分布,来初始化游戏的布局,生成一个二维数组来表示游戏面板,通过 for 循环来填充网格,合理摆放箱子、目标位置和障碍物。

ini 复制代码
for (let i = 0; i < rows; i++) {
    const row = [];
    for (let j = 0; j < cols; j++) {
        row.push({
            hasBox: false,
            isTarget: false,
            isObstacle: false,
            isPlayer: false
        });
    }
    grid.push(row);
}

// 放置箱子
for (let i = 0; i < boxCount; i++) {
    const row = Math.floor(Math.random() * rows);
    const col = Math.floor(Math.random() * cols);
    if (!grid[row][col].isTarget && !grid[row][col].isObstacle) {
        grid[row][col].hasBox = true;
    }
}

// 放置目标位置
for (let i = 0; i < targetCount; i++) {
    const row = Math.floor(Math.random() * rows);
    const col = Math.floor(Math.random() * cols);
    if (!grid[row][col].hasBox && !grid[row][col].isObstacle) {
        grid[row][col].isTarget = true;
    }
}

// 放置障碍物
for (let i = 0; i < obstacleCount; i++) {
    const row = Math.floor(Math.random() * rows);
    const col = Math.floor(Math.random() * cols);
    if (!grid[row][col].hasBox && !grid[row][col].isTarget) {
        grid[row][col].isObstacle = true;
    }
}

// 放置玩家
let playerPlaced = false;
while (!playerPlaced) {
    const row = Math.floor(Math.random() * rows);
    const col = Math.floor(Math.random() * cols);
    if (!grid[row][col].hasBox && !grid[row][col].isObstacle) {
        grid[row][col].isPlayer = true;
        playerPlaced = true;
    }
}

通过事件监听实现玩家控制角色移动来推动箱子,并判断游戏是否胜利。

ini 复制代码
board.addEventListener('keydown', (e) => {
    let newRow = playerRow;
    let newCol = playerCol;

    switch (e.key) {
        case 'ArrowUp':
            newRow--;
            break;
        case 'ArrowDown':
            newRow++;
            break;
        case 'ArrowLeft':
            newCol--;
            break;
        case 'ArrowRight':
            newCol++;
            break;
    }

    // 检查移动是否合法
    if (newRow >= 0 && newRow < rows && newCol >= 0 && newCol < cols && !grid[newRow][newCol].isObstacle) {
        // 如果当前位置有箱子
        if (grid[newRow][newCol].hasBox) {
            // 检查箱子前方是否有空位
            let boxNewRow = newRow;
            let boxNewCol = newCol;

            switch (e.key) {
                case 'ArrowUp':
                    boxNewRow--;
                    break;
                case 'ArrowDown':
                    boxNewRow++;
                    break;
                case 'ArrowLeft':
                    boxNewCol--;
                    break;
                case 'ArrowRight':
                    boxNewCol++;
                    break;
            }

            if (boxNewRow >= 0 && boxNewRow < rows && boxNewCol >= 0 && boxNewCol < cols && !grid[boxNewRow][boxNewCol].hasBox && !grid[boxNewRow][boxNewCol].isObstacle) {
                // 移动箱子
                grid[boxNewRow][boxNewCol].hasBox = true;
                grid[newRow][newCol].hasBox = false;
                // 移动玩家
                grid[playerRow][playerCol].isPlayer = false;
                grid[newRow][newCol].isPlayer = true;
                playerRow = newRow;
                playerCol = newCol;
                checkGameStatus();
            }
        } else {
            // 移动玩家
            grid[playerRow][playerCol].isPlayer = false;
            grid[newRow][newCol].isPlayer = true;
            playerRow = newRow;
            playerCol = newCol;
            checkGameStatus();
        }
    }
});

最后是来自 Trae 自己对这款推箱子的总结,主要是游戏功能和设计,还有考虑到游戏体验,有撤销上一步的操作,非常的人性化。

Trae 在生成时,考虑的情况,主要是箱子、目标位置、障碍物、步数限制、计时器、难度选择等因素。

总结

1、这个游戏的核心功能,主要是靠玩家来推动箱子,Trae 非常人性化的支持多种操作方式,来让高级玩家有更好的游戏体验。

2、考虑到游戏玩家可能没玩过,Trae 也是帮我们设计了三个游戏难度以及游戏关卡,不会让新手玩家没有体验感直接进入到地狱难度/高难度关卡,可以一步步的体验到游戏的关卡难度。

相关推荐
anyup1 天前
迁移uni-app x,我是如何让 AI 把我一步步搞崩溃的...
前端·uni-app·trae
努力的小Qin2 天前
记录随手记、周报一键成:我如何用「工作日迹」终结周五的周报焦虑
ai编程·trae·vibecoding
kyriewen2 天前
前端切图仔被 AI 新闻淹死的第 N 天,我用 TRAE Work 定时任务救了自己
前端·人工智能·trae
Goboy6 天前
那份让我加班3天的竞品调研报告,我用 TRAE Work 4小时搞定了
ai编程·trae
吴彦祖北京分祖6 天前
72 分钟会议逐字稿,TRAE Work 3 分钟出了结构化纪要:我的会议纪要提效实战
trae
吕不说6 天前
TRAE Work 帮我把 2 小时日报压成 8 分钟:售后工程师的周报自救指南
trae
JavaDog程序狗6 天前
TRAE-Work-实战帮-Obsidian知识库整理
trae
小怼子6 天前
用 TraeWork 给 TraeWork 中添加了“任务看板”功能
trae
该换个名儿了8 天前
TRAE Work 清理电脑空间,Nice
trae
豆包MarsCode9 天前
更新焦虑有救了!当我把选题、文案、配图全交给 AI.....
trae