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

如何在Python中实现带对角线移动的球形2D矩阵(贪吃蛇场景)

实现支持球形循环的2D矩阵(含对角线移动)

先给出目标矩阵:

matrix = [
    [1,  2,  3,  4,  5,  6,  7,  8,  9, 10],
    [11, 12, 13, 14, 15, 16, 17, 18, 19, 20],
    [21, 22, 23, 24, 25, 26, 27, 28, 29, 30]
]

需求示例

  • 从9(坐标matrix[0][8])向右上移动,目标位置为27(坐标matrix[2][6])
  • 从30(坐标matrix[2][9])向右下移动,目标位置为8(坐标matrix[0][7])
  • 从11(坐标matrix[1][0])向左上移动,目标位置为22(坐标matrix[2][1])
  • 从20(坐标matrix[1][9])向右移动,目标位置为11(坐标matrix[1][0])

核心实现思路

这种球形循环本质是环面拓扑的边界循环,不需要遍历,直接用取模运算就能计算目标位置——取模可以自动处理索引超出边界(包括负数)的情况,完美实现越界后从对面重新进入的效果。

步骤1:获取矩阵行列数

先拿到矩阵的总行数和总列数:

rows = len(matrix)
cols = len(matrix[0]) if rows > 0 else 0

步骤2:定义方向偏移量

先明确8个基础方向对应的行、列偏移值,如果你的方向定义和示例特殊匹配,只需调整偏移量即可:

方向行偏移(dr)列偏移(dc)
上-10
下10
左0-1
右01
左上-1-1
右上-11
左下1-1
右下11

步骤3:计算目标位置

对于当前坐标(r, c),加上方向偏移后用取模运算得到循环后的新坐标:

# 示例:从20(1,9)向右移动(dr=0, dc=1)
r, c = 1, 9
dr, dc = 0, 1
new_r = (r + dr) % rows
new_c = (c + dc) % cols
target = matrix[new_r][new_c]  # 结果为11,符合示例

适配你的特殊方向示例

如果要匹配你给出的特殊移动结果,只需调整对应方向的偏移量:

  • 从(0,8)到(2,6):对应偏移为dr=-1、dc=-2(即右上移动两步)
  • 从(1,0)到(2,1):对应偏移为dr=1、dc=1(即右下移动一步)

封装成调用函数

把逻辑封装成函数,方便重复调用:

def get_spherical_matrix_value(matrix, current_r, current_c, dr, dc):
    rows = len(matrix)
    if rows == 0:
        return None
    cols = len(matrix[0])
    new_r = (current_r + dr) % rows
    new_c = (current_c + dc) % cols
    return matrix[new_r][new_c]

# 测试向右移动示例
print(get_spherical_matrix_value(matrix, 1, 9, 0, 1))  # 输出11

原理说明

取模运算的特性是:对于整数x和正整数m,x % m会返回0到m-1之间的整数。当x为负数时,比如-1 % 3会得到2,刚好对应矩阵最后一行的索引,完美实现向上越界后从底部进入的循环;同理,列索引的取模实现左右方向的循环。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 07:37:41