162 lines
3.9 KiB
Python
162 lines
3.9 KiB
Python
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()
|
||
|