如何把一个两元素方向元组向左或向右(蛇游戏)?

2024-05-19 14:31:43 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在编写一个蛇游戏人工智能,有以下问题。我将从我的AI类获得下一个move1(右转)或-1(左转)。我得照他们说的做。我的snake的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)

Tags: right游戏编码moveifleft人工智能ai
2条回答

解决方案

import numpy as np

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

但是,您是否想过使用更简化的方向表示法?你知道吗

例如,只有一个变量direction可能的范围是0到3 (0 == North, 1 == East, 2 == South, 3 == West)。这样,当您想要打开时,只需添加1或-1的turn值。你知道吗

# Function updates direction
def update_direction(snake, turn):
    return snake.direction = (snake.direction + turn) % 4

# turn left
update_direction(snake, -1)

# turn right
update_direction(snake, 1)

然后,您可以将此逻辑转换为蛇最有效的方法。你知道吗

你可以用线性代数来帮助你解决这个问题。使用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]])))

相关问题 更多 >