You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
117 lines
3.3 KiB
117 lines
3.3 KiB
import pygame
|
|
import sys
|
|
import random
|
|
|
|
# 初始化 Pygame
|
|
pygame.init()
|
|
|
|
# 设置窗口尺寸
|
|
window_width = 800
|
|
window_height = 600
|
|
window = pygame.display.set_mode((window_width, window_height))
|
|
pygame.display.set_caption("弹球小游戏")
|
|
|
|
# 设置颜色
|
|
WHITE = (255, 255, 255)
|
|
RED = (255, 0, 0)
|
|
BLUE = (0, 0, 255)
|
|
|
|
# 设置小球初始位置和速度
|
|
ball_radius = 10
|
|
ball_x = random.randint(ball_radius, window_width - ball_radius)
|
|
ball_y = ball_radius
|
|
ball_speed_x = random.choice([-5, 5])
|
|
ball_speed_y = 5
|
|
|
|
# 设置挡板初始位置和大小
|
|
paddle_width = 100
|
|
paddle_height = 20
|
|
paddle_x = (window_width - paddle_width) // 2
|
|
paddle_y = window_height - paddle_height - 10
|
|
paddle_speed = 10
|
|
|
|
# 设置时钟
|
|
clock = pygame.time.Clock()
|
|
|
|
# 游戏状态
|
|
game_over = False
|
|
|
|
# 重置游戏
|
|
def reset_game():
|
|
global ball_x, ball_y, ball_speed_x, ball_speed_y, paddle_x, game_over
|
|
ball_x = random.randint(ball_radius, window_width - ball_radius)
|
|
ball_y = ball_radius
|
|
ball_speed_x = random.choice([-5, 5])
|
|
ball_speed_y = 5
|
|
paddle_x = (window_width - paddle_width) // 2
|
|
game_over = False
|
|
|
|
# 主循环
|
|
running = True
|
|
while running:
|
|
# 处理事件
|
|
for event in pygame.event.get():
|
|
if event.type == pygame.QUIT: # 检测窗口关闭事件
|
|
running = False
|
|
elif event.type == pygame.KEYDOWN: # 检测键盘按下事件
|
|
if event.key == pygame.K_RETURN and game_over: # 按下回车键重新开始
|
|
reset_game()
|
|
|
|
# 检测键盘持续按下状态
|
|
keys = pygame.key.get_pressed()
|
|
if keys[pygame.K_LEFT]: # 按下左箭头键
|
|
paddle_x -= paddle_speed
|
|
if keys[pygame.K_RIGHT]: # 按下右箭头键
|
|
paddle_x += paddle_speed
|
|
|
|
# 限制挡板在窗口内移动
|
|
paddle_x = max(0, min(paddle_x, window_width - paddle_width))
|
|
|
|
# 更新小球位置
|
|
if not game_over:
|
|
ball_x += ball_speed_x
|
|
ball_y += ball_speed_y
|
|
|
|
# 小球碰到左右边界时反弹
|
|
if ball_x <= ball_radius or ball_x >= window_width - ball_radius:
|
|
ball_speed_x = -ball_speed_x
|
|
|
|
# 小球碰到上边界时反弹
|
|
if ball_y <= ball_radius:
|
|
ball_speed_y = -ball_speed_y
|
|
|
|
# 小球碰到挡板时反弹
|
|
if (paddle_x <= ball_x <= paddle_x + paddle_width and
|
|
paddle_y <= ball_y + ball_radius <= paddle_y + paddle_height):
|
|
ball_speed_y = -ball_speed_y
|
|
|
|
# 小球碰到下边界时游戏结束
|
|
if ball_y >= window_height - ball_radius:
|
|
game_over = True
|
|
|
|
# 清空屏幕
|
|
window.fill(WHITE)
|
|
|
|
# 绘制小球
|
|
pygame.draw.circle(window, RED, (ball_x, ball_y), ball_radius)
|
|
|
|
# 绘制挡板
|
|
pygame.draw.rect(window, BLUE, (paddle_x, paddle_y, paddle_width, paddle_height))
|
|
|
|
# 显示游戏结束信息
|
|
if game_over:
|
|
font_path = "c:/Windows/Fonts/simhei.ttf"
|
|
font = pygame.font.Font(font_path, 74)
|
|
text = font.render("游戏结束", True, (0, 0, 0))
|
|
text_rect = text.get_rect(center=(window_width // 2, window_height // 2))
|
|
window.blit(text, text_rect)
|
|
|
|
# 更新屏幕
|
|
pygame.display.flip()
|
|
|
|
# 控制帧率
|
|
clock.tick(60)
|
|
|
|
# 退出 Pygame
|
|
pygame.quit()
|
|
sys.exit() |