目录
人生苦短,我用Python!
一、程序分析
弹球游戏可以进行分解:
- 游戏开始
- 游戏初始化
- 绘制界面
- 挡板的移动和变化(变长或变短)
- 弹球的移动
- 挡板拦住弹球,弹球反弹并加分
- 碰到边缘后,如若没挡住,扣生命数;弹球重新初始化
- 通过生命数来确定生死
其中重难点为:
- 挡板拦住弹球,弹球反弹并加分(碰撞检测)
- 碰到边缘后,如若没挡住,扣生命数;弹球重新初始化(边界检测&条件判断)
二、程序编写
废话不多说,直接写代码!
2.1 非重点部分
2.1.1 游戏开始
编写一个函数:游戏开始时等待用户按下任意键来开始游戏,跳出等待。随后调用这个函数即可。
代码如下:
# wait()函数
def wait():
text1 = font.render("弹球游戏", True, BLACK)
text_wait = font.render("按任意键开始游戏", True, BLACK)
screen.fill(WHITE)
screen.blit(text1, (675, 425))
screen.blit(text_wait, (675, 500))
pygame.display.update()
music.play(-1)
while True:
for event in pygame.event.get():
if event.type==pygame.QUIT:
pygame.quit()
sys.exit()
elif event.type==pygame.KEYDOWN:
if event.key==pygame.K_ESCAPE:
pygame.quit()
sys.exit()
else:
return
2.1.2 游戏初始化
游戏初始化就简单了。只需将一些变量改成默认值即可。
代码如下:
ball = pygame.image.load("ball-a.png")
timer = pygame.time.Clock()
ballX = ballY = mark = 0
speed = abs(random.randint(0,30)) # 此处运用了random.randint(a, b),返回a~b的随机数
lives = 6
shelfX = 5
long = 225
shelfY = 1000-50
moveleft = moveright = has = False
# 以上是游戏的初始化
2.1.3 绘制界面
绘制界面就简单多了。
代码:
# 显示
screen.fill(BLACK)
screen.blit(ball, (ballX, ballY))
pygame.draw.rect(screen, WHITE, (shelfX, shelfY, long, 40), 0)
2.1.4 挡板的移动和变化
这里的代码虽多但比较简单,就是进行键盘事件(移动)和鼠标事件(变化)的反应。
代码如下:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
elif event.type == pygame.KEYDOWN:
if event.key == pygame.K_LEFT:
moveleft = True
elif event.key == pygame.K_RIGHT:
moveright = True
elif event.type == pygame.KEYUP:
if event.key == pygame.K_LEFT:
moveleft = False
elif event.key == pygame.K_RIGHT:
moveright = False
elif event.type == pygame.MOUSEBUTTONDOWN:
if pygame.mouse.get_pressed()[0]:
if long <= 400: #如果长度小于等于400,长度增100
long += 100
elif pygame.mouse.get_pressed()[2]:
if long >= 20: #如果大于等于20,除以2
long = long//2
# 挡板的移动
if moveleft:
shelfX -= 20
elif moveright:
shelfX += 20
2.1.5 弹球的移动
此处更简单,改变弹球的X,Y坐标即可。
代码如下:
# 动画
speed += 0.125
ballY += speed
ballX += 10
2.1.6 通过生命数来确定生死
如果生命数<=0,那么进入下一局。
代码如下:
# 生命数为零,停止游戏
if lives == 0:
break #此处通过一个while循环进行一局游戏,跳出循环进入下一局
2.2 重难点部分
敲黑板!!!敲黑板!!!敲黑板!!!
接下来进入其精华!
2.2.1 挡板拦住弹球,弹球反弹并加分
重点:碰撞检测
如何检测碰撞呢?
在这里,碰撞可以拆成两个条件:
- 挡板尾部的X坐标>(=)弹球的X坐标>(=)挡板头部的X坐标
- 弹球的Y坐标在挡板这个位置
代码:
# 碰到挡板
if ballY >= 950 and shelfX+long >= ballX >= shelfX:
ball = pygame.image.load("ball-c.png")
speed = -speed
has = True
2.2.2 碰到边缘
重点:边界检测
边界检测分四种可能:
- 冲过上边界
- 超过下边界
- 超过左边界
- 超过右边界
这里检测的是超过右边界和超过下边界,检测X坐标是否超过边界。随后通过情况确定是否没拦住。
代码:
# 碰到舞台边缘
if ballX >= 1000:
ballX = random.randint(0,450)
ballY = random.randint(0,50)
ball = pygame.image.load("ball-a.png")
speed = random.randint(0,30)
speed = abs(speed)
if has:
mark += 1
has = False
# 球不偏右,没有接住
if ballY >= 1000:
lives -= 1
ball = pygame.image.load("ball-b.png")
ballX = random.randint(0,450)
ballY = random.randint(0,50)
speed = random.randint(0,60)
speed = abs(speed)
好了,下课!
成品见文首。
人生苦短,我用Python!