代码之家  ›  专栏  ›  技术社区  ›  ruohola

如何将一个两元素方向的元组向左或向右(蛇形人工智能)?

  •  3
  • ruohola  · 技术社区  · 7 年前

    我正在编写一个蛇游戏的人工智能,并有以下问题。我要接下一个 move 我的人工智能课1(右转)或-1(左转)。我要按照他们的要求把蛇翻过来。我有蛇的 direction 编码如下:

    (1, 0) => going right

    (-1, 0) => going left

    (0, -1) => going up

    (0, 1) => going down

    有什么方法可以简化以下内容吗 if-elif 阻止,这样我就不需要手动检查每个组合了?

    if move == 1:
        if snake.direction == (1, 0):
            snake.direction = (0, 1)
    
        elif snake.direction == (-1, 0):
            snake.direction = (0, -1)
    
        elif snake.direction == (0, 1):
            snake.direction = (-1, 0)
    
        elif snake.direction == (0, -1):
            snake.direction = (1, 0)
    
    elif move == -1:
        if snake.direction == (1, 0):
            snake.direction = (0, -1)
    
        elif snake.direction == (-1, 0):
            snake.direction = (0, 1)
    
        elif snake.direction == (0, 1):
            snake.direction = (1, 0)
    
        elif snake.direction == (0, -1):
            snake.direction = (-1, 0)
    
    2 回复  |  直到 7 年前
        1
  •  2
  •   Max Collier    7 年前

    解决方案

    import numpy as np
    
    def update_direction (m, move):
        return m = tuple(np.flip((np.array(m) * move) * np.array([1, -1]), 0))
    

    但是,您是否考虑过使用更简单的方向表示法?

    例如,只有一个变量 direction 可能的范围是0到3 (0 == North, 1 == East, 2 == South, 3 == West) . 这样当你想转弯时,只需加上一个 turn 值为1或-1。

    # Function updates direction
    def update_direction(snake, turn):
        snake.direction = (snake.direction + turn) % 4
    
    # turn left
    update_direction(snake, -1)
    
    # turn right
    update_direction(snake, 1)
    

    然后您可以将此逻辑转换为使蛇最有效的方法。

        2
  •  2
  •   Sven Harris    7 年前

    你可以用线性代数来帮助你解决这个问题。使用numpy,可以将方向向量乘以适当的旋转矩阵:

    import numpy as np
    
    if move == -1:
        rot_mat = np.array([[0, -1], [1, 0]])
    elif move == 1:
        rot_mat = np.array([[0, 1], [-1, 0]])
    

    这些是数学矩阵,当用你的速度(方向)向量得到点积时,它会给你新的旅行方向向量。

    snake.direction = tuple(np.array(snake.direction).dot(rot_mat))
    

    或者如果你想进一步压缩它,你可以用一行代码来完成整个工作。

    snake.direction = tuple(np.array(snake.direction).dot(move * np.array([[0, 1], [-1, 0]])))