有图有真相
流程
1.获取输入
2.计算下一位置
3.判断输赢/得分,没输返回1,输了就结束
前面几个版本的代码再处理下一位置的时候我是真的按照蠕动的逻辑去做的,对列表中的首个元素删除、其它元素都进行移动一个位置,在计算好新位置加到队列末尾。。牵扯到了深复制,最后学了深复制后也确实是实现了,但是会发现舌头在吃到目标之后移动会错位一个格子,后面看了其它贪吃蛇的代码才知道不需要这么扯淡复杂,只需要删除蛇尾,身体的元素根本没有变化,每一次只需要处理两个元素即可。
代码
完整代码见 Gitee-BackToy / snake
第七次commit(448a)就可以跑起来了,后面的commit都是锦上添花罢了
蛇身的坐标用的是队列,py的队列有的麻烦,涉及深浅复制问题。
方向控制
# 获取键盘输入
for event in pygame.event.get():
if event.type == pygame.QUIT: # 右上角x 退出程序
pygame.quit()
exit(0)
if event.type == pygame.KEYDOWN: # 键盘事件,获取方向
if event.key == K_SPACE:
print("space")
elif event.key == K_ESCAPE: # 键盘左上角Esc 退出程序
print("esq")
pygame.quit()
exit(0)
elif event.key in (K_UP, K_w):
DIRECTION = 0
elif event.key in (K_DOWN, K_s):
DIRECTION = 1
elif event.key in (K_LEFT, K_a):
DIRECTION = 2
elif event.key in (K_RIGHT, K_d):
DIRECTION = 3
咬蛇自尽
# 咬蛇自尽判断
try:
tmp = copy.deepcopy(POSITION)
tmpHead = tmp.pop() # 蛇头
tmp.index(tmpHead) # 蛇头在蛇身里返回下标,不在则抛出异常
isFail = True # 咬到自己啦,结束
except Exception as e:
print("你没咬到自己,加油。这是个为了消除flake8(F841)警告的无用提示: ", e)
pass # 没咬到自己
目标在身体中处理
if isEat: # 被吃掉之后随机生成目标
while True:
try:
POSITION.index(TARGET) # 在队列里返回下标,不在则抛出异常
TARGET[0] = random.randint(1, 3)
TARGET[1] = random.randint(1, 6)
except Exception as e:
print("正确生成目标,目标: ", e)
break
isEat = False
一个新问题
这个问题着实不影响我程序的运行,但是我并不像看到bug也不想看到many print
# 咬蛇自尽判断
try:
tmp = copy.deepcopy(POSITION)
tmpHead = tmp.pop() # 蛇头
tmp.index(tmpHead) # 蛇头在蛇身里返回下标,不在则抛出异常
isFail = True # 咬到自己啦,结束
except Exception as e:
print("你没咬到自己,加油。这是个为了消除flake8(F841)警告的无用提示: ", e)
pass # 没咬到自己
在上面的代码中,我需要这个异常,但是我不用e的话,flake8会产生F841警告,还没想到除了使用这个变量e之外怎么消除这个警告。(直接except的会产生另外一个警告-.-)