Checkio Find enemy

本文介绍了一种算法,用于在给定的六边形网格中确定玩家与敌人的相对位置和距离,通过输入坐标和方向计算出结果,适用于编程挑战或游戏AI设计。
摘要由CSDN通过智能技术生成

#方法是站上大佬发布的方法,我在理解的基础上写了这篇

#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"

  • 7
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值