周六了,让我们一起读点代码放松一下吧!
今天要给大家看的代码是一段游戏的代码,贪吃蛇。
游戏动图:
建议先仔细阅读一下,然后再往后看 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 杂谈这些栏目,欢迎围观。有任何想法建议疑问欢迎留言,明天见~