用Python3写条贪吃蛇,发现没有想象的那么难哎-pygame队列、完结撒花

本文介绍了作者在实现贪吃蛇游戏过程中遇到的问题及解决方案。早期版本中,蛇的位置更新通过深复制和列表操作实现,导致蛇移动时错位。后来作者发现只需删除蛇尾并处理两个元素即可。此外,文章还涉及键盘输入处理、咬蛇自尽的判断以及目标生成的逻辑。在代码优化后,作者面临flake8警告的问题,通过捕获异常并打印无用提示来消除警告。
摘要由CSDN通过智能技术生成

有图有真相

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

流程

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的会产生另外一个警告-.-)

参考

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值