#方法是站上大佬发布的方法,我在理解的基础上写了这篇
#checkio
#Find Enemy
在十六进制网格中找到与敌人的距离和相对方向。
十六进制网格(六边形网格)是一个坐标系,类似于方形网格。查找距离 在两个单元格之间,您不需要找到从一个单元格到另一个单元格的确切路径,但是 正确使用它们的坐标。 计算距离的另一种方法是 要注意,所有严格围绕细胞的细胞都形成一个圆圈,并且处于 距离单元格 1,所有先前单元格周围的单元格(下一个“圆圈”)为 在距离 2 等。 在这个任务中,从“A1”到“Z9”的字段用于放置你 和 enemy,但您可能需要使用此字段“外部”的坐标进行计算。 当您的位置处于场地边缘时,请注意情况。
绝对方向。如果我们取任何单元格,它上面的单元格总是到 北(“N”),下方 - 向南(“S”)等。
相对方向取决于您的绝对方向。如果你的绝对方向是“N”, 相对方向如下。所以所有围绕特定细胞的细胞形成 4个“扇区”:向前、向右、向后和向左。被认为存在于其中的细胞 部门,即使它们“不在我们领域之外”。
当您的绝对方向为“SE”时,这些“扇区”会旋转,并且单元格会旋转 在你的牢房前面将是东南,而北方是绝对的 方向将在左扇区。
输入: 三个参数:你当前的坐标、你当前的绝对方向和敌人的坐标。 输出: 具有与敌人的相对方向和距离的列表。
DIR = {'N':0, 'NE':2, 'E':3, 'SE':4, 'S':6, 'SW':8, 'W':9, 'NW':10}
RDIR = {0:'F',1:'F',2:'R',3:'R',4:'R',5:'B',6:'B',7:'B',8:'L',9:'L',10:'L',11:'F'}
def find_enemy(you, dir, enemy):
# A : 0, B : 1,...chr(65)="A"……pos=position
pos = lambda p: (ord(p[0]) - 65, int(p[1]))
x0, y0 = pos(you)
x1, y1 = pos(enemy)
dx = abs(x1 - x0)
# d is direction to enemy
# N
# NW | NE
# \ b 0 1 /
# a 2
# W-9 3-E
# 8 4
# / 7 6 5 \
# SW | SE
# S
if dx == 0:
d = 0 if y1 < y0 else 6
distance = dx + abs(y1 - y0)
else:
# d can be determined by where is y1. if y1 < v0, d = 1
# NE
# + v0
# /|
# / |
# / |
# / |
# +----+---- y0
# x0\ |x1
# \ |
# \ |
# \|
# + v1
# SE
v0 = y0 - (dx + 1 - x0 % 2) // 2
v1 = y0 + (dx + x0 % 2) // 2
d = 1 if y1 < v0 else 2 if y1 == v0 else 3 if y1 < v1 else 4 if y1 == v1 else 5
if x1 < x0: d = 12 - d # mirror
distance = dx + (0 if v0 <= y1 <= v1 else v0 - y1 if y1 < v0 else y1 - v1)
return [RDIR[(d - DIR[dir]) % 12], distance]
if __name__ == '__main__':
assert find_enemy('G5', 'N', 'G4') == ['F', 1], "N-1"
assert find_enemy('G5', 'N', 'I4') == ['R', 2], "NE-2"
assert find_enemy('G5', 'N', 'J6') == ['R', 3], "SE-3"
assert find_enemy('G5', 'N', 'G9') == ['B', 4], "S-4"
assert find_enemy('G5', 'N', 'B7') == ['L', 5], "SW-5"
assert find_enemy('G5', 'N', 'A2') == ['L', 6], "NW-6"
assert find_enemy('G3', 'NE', 'C5') == ['B', 4], "[watch your six!]"
assert find_enemy('H3', 'SW', 'E2') == ['R', 3], "right"
assert find_enemy('A4', 'S', 'M4') == ['L', 12], "true left"