Files
ping_pong/main.py
Frank ed26cee5c5 111
2026-06-17 15:32:42 +08:00

162 lines
3.9 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import pgzrun
import random
#分数
scorep1 = 0
scorep2 = 0
# 防重复加分标记
hit_paddle1 = False
hit_paddle2 = False
#随机数生成
random_intX = random.randint(235, 1685)
random_intY = random.randint(235, 845)
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
#box生成
tbox = Actor("t_box")
tbox.x = random_intX
tbox.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():
global scorep1, scorep2
screen.clear()
bg.draw()
paddle1.draw()
paddle2.draw()
ball.draw()
tbox.draw()
#分数
screen.draw.text('Score_p1: ' + str(scorep1), (15,10), color=(255,255,255), fontsize=30)
screen.draw.text('Score_p2: ' + str(scorep2), (1750,10), color=(255,255,255), fontsize=30)
# 游戏结束提示
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
global scorep1, scorep2, hit_paddle1, hit_paddle2
global random_intX, random_intY
# 每一帧重置碰撞标记,保证一次碰撞只加一次分
hit_paddle1 = False
hit_paddle2 = False
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) and not hit_paddle1:
ball_speed_x *= -1
sounds.bump.play()
scorep1 += 1
hit_paddle1 = True
# 右球拍接住加分
if ball.colliderect(paddle2) and not hit_paddle2:
ball_speed_x *= -1
sounds.bump.play()
scorep2 += 1
hit_paddle2 = True
#方块实现
if ball.colliderect(tbox):
sounds.box_co.play()
# 判断撞方块左侧/右侧翻转X速度
if ball.centerx < tbox.x:
ball_speed_x = -abs(ball_speed_x) - 1
else:
ball_speed_x = abs(ball_speed_x) + 1
# 判断撞方块上侧/下侧翻转Y速度
if ball.centery < tbox.y:
ball_speed_y = -abs(ball_speed_y)
else:
ball_speed_y = abs(ball_speed_y)
# 重新生成方块坐标
random_intX = random.randint(235, 1685)
random_intY = random.randint(235, 845)
tbox.x = random_intX
tbox.y = random_intY
# 出左右边界游戏结束,这里不再加分
if ball.left <= 0:
game_state = "gameover"
lose_text = "player 2 win!"
sounds.zhanbai.play()
if ball.right >= WIDTH:
game_state = "gameover"
lose_text = "player 1 win!"
sounds.zhanbai.play()
# 空格重新开局
def on_key_down(key):
global game_state, ball_speed_x, ball_speed_y, scorep1, scorep2
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
# 重启清空分数,不需要就注释掉下面两行
scorep1 = 0
scorep2 = 0
pgzrun.go()