Python 打砖块:小球与挡板的欢乐互动

直接可以用的简单Python打砖块代码

import pygame
import random

# 初始化pygame
pygame.init()

# 游戏窗口大小
width, height = 640, 480
screen = pygame.display.set_mode((width, height))
pygame.display.set_caption("打砖块游戏")

# 颜色定义
white = (255, 255, 255)
black = (0, 0, 0)
red = (255, 0, 0)
blue = (0, 0, 255)

# 挡板相关参数
paddle_width = 100
paddle_height = 10
paddle_x = width / 2 - paddle_width / 2
paddle_y = height - 20
paddle_speed = 5

# 小球相关参数
ball_radius = 10
ball_x = width / 2
ball_y = height / 2
ball_speed_x = 3
ball_speed_y = -3

# 砖块相关参数
brick_width = 60
brick_height = 20
bricks = []
for row in range(3):
    for col in range(8):
        brick_x = col * (brick_width + 5) + 20
        brick_y = row * (brick_height + 5) + 50
        bricks.append([brick_x, brick_y])

# 游戏结束标志
game_over = False

# 游戏主循环
clock = pygame.time.Clock()
while not game_over:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            game_over = True

    # 移动挡板
    keys = pygame.key.get_pressed()
    if keys[pygame.K_LEFT] and paddle_x > 0:
        paddle_x -= paddle_speed
    if keys[pygame.K_RIGHT] and paddle_x < width - paddle_width:
        paddle_x += paddle_speed

    # 移动小球
    ball_x += ball_speed_x
    ball_y += ball_speed_y

    # 小球与墙壁碰撞
    if ball_x <= 0 or ball_x >= width - ball_radius:
        ball_speed_x *= -1
    if ball_y <= 0:
        ball_speed_y *= -1

    # 小球与挡板碰撞
    if ball_y >= paddle_y - ball_radius and ball_x >= paddle_x and ball_x <= paddle_x + paddle_width:
        ball_speed_y *= -1

    # 小球与砖块碰撞
    for brick in bricks[:]:
        if brick[0] <= ball_x <= brick[0] + brick_width and brick[1] <= ball_y <= brick[1] + brick_height:
            ball_speed_y *= -1
            bricks.remove(brick)

    # 绘制背景
    screen.fill(black)

    # 绘制挡板
    pygame.draw.rect(screen, white, [paddle_x, paddle_y, paddle_width, paddle_height])

    # 绘制小球
    pygame.draw.circle(screen, red, (ball_x, ball_y), ball_radius)

    # 绘制砖块
    for brick in bricks:
        pygame.draw.rect(screen, blue, [brick[0], brick[1], brick_width, brick_height])

    pygame.display.update()

    # 检查游戏是否结束(砖块全部被消除)
    if len(bricks) == 0:
        game_over = True

    # 设置游戏帧率
    clock.tick(60)

# 游戏结束,显示胜利信息
font_style = pygame.font.SysFont(None, 50)
win_text = font_style.render("你赢了!", True, white)
screen.blit(win_text, [width / 2 - 50, height / 2])
pygame.display.update()
pygame.time.delay(2000)

# 退出游戏
pygame.quit()
quit()

步骤简单解释:

以下是对这段打砖块游戏代码的详细解释:

1. 导入模块和初始化

import pygame
import random

# 初始化pygame
pygame.init()
  • 首先导入了 pygame 库用于游戏开发,random 库用于生成随机数。然后调用 pygame.init() 函数初始化 pygame 的各个模块,这是使用 pygame 进行游戏开发的第一步

2. 设置游戏窗口和颜色

# 游戏窗口大小
width, height = 640, 480
screen = pygame.display.set_mode((width, height))
pygame.display.set_caption("打砖块游戏")

# 颜色定义
white = (255, 255, 255)
black = (0, 0, 0)
red = (255, 0, 0)
blue = (0, 0, 255)
  • 定义了游戏窗口的宽度为 640 像素,高度为 480 像素,并使用 pygame.display.set_mode 创建了游戏窗口。pygame.display.set_caption 用于设置窗口的标题为 “打砖块游戏”
  • 接着定义了几种颜色,使用 RGB 颜色模式,方便在后续绘制图形时使用这些颜色

3. 挡板相关参数设置

# 挡板相关参数
paddle_width = 100
paddle_height = 10
paddle_x = width / 2 - paddle_width / 2
paddle_y = height - 20
paddle_speed = 5
  • 定义了挡板的宽度 paddle_width100 像素,高度 paddle_height10 像素
  • paddle_xpaddle_y 分别表示挡板的初始横坐标和纵坐标,通过计算将挡板放置在窗口底部中间位置
  • paddle_speed 表示挡板的移动速度,这里设置为 5 像素

4. 小球相关参数设置

# 小球相关参数
ball_radius = 10
ball_x = width / 2
ball_y = height / 2
ball_speed_x = 3
ball_speed_y = -3
  • 定义了小球的半径 ball_radius10 像素,初始横坐标 ball_x 和纵坐标 ball_y 分别设置为窗口的中间位置
  • ball_speed_xball_speed_y 分别表示小球在水平和垂直方向上的初始速度,水平速度为 3 像素,垂直速度为 -3 像素(向上运动)

5. 砖块相关参数设置和初始化

# 砖块相关参数
brick_width = 60
brick_height = 20
bricks = []
for row in range(3):
    for col in range(8):
        brick_x = col * (brick_width + 5) + 20
        brick_y = row * (brick_height + 5) + 50
        bricks.append([brick_x, brick_y])
  • 定义了砖块的宽度 brick_width60 像素,高度 brick_height20 像素
  • 通过两层循环初始化砖块的位置,将砖块排列成 38 列,每行砖块之间间隔 5 像素,每列砖块之间也间隔 5 像素,并将每个砖块的位置信息(横坐标和纵坐标)存储在 bricks 列表中

6. 游戏主循环

# 游戏结束标志
game_over = False

# 游戏主循环
clock = pygame.time.Clock()
while not game_over:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            game_over = True
  • 定义了一个 game_over 变量作为游戏结束的标志,初始值为 False
  • 创建了一个 pygame.time.Clock 对象 clock,用于控制游戏的帧率。然后进入一个 while 循环,只要 game_overFalse,游戏就会持续运行
  • 在循环内部,通过 pygame.event.get() 获取所有的事件,并检查是否有 pygame.QUIT 事件(即用户点击窗口关闭按钮),如果有,则将 game_over 设置为 True,结束游戏循环

7. 挡板移动

# 移动挡板
keys = pygame.key.get_pressed()
if keys[pygame.K_LEFT] and paddle_x > 0:
    paddle_x -= paddle_speed
if keys[pygame.K_RIGHT] and paddle_x < width - paddle_width:
    paddle_x += paddle_speed
  • 使用 pygame.key.get_pressed() 获取当前键盘按键的状态,存储在 keys 变量中
  • 如果按下了左箭头键(pygame.K_LEFT)并且挡板的横坐标 paddle_x 大于 0(防止挡板移出窗口左侧),则将挡板的横坐标减去 paddle_speed,实现向左移动
  • 如果按下了右箭头键(pygame.K_RIGHT)并且挡板的横坐标 paddle_x 小于窗口宽度减去挡板宽度(width - paddle_width)(防止挡板移出窗口右侧),则将挡板的横坐标加上 paddle_speed,实现向右移动

8. 小球移动和碰撞检测

# 移动小球
ball_x += ball_speed_x
ball_y += ball_speed_y

# 小球与墙壁碰撞
if ball_x <= 0 or ball_x >= width - ball_radius:
    ball_speed_x *= -1
if ball_y <= 0:
    ball_speed_y *= -1

# 小球与挡板碰撞
if ball_y >= paddle_y - ball_radius and ball_x >= paddle_x and ball_x <= paddle_x + paddle_width:
    ball_speed_y *= -1

# 小球与砖块碰撞
for brick in bricks[:]:
    if brick[0] <= ball_x <= brick[0] + brick_width and brick[1] <= ball_y <= brick[1] + brick_height:
        ball_speed_y *= -1
        bricks.remove(brick)
  • 小球的移动通过更新其横坐标 ball_x 和纵坐标 ball_y 来实现,分别加上水平速度 ball_speed_x 和垂直速度 ball_speed_y
  • 对于小球与墙壁的碰撞检测:
    • 如果小球的横坐标 ball_x 小于等于 0(碰到左侧墙壁)或者大于等于窗口宽度减去小球半径(碰到右侧墙壁),则将水平速度 ball_speed_x 取反,实现小球在水平方向上的反弹。
    • 如果小球的纵坐标 ball_y 小于等于 0(碰到顶部墙壁),则将垂直速度 ball_speed_y 取反,实现小球在垂直方向上的反弹
  • 对于小球与挡板的碰撞检测:如果小球的纵坐标 ball_y 大于等于挡板的纵坐标减去小球半径(表示小球即将碰到挡板),并且小球的横坐标 ball_x 在挡板的横坐标范围内(paddle_xpaddle_x + paddle_width),则将垂直速度 ball_speed_y 取反,实现小球在碰到挡板后的反弹
  • 对于小球与砖块的碰撞检测:通过遍历 bricks 列表中的每个砖块,检查小球的位置是否与砖块的位置有重叠(即小球的横坐标在砖块的横坐标范围内,小球的纵坐标在砖块的纵坐标范围内),如果有碰撞,则将垂直速度 ball_speed_y 取反,实现小球的反弹,并且从 bricks 列表中移除该砖块,表示砖块被消除

9. 绘制游戏画面

# 绘制背景
screen.fill(black)

# 绘制挡板
pygame.draw.rect(screen, white, [paddle_x, paddle_y, paddle_width, paddle_height])

# 绘制小球
pygame.draw.circle(screen, red, (ball_x, ball_y), ball_radius)

# 绘制砖块
for brick in bricks:
    pygame.draw.rect(screen, blue, [brick[0], brick[1], brick_width, brick_height])

pygame.display.update()
  • 首先使用 screen.fill(black) 将整个游戏窗口填充为黑色,作为背景色
  • 然后使用 pygame.draw.rect 函数绘制挡板,传入窗口对象 screen、颜色 white、以及挡板的位置和大小信息([paddle_x, paddle_y, paddle_width, paddle_height]
  • 使用 pygame.draw.circle 函数绘制小球,传入窗口对象 screen、颜色 red、小球的中心坐标 (ball_x, ball_y) 和半径 ball_radius
  • 通过循环遍历 bricks 列表,使用 pygame.draw.rect 函数绘制每个砖块,传入窗口对象 screen、颜色 blue、以及砖块的位置和大小信息([brick[0], brick[1], brick_width, brick_height]
  • 最后调用 pygame.display.update() 更新游戏窗口的显示,将绘制的内容显示在屏幕上

10. 游戏结束判断和处理

# 检查游戏是否结束(砖块全部被消除)
if len(bricks) == 0:
    game_over = True

# 设置游戏帧率
clock.tick(60)
  • 在每次循环结束前,检查 bricks 列表的长度,如果长度为 0,表示所有砖块都被消除,将 game_over 设置为 True,结束游戏循环
  • 使用 clock.tick(60) 设置游戏的帧率为 60 帧每秒,即每秒循环 60 次,控制游戏的运行速度

11. 游戏结束显示胜利信息和退出游戏

# 游戏结束,显示胜利信息
font_style = pygame.font.SysFont(None, 50)
win_text = font_style.render("你赢了!", True, white)
screen.blit(win_text, [width / 2 - 50, height / 2])
pygame.display.update()
pygame.time.delay(2000)

# 退出游戏
pygame.quit()
quit()
  • 当游戏结束(game_overTrue)时,创建一个字体对象 font_style,使用 render 方法将胜利信息 “你赢了!” 渲染为一个图像对象 win_text,设置字体大小为 50,颜色为白色
  • 使用 screen.blit 将胜利信息图像显示在窗口中间位置([width / 2 - 50, height / 2]),然后调用 pygame.display.update() 更新显示
  • 使用 pygame.time.delay(2000) 让胜利信息在屏幕上停留 2000 毫秒(2 秒),方便玩家看到。
  • 最后调用 pygame.quit() 关闭 pygame 库,释放相关资源,再调用 quit() 退出程序

这段代码实现了一个简单的打砖块游戏,玩家通过左右移动挡板来反弹小球,撞击并消除砖块,当所有砖块被消除后游戏胜利并显示胜利信息。你可以根据自己的需求对代码进行进一步的扩展和优化,例如增加关卡、难度设置、音效等功能

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值