如何在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) |
|---|---|---|
| 上 | -1 | 0 |
| 下 | 1 | 0 |
| 左 | 0 | -1 |
| 右 | 0 | 1 |
| 左上 | -1 | -1 |
| 右上 | -1 | 1 |
| 左下 | 1 | -1 |
| 右下 | 1 | 1 |
步骤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
相关产品推荐
相关产品推荐

