欢迎加入我们卧虎藏龙的python讨论qq群:729683466
导语
你正驾驶飞船在宇宙间旅行
优哉游哉,好不惬意
突然,出现了无数的太空垃圾
一瞬间弹片横飞
各个方向都有弹片袭来
怎么躲避
就看你啦!
相关资源 代码获取
1:关注“python趣味爱好者”公众号,回复“ 躲避太空垃圾”获取源代码。
2:加入群聊:729683466。在群文件中下载源代码以及相关资料。
# 效果展示
# 开发工具
python3.6.4
第三方库:pygame,random
#往期推荐
# 讲解部分
一:游戏规则
《躲避太空垃圾》的游戏思路很简单。在黑色的背景中,只有两种游戏元素,第一种是红色的圆圈,代表你自己驾驶的宇宙飞船,第二种是白色的小圆点,代表的是周围的弹片,弹片的方向,速度都是不一样的。同时,如果弹片碰到了边界,就可以反弹回来。
二:弹片类
定义一个弹片的类,主要有以下几个属性
x = None # x坐标
y = None # y坐标
speed_x = None # x方向的速度
speed_y = None # y方向的速度
radius = None # 半径
color = None # 颜色
第一是当前这个球所在的位置,也就是其x,y坐标,这里的坐标指的是这个球在界面内的像素点的坐标。还有在x,y方向上的速度大小,也就是speed_x和speed_y。此外就是弹片的半径和弹片的颜色,由于每个弹片的大小和颜色都是一样的。在实例化的时候都用一样的数字即可。
在定义弹片的基本属性的时候,采用以下的代码即可。
def __init__(self, x, y, speed_x, speed_y, radius, color):
self.x = x
self.y = y
self.speed_x = speed_x
self.speed_y = speed_y
self.radius = radius
self.color = color
此外,弹片类还有几个功能,其中功能1是draw,意思就是将这个弹片在游戏界面上画出来,方法很简单。用专门画圆圈的函数即可。
pygame.draw.circle(screen, self.color, [self.x, self.y], self.radius)
还有就是弹片的移动,所谓弹片的移动,其实就是修改或者说更新弹片的坐标。代码如下
def move(self, screen):
"""
小球移动
:param screen: 窗口
:return:
"""
self.x += self.speed_x
self.y += self.speed_y
# 左右边界
if self.x > W - self.radius or self.x < self.radius:
self.speed_x = -self.speed_x
# 上下边界
if self.y > H - self.radius or self.y < self.radius:
self.speed_y = -self.speed_y
# 移动频率
time.sleep(0.001)
self.draw(screen)
其中比较重要的就是在弹片到达边界点的时候,进行的反弹处理,就是将弹片的速度方向取一个相反数。
三:飞船类
定义飞船类的时候,首先是飞船的大小以及颜色。然后还需要定义一个功能,就是飞船的移动。
def move(self, screen):
"""
大球移动
:return:
"""
# 鼠标检测
if pygame.mouse.get_focused():
# 获取光标位置,
x, y = pygame.mouse.get_pos()
mouse = pygame.mouse.get_pressed()
pygame.draw.circle(screen, self.color, [x, y], self.radius)
self.x = x
self.y = y
飞船所在的位置其实就是光标所在的位置。这就需要获取鼠标的位置,然后在这个位置画圆圈。这里比较重要的就是如何检测鼠标的坐标点。用pygame里面的函数就是
x, y = pygame.mouse.get_pos()
四:游戏设计
最终需要控制整个游戏的 进行,用到的和所有的游戏都一样,while true循环。首先对pygame进行初始化,然后生成一个游戏界面,写上标题。
随后用一个for循环生成10个弹片。再生成一个飞船。
最后,在一个while循环中进行碰撞检测,检测飞船与每个弹片的距离,如果距离小于13,就表示这个弹片已经撞击到了飞船,那么游戏结束。
def main():
# 初始化pygame模块
pygame.init()
# 设置窗口大小
screen = pygame.display.set_mode((W,H))
# 设置窗口标题
pygame.display.set_caption('躲避太空垃圾')
for i in range(0, 10):
create_ball(screen)
p = Player(10, 'red')
text_time = "TIME:%.3d" % (time.perf_counter())
is_loop = True
while is_loop:
# 重绘屏幕
screen.fill((0))
p.move(screen)
for ball in balls:
ball.move(screen)
if abs(p.x - ball.x) < 13 and abs(p.y - ball.y) < 13:
is_loop = False
break
# 刷新显示
text_time = "TIME:%.3d" % (time.perf_counter())
show_text(screen, text_time, (500, 40), (0, 255, 0), True)
pygame.display.update()
close()
while True:
close()
show_text(screen, "Game over!", (120, 180), "green", True, 60)
show_text(screen, text_time, (220, 270), "green", True, 30)
pygame.display.update()
作者|齐
编辑|齐
PYTHON
扫二维码|关注我们
QQ群:729683466
# 参考来源
github