You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Swift构建可扩展的2D游戏棋盘?

实现可扩展的2D动态棋盘游戏

嘿,看起来你正在搭建一个带动态扩展机制的棋盘游戏,我来帮你梳理核心逻辑并补全代码实现~先把你的需求拆解清楚:

  • 初始是3x3棋盘,所有格子默认值为1
  • 玩家从棋盘中心位置出发(3x3的话就是坐标(1,1),我下面统一用0-based索引来写代码,方便数组操作)
  • 一旦玩家移动到当前棋盘的边缘格子,棋盘自动扩展边长(比如你说的到[3,3](1-based)时扩展为4x4,对应0-based就是(2,2)位置触发扩展)
  • 玩家移动时,途经的格子如果数值是0,要改成1

核心数据结构先搞定

首先得定义几个关键变量来存储棋盘状态和玩家位置:

// 初始棋盘边长
let boardSize = 3;
// 创建3x3棋盘,所有格子填充初始值1
let board = Array.from({ length: boardSize }, () => Array(boardSize).fill(1));
// 玩家初始位置:棋盘中心(0-based索引下,3x3的中心是(1,1))
let playerPos = { x: Math.floor(boardSize / 2), y: Math.floor(boardSize / 2) };

棋盘扩展的核心逻辑

当玩家走到边缘时,我们需要生成新的棋盘,把原有棋盘的数据保留,新增的格子默认设为1。这里按你给出的例子逻辑:扩展后原有棋盘放在新棋盘的左上角,新增的行和列补在右侧和下方:

function expandBoard() {
  const newSize = boardSize + 1;
  // 创建新的空棋盘,所有格子先填1
  const newBoard = Array.from({ length: newSize }, () => Array(newSize).fill(1));
  
  // 把旧棋盘的内容复制到新棋盘的对应位置
  for (let y = 0; y < boardSize; y++) {
    for (let x = 0; x < boardSize; x++) {
      newBoard[y][x] = board[y][x];
    }
  }
  
  // 更新棋盘和边长
  board = newBoard;
  boardSize = newSize;
  console.log(`棋盘已扩展为 ${boardSize}x${boardSize} 规格`);
}

玩家移动的完整流程

移动函数要处理路径格子的数值修改、位置更新,还要判断是否触发扩展。这里先假设是上下左右的单步移动(如果需要斜向或多步移动,后续可以调整路径计算逻辑):

// 定义移动方向的常量,方便调用
const directions = {
  UP: { dx: 0, dy: -1 },
  DOWN: { dx: 0, dy: 1 },
  LEFT: { dx: -1, dy: 0 },
  RIGHT: { dx: 1, dy: 0 }
};

function movePlayer(direction) {
  const { dx, dy } = directions[direction];
  // 计算移动后的新位置
  const newX = playerPos.x + dx;
  const newY = playerPos.y + dy;
  
  // 处理途经格子:单步移动的话途经就是新位置,按需求把0改成1
  if (board[newY][newX] === 0) {
    board[newY][newX] = 1;
  }
  
  // 更新玩家当前位置
  playerPos.x = newX;
  playerPos.y = newY;
  
  // 检查是否处于当前棋盘的边缘,是就触发扩展
  if (isEdgePosition(playerPos.x, playerPos.y)) {
    expandBoard();
  }
  
  // 打印当前状态,方便调试
  printBoard();
}

// 辅助函数:判断某个位置是不是当前棋盘的边缘
function isEdgePosition(x, y) {
  return x === 0 || x === boardSize - 1 || y === 0 || y === boardSize - 1;
}

// 辅助函数:打印棋盘和玩家位置,直观看到状态
function printBoard() {
  console.log("当前棋盘状态:");
  board.forEach(row => console.log(row.join(" | ")));
  console.log(`玩家当前位置:(${playerPos.x}, ${playerPos.y})\n`);
}

来测试一下效果

运行下面的代码就能看到整个流程:

// 先打印初始状态
printBoard();

// 玩家向右移动到3x3棋盘的右边缘(2,1)
movePlayer("RIGHT");
// 这时候会触发扩展,棋盘变成4x4

// 再向右移动到4x4棋盘的右边缘(3,1)
movePlayer("RIGHT");
// 再次扩展为5x5

一些可以优化的点

  • 索引适配:如果你习惯用1-based索引,只需要在初始化位置和边缘判断时调整数值就行
  • 路径处理:如果支持斜向移动或者多步移动,需要额外计算路径上的所有格子(比如用直线插值或者BFS),再逐个修改数值
  • 状态保存:如果需要持久化游戏状态,可以把board和playerPos序列化为JSON存储起来

内容的提问来源于stack exchange,提问作者PauloMendes

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 10:24:29