Spaces:
Sleeping
Sleeping
File size: 3,951 Bytes
e53fda1 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 |
import pygame
import sys
# 初始化 Pygame
pygame.init()
# 常量定义
WIDTH, HEIGHT = 800, 600
BLACK = (0, 0, 0)
WHITE = (255, 255, 255)
FPS = 60
PADDLE_WIDTH, PADDLE_HEIGHT = 10, 200
BALL_SIZE = 40
PADDLE_SPEED = 5
BALL_SPEED_X, BALL_SPEED_Y = 4, 4
FONT_SIZE = 30
class PongGame:
def __init__(self):
# 设置窗口
self.screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption('Pong')
# 创建时钟对象
self.clock = pygame.time.Clock()
# 创建字体
self.font = pygame.font.SysFont('Courier', FONT_SIZE)
# 分数
self.scoreA = 0
self.scoreB = 0
# 创建球
self.ball = pygame.Rect(WIDTH // 2 - BALL_SIZE // 2, HEIGHT // 2 - BALL_SIZE // 2, BALL_SIZE, BALL_SIZE)
self.ball_dx = BALL_SPEED_X
self.ball_dy = BALL_SPEED_Y
# 创建球拍
self.paddleA = pygame.Rect(20, HEIGHT // 2 - PADDLE_HEIGHT // 2, PADDLE_WIDTH, PADDLE_HEIGHT)
self.paddleB = pygame.Rect(WIDTH - 20 - PADDLE_WIDTH, HEIGHT // 2 - PADDLE_HEIGHT // 2, PADDLE_WIDTH, PADDLE_HEIGHT)
# 边界线
self.border_up = HEIGHT // 2 - 15
self.border_down = -HEIGHT // 2 + 15
self.border_left = WIDTH // 2 - 20
self.border_right = -WIDTH // 2 + 20
def draw_field(self):
# 绘制边框
pygame.draw.rect(self.screen, WHITE, pygame.Rect(10, 10, WIDTH - 20, HEIGHT - 20), 2)
# 中线
pygame.draw.aaline(self.screen, WHITE, (WIDTH // 2, 10), (WIDTH // 2, HEIGHT - 10))
def draw_objects(self):
# 绘制球拍和球
pygame.draw.rect(self.screen, WHITE, self.paddleA)
pygame.draw.rect(self.screen, WHITE, self.paddleB)
pygame.draw.ellipse(self.screen, WHITE, self.ball)
def draw_score(self):
score_text = self.font.render(f"Player A: {self.scoreA} Player B: {self.scoreB}", True, WHITE)
self.screen.blit(score_text, (WIDTH // 2 - score_text.get_width() // 2, 20))
def handle_movement(self, keys):
# 控制 Paddle A
if keys[pygame.K_w] and self.paddleA.top > 10:
self.paddleA.y -= PADDLE_SPEED
if keys[pygame.K_s] and self.paddleA.bottom < HEIGHT - 10:
self.paddleA.y += PADDLE_SPEED
# 控制 Paddle B
if keys[pygame.K_UP] and self.paddleB.top > 10:
self.paddleB.y -= PADDLE_SPEED
if keys[pygame.K_DOWN] and self.paddleB.bottom < HEIGHT - 10:
self.paddleB.y += PADDLE_SPEED
def move_ball(self):
self.ball.x += self.ball_dx
self.ball.y += self.ball_dy
# 上下边界碰撞
if self.ball.top <= 10 or self.ball.bottom >= HEIGHT - 10:
self.ball_dy *= -1
# 左右边界得分
if self.ball.left <= 10:
self.scoreB += 1
self.reset_ball()
if self.ball.right >= WIDTH - 10:
self.scoreA += 1
self.reset_ball()
# 球与球拍碰撞
if self.ball.colliderect(self.paddleA) and self.ball_dx < 0:
self.ball_dx *= -1
if self.ball.colliderect(self.paddleB) and self.ball_dx > 0:
self.ball_dx *= -1
def reset_ball(self):
self.ball.center = (WIDTH // 2, HEIGHT // 2)
self.ball_dx *= -1
def run(self):
running = True
while running:
self.clock.tick(FPS)
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
keys = pygame.key.get_pressed()
self.handle_movement(keys)
self.move_ball()
# 绘制
self.screen.fill(BLACK)
self.draw_field()
self.draw_objects()
self.draw_score()
pygame.display.flip()
pygame.quit()
sys.exit()
if __name__ == "__main__":
game = PongGame()
game.run()
|