Files
ping_pong/main.py
2026-06-15 09:39:21 +08:00

98 lines
2.2 KiB
Python

import pgzrun
music.play('bgm')
# 窗口参数
WIDTH = 1920
HEIGHT = 1080
TITLE = "Ping_Pang"
# 左右球拍
paddle1 = Actor("1")
paddle1.x = 80
paddle1.y = HEIGHT / 2
paddle_speed = 8
paddle2 = Actor("2")
paddle2.x = WIDTH - 80
paddle2.y = HEIGHT / 2
# 乒乓球
ball = Actor("ball")
ball.pos = (WIDTH//2, HEIGHT//2)
ball_speed_x = 7
ball_speed_y = 7
# 游戏状态: playing / gameover
game_state = "playing"
lose_text = ""
# 球拍上下限位
half_h = paddle1.height / 2
top = half_h
bottom = HEIGHT - half_h
bg = Actor("bg")
def draw():
screen.clear()
bg.draw()
paddle1.draw()
paddle2.draw()
ball.draw()
# 游戏结束提示
if game_state == "gameover":
screen.draw.text(lose_text, center=(WIDTH//2, HEIGHT//2), fontsize=80, color="red")
screen.draw.text("click space to restar", center=(WIDTH//2, HEIGHT//2+80), fontsize=40, color="white")
def update():
global ball_speed_x, ball_speed_y, game_state, lose_text
if game_state != "playing":
return
# 左拍 W S
if keyboard.w and paddle1.y>top:
paddle1.y -= paddle_speed
if keyboard.s and paddle1.y<bottom:
paddle1.y += paddle_speed
# 右拍 ↑ ↓
if keyboard.up and paddle2.y>top:
paddle2.y -= paddle_speed
if keyboard.down and paddle2.y<bottom:
paddle2.y += paddle_speed
# 小球移动
ball.x += ball_speed_x
ball.y += ball_speed_y
# 上下墙壁反弹
if ball.top <= 0 or ball.bottom >= HEIGHT:
ball_speed_y *= -1
sounds.bump.play()
# 球拍碰撞反弹
if ball.colliderect(paddle1) or ball.colliderect(paddle2):
ball_speed_x *= -1
sounds.bump.play()
# 出左右边界直接失败
if ball.left <= 0:
game_state = "gameover"
lose_text = "Himeko win!"
sounds.zhanbai.play()
if ball.right >= WIDTH:
game_state = "gameover"
lose_text = "Theresa Apocalypse win!"
sounds.zhanbai.play()
# 空格重新开局
def on_key_down(key):
global game_state, ball_speed_x, ball_speed_y
if key == keys.SPACE and game_state == "gameover":
game_state = "playing"
ball.pos = (WIDTH//2, HEIGHT//2)
ball_speed_x = 7
ball_speed_y = 7
pgzrun.go()