Pygame第七课:编写弹球游戏

目录

一、程序分析

二、程序编写

2.1 非重点部分

2.1.1 游戏开始

2.1.2 游戏初始化

2.1.3 绘制界面

2.1.4 挡板的移动和变化

2.1.5 弹球的移动

2.1.6 通过生命数来确定生死

2.2 重难点部分

2.2.1  挡板拦住弹球,弹球反弹并加分

2.2.2 碰到边缘


人生苦短,我用Python!

一、程序分析

弹球游戏可以进行分解:

  1. 游戏开始
  2. 游戏初始化
  3. 绘制界面
  4. 挡板的移动和变化(变长或变短)
  5. 弹球的移动
  6. 挡板拦住弹球,弹球反弹并加分
  7. 碰到边缘后,如若没挡住,扣生命数;弹球重新初始化
  8. 通过生命数来确定生死

其中重难点为:

  1. 挡板拦住弹球,弹球反弹并加分(碰撞检测)
  2. 碰到边缘后,如若没挡住,扣生命数;弹球重新初始化(边界检测&条件判断)

二、程序编写

废话不多说,直接写代码!

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 碰到边缘

重点:边界检测

边界检测分四种可能:

  1. 冲过上边界
  2. 超过下边界
  3. 超过左边界
  4. 超过右边界

这里检测的是超过右边界和超过下边界,检测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!

  • 9
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值