直接可以用的简单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_width
为100
像素,高度paddle_height
为10
像素 paddle_x
和paddle_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_radius
为10
像素,初始横坐标ball_x
和纵坐标ball_y
分别设置为窗口的中间位置 ball_speed_x
和ball_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_width
为60
像素,高度brick_height
为20
像素 - 通过两层循环初始化砖块的位置,将砖块排列成
3
行8
列,每行砖块之间间隔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_over
为False
,游戏就会持续运行 - 在循环内部,通过
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_x
到paddle_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_over
为True
)时,创建一个字体对象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()
退出程序
这段代码实现了一个简单的打砖块游戏,玩家通过左右移动挡板来反弹小球,撞击并消除砖块,当所有砖块被消除后游戏胜利并显示胜利信息。你可以根据自己的需求对代码进行进一步的扩展和优化,例如增加关卡、难度设置、音效等功能