python - 如何通过反向按箭头键来阻止蛇进入自身
问题描述
我只是复制此代码以供参考我只想知道如何解决自食蛇的问题
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)
解决方案
我认为最简单的解决方案就是如果蛇的方向与用户告诉蛇的方向相反,则忽略该按键。self.dirnx
如果我理解您上面的代码,那么您正在使用不同的条件语句和self.dirny
在不同的条件语句内跟踪蛇的方向。
作为一个示例,当蛇向右移动时如何跳过左键按下,您可以将条件从if keys[pygame.K_LEFT]
, 更新为if keys[pygame.K_LEFT] and self.dirnx != 1
(确保您当前没有向右移动)。
推荐阅读
- algorithm - T(n) = T(n/2) + clog(n) = O(log(n)^2) 的归纳证明
- powershell - 根据月份将对象移动到 OU
- asp.net-core-webapi - 使用 Ping Federate 使用现有 SSO 向 Web Api 验证 Angular 应用程序
- python - 支持的目标类型是: ('binary', 'multiclass') error with "cross_val_score" function from sklearn.model_selection
- python - 从包含字符串和浮点数的列表中获取浮点数
- git - 如何在树莓派上升级 Git
- java - 初学者 Java 递归链表问题
- prolog - DCG 能够读取命题逻辑表达式
- swift - 无效的 Swift 入口点数据
- apache-spark - Spark结构化流中的按键水印