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

原创
01/04 23:11
阅读数 0

周六了,让我们按照老规矩,一起读点代码放松一下吧!

今天要给大家看的代码是一段游戏的代码,不同于之前的贪吃蛇和 flappy bird,这一次是一个可以俩人同时进行的游戏:pong,可以看作简化的乒乓球游戏。

游戏动图:

源码

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

from random import choice, random
from turtle import *
from freegames import vector

def value():
"Randomly generate value between (-5, -3) or (3, 5)."
return (3 + random() * 2) * choice([1, -1])

ball = vector(0, 0)
aim = vector(value(), value())
state = {1: 0, 2: 0}

def move(player, change):
"Move player position by change."
state[player] += change

def rectangle(x, y, width, height):
"Draw rectangle at (x, y) with given width and height."
up()
goto(x, y)
down()
begin_fill()
for count in range(2):
forward(width)
left(90)
forward(height)
left(90)
end_fill()

def draw():
"Draw game and move pong ball."
clear()
rectangle(-200, state[1], 10, 50)
rectangle(190, state[2], 10, 50)

ball.move(aim)
x = ball.x
y = ball.y

up()
goto(x, y)
dot(10)
update()

if y < -200 or y > 200:
aim.y = -aim.y

if x < -185:
low = state[1]
high = state[1] + 50

if low <= y <= high:
aim.x = -aim.x
else:
return

if x > 185:
low = state[2]
high = state[2] + 50

if low <= y <= high:
aim.x = -aim.x
else:
return

ontimer(draw, 50)

setup(420, 420, 370, 0)
hideturtle()
tracer(False)
listen()
onkey(lambda: move(1, 20), 'w')
onkey(lambda: move(1, -20), 's')
onkey(lambda: move(2, 20), 'i')
onkey(lambda: move(2, -20), 'k')
draw()
done()

运行

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

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

分析

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

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

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

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

接下来就是自定义的函数和游戏中要用到的全局变量。我们只要根据游戏中有哪些角色,他们该怎么移动,以及有哪些数据的变化,就可以很好的理解代码了。

这个游戏里是两类角色,一个小球,旁边两个挡板。小球上下左右移动,遇到上下的墙,以及左右的挡板会反弹,挡板可以根据键盘操作上下移动。

小球的移动是随机的,所以先来个 value 函数,随机给出一定范围的移动坐标。

接下来表示游戏中的主要变量,小球,移动坐标,角色状态。其中,小球初始位置为中间,aim 表示移动的位置,所以坐标结合上面的 value 随机函数给出,接下来的状态用来表示左右挡板的上下移动,用字典的 key 表示左右两个玩家 1 和 2.

move 函数修改两个玩家的上下坐标,玩家的键盘绑定在代码最后的 onkey 中给出,即左边玩家为 w/s,右边玩家为 i/k,分别用来移动左右挡板。

rectangle 函数用来绘制左右玩家,通过参数 x,y 绘制坐标,width 和 height 绘制宽和高。

draw 函数是主要运行函数,函数最底下是一个定时器,不断循环这个函数,直到小球出局。函数内部每次先用 clear 刷新,然后绘制左右玩家。接下来随机移动小球,小球是在规定好的范围内移动,碰到上下边界需要反弹,即更改 y 坐标。接下来用 x 坐标分别和左右两个玩家的挡板进行判断,当小球的 y 坐标在挡板范围内,相当于球被拍子击中,需要反弹,即更换 x 坐标的正负号。否则小球出局,游戏结束。

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

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

相关阅读:

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

本文分享自微信公众号 - Python随身听(PythonRadio)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部