首页 > 解决方案 > 如何通过反向按箭头键来阻止蛇进入自身

问题描述

我只是复制此代码以供参考我只想知道如何解决自食蛇的问题

class snake(object):
    body = []
    turns = {}
    def _init_(self, color, pos):
        self.color = color
        self.head = cube(pos)
        self.body.append(self.head)
        self.dirnx = 0
        self.dirny = 1
        pass

        def move(self):
            for event in pygame.event.get():
               if event.type == pygame.QUIT:
                    pygame.quit()

                    keys = pygame.key.get_presseed()
                    for key in keys:
                        if keys[pygame.K_LEFT]:
                            self.dirnx = -1
                            self.dirny = 0

                            self.truns[self.head.pos[:]] = [self.dirnx, self.dirny]
                        elif keys[pygame.K_RIGHT]:
                                self.dirnx = 1
                                self.dirny = 0

                                self.truns[self.head.pos[:]] = [self.dirnx, self.dirny]
                        elif keys[pygame.K_UP]:
                                self.dirnx = 0
                                self.dirny = -1

                        elif keys[pygame.K_DOWN]:
                                self.dirnx = 0
                                self.dirny = 1
                                self.truns[self.head.pos[:]] = [self.dirnx, self.dirny]

            for i, c in enumeration(self.body):
                    P = c.pos[:]
                    if p in self.turns:
                            turns = self.turns[p]
                            c.move(turns[0],turns[1])
                            if i == len(self.body)-1:
                                    self.turns.pop(p)
                    else:
                            if c.dirnx == -1 and c.pos[0] <= 0: c.pos = (c.rows-1, c.pos[1])
                            elif c.dirnx == 1 and c.pos[0] >= c.rows-1: c.pos = (0,c.pos[1])
                            elif c.dirnx == 1 and c.pos[1] >= c.rows-1: c.pos = (c.pos[0], 0)
                            elif c.dirnx == -1 and c.pos[1] <= 0: c.pos = (c.pos[0],c.rows-1)
                            else: c.move(c.dirnx,c.dirny)

标签: pythonpygame

解决方案


我认为最简单的解决方案就是如果蛇的方向与用户告诉蛇的方向相反,则忽略该按键。self.dirnx如果我理解您上面的代码,那么您正在使用不同的条件语句和self.dirny在不同的条件语句内跟踪蛇的方向。

作为一个示例,当蛇向右移动时如何跳过左键按下,您可以将条件从if keys[pygame.K_LEFT], 更新为if keys[pygame.K_LEFT] and self.dirnx != 1(确保您当前没有向右移动)。


推荐阅读