在python pygame中加速AI障碍检测

在python pygame中加速AI障碍检测,python,pygame,Python,Pygame,我正在尝试训练一个整洁的算法来玩一个叫做“curvefever”的简单游戏。 我能够创建curvefever的pygame版本,现在我想训练AI玩它。 因此,人工智能必须学会避开障碍:游戏周围的边界和每个玩家留下的轨迹,就像蛇一样 目前,我正在以以下方式进行: 每个玩家都有一组向前延伸的“传感器”,用于检测障碍物是否存在以及距离有多远 每个“传感器”是一条由几个pygame矩形组成的直线 对于每个传感器,它将检测是否与障碍物矩形之一发生碰撞,并计算碰撞到玩家的距离 哪个传感器检测到碰撞以及碰撞

我正在尝试训练一个整洁的算法来玩一个叫做“curvefever”的简单游戏。 我能够创建curvefever的pygame版本,现在我想训练AI玩它。 因此,人工智能必须学会避开障碍:游戏周围的边界和每个玩家留下的轨迹,就像蛇一样

目前,我正在以以下方式进行:

  • 每个玩家都有一组向前延伸的“传感器”,用于检测障碍物是否存在以及距离有多远
  • 每个“传感器”是一条由几个pygame矩形组成的直线
  • 对于每个传感器,它将检测是否与障碍物矩形之一发生碰撞,并计算碰撞到玩家的距离
  • 哪个传感器检测到碰撞以及碰撞的距离是传递给神经网络的信息
问题是这太慢了!运行“python-mcprofile-s cumtime ai.py”时,我发现是障碍物的检测减慢了脚本的速度,占用了大约50%的运行时间

请参阅下面我如何创建视线的一些代码:

posx=玩家的x位置

posy=球员的y位置

dir=玩家前进的方向

悬挂=视线之间的度数间隔

角度=视线的总范围(以度为单位)

所有障碍物均为矩形,定义如下:

class Rect(pygame.sprite.Sprite):
    def __init__(self,x,y,width,height,dir,color):
        super().__init__()
        self.image = pygame.Surface([width, height])
        self.image.fill(color)
        self.rect = self.image.get_rect()

        self.rect.centerx = x
        self.rect.centery = y
并保存在精灵组中

我尝试的

我尝试添加一个map命令来摆脱for循环,但这并没有使它加快多少速度

我尝试添加函数名来删除函数查找,我读到这使它更快,但没有

我尝试使用“布雷森汉姆直线算法”检测障碍物,并检查障碍物(x,y)位置是否与视线重叠。虽然这是一种更快的方法,但由于它经常会错过障碍物,因此不起作用。这是因为视线与障碍物中心(rectx,recty)并不完全匹配,尽管它确实与矩形本身重叠

其他人用什么来检测障碍物(可能在pygame中)?任何关于如何使这更快或更有效的提示都是非常受欢迎的


非常感谢你的帮助

那么障碍物就是轨迹,你是如何储存它们的?这是一堆分数吗?或者这更像是一条蛇,它在网格中,你只能上下左右移动?障碍物都是矩形,并保存为一个精灵。组:类矩形(pygame.sprite.sprite):def uu init_uu(self,x,y,width,height,dir,color):super()。uu init_uuu()self.image=pygame.Surface([width,height])self.image.fill(color)self.rect=self.image.get_rect()self.rect.centerx=x self.rect.centery=yan您可以在任何方向上移动悬挂的
角度
?这些角度是否与“传感器”相关?这些角度是否恒定?是的,悬挂和角度与传感器有关。我添加了一张图片,希望能增加一些澄清,两者都是常量
class Rect(pygame.sprite.Sprite):
    def __init__(self,x,y,width,height,dir,color):
        super().__init__()
        self.image = pygame.Surface([width, height])
        self.image.fill(color)
        self.rect = self.image.get_rect()

        self.rect.centerx = x
        self.rect.centery = y