Python随身听-源码分析-经典小游戏


周六了,让我们一起读点代码放松一下吧!

今天要给大家看的代码是一段游戏的代码,贪吃蛇。

游戏动图:

Python随身听-源码分析-经典小游戏_第1张图片

源码

建议先仔细阅读一下,然后再往后看 DE8UG 对源码的分析。

from turtle import *
from random import randrange
from freegames import square, vector

food = vector(0, 0)
snake = [vector(10, 0)]
aim = vector(0, -10)

def change(x, y):
    "Change snake direction."
    aim.x = x
    aim.y = y

def inside(head):
    "Return True if head inside boundaries."
    return -200 < head.x < 190 and -200 < head.y < 190

def move():
    "Move snake forward one segment."
    head = snake[-1].copy()
    head.move(aim)

    if not inside(head) or head in snake:
        square(head.x, head.y, 9, 'red')
        update()
        return

    snake.append(head)

    if head == food:
        print('Snake:', len(snake))
        food.x = randrange(-15, 15) * 10
        food.y = randrange(-15, 15) * 10
    else:
        snake.pop(0)

    clear()

    for body in snake:
        square(body.x, body.y, 9, 'black')

    square(food.x, food.y, 9, 'green')
    update()
    ontimer(move, 100)

setup(420, 420, 370, 0)
hideturtle()
tracer(False)
listen()
onkey(lambda: change(10, 0), 'Right')
onkey(lambda: change(-10, 0), 'Left')
onkey(lambda: change(0, 10), 'Up')
onkey(lambda: change(0, -10), 'Down')
move()
done()

运行

复制上述代码到一个 py 为后缀的文件,命名 snake.py.

在文件所在目录打开控制台:运行pip install freegames,然后运行python snake.py

分析

这个游戏代码是一个第三方库 freegames 的一部分。从最上面导入依赖部分可以看出,主要是依赖于 turtle 这个库。

from turtle import *的最后是个*,表示导入了 turtle 里面所有东西,一般是不建议导入太多内容的,一是可能加载太多没用的代码,二是可能出现同名的类或函数。目前这只是个小游戏,后面也用到不少 turtle 里面的函数,所以这么写勉强可以接受。

往下看,整个代码用到很多函数,只要是 import 没有明确导入的,以及非本 python 文件写的函数,其实都是这个*带来的 turtle 内部函数了。如果你不知道神马意思,记得我我课程里介绍过超全的在线文档吗?https://devdocs.io,你只需要搜一下turtle就可以看到相关解释了。

导入依赖部分还导入了 freegames 库里面一些工具类和函数:from freegames import square, vector,看单词就可以知道一个画框框,表示蛇以及食物。一个是个向量,用来表示坐标。

接下来是向量表示的食物 food,向量列表表示的蛇 snake,以及表示移动目标的 aim。

贪吃蛇,顾名思义是一个贪吃的蛇,当然要四处游动,且添加一些限制。所以有了函数 change,inside 和 move。分别表示根据箭头移动,判断是坐标是否合法,以及移动。

最复杂的是移动函数。这里的逻辑流程为:取到蛇头,走一个位置 aim,判断坐标是否合法,不合法标红并退出,合法继续往后走。给蛇追加新的蛇头坐标,这时候需要判断是否吃到食物,即坐标相同,相同则绘制新蛇头,否则弹出刚刚追加的坐标。接下来用 clear 清理屏幕,绘制整条蛇和新的食物。更新一下,然后 ontimer 定时继续移动的操作。

最后一大段代码主要是设置绘图环境,添加键盘的移动响应。在 onkey 函数里用了 lambda 函数绑定了最上面的 change 函数,修改不同方向移动后的 aim 坐标。

接下来就是启动游戏,开始玩了

ok,这就是本周六的源码分析了,祝你阅读愉快。
目前在 Python 随身听的微信栏目里,已经从周一到周日安排了:技术精选,基础学习,Python 练习,项目连载,难点问答,源码分析,DE8UG 杂谈这些栏目,欢迎围观。有任何想法建议疑问欢迎留言,明天见~
在这里插入图片描述

你可能感兴趣的:(Python随身听)