python代码实现打乒乓球游戏

代码说明:
窗口设置:初始化游戏窗口,设置背景颜色和尺寸。
球拍和球:创建两个球拍和一个球,设置它们的外观和初始位置。
分数和分数板:显示当前的分数。
控制球拍:通过键盘事件控制球拍的移动。
主游戏循环:更新球的位置,处理边界和球拍碰撞,更新分数。
运行游戏:
运行代码后,使用 W 和 S 键控制左侧球拍,使用箭头键控制右侧球拍。
游戏会实时显示分数,并处理球的移动和碰撞。

import turtle

# 设置窗口
win = turtle.Screen()
win.title("乒乓球游戏")
win.bgcolor("black")
win.setup(width=800, height=600)
win.tracer(0)  # 关闭动画更新,提高性能

# 左侧球拍
left_paddle = turtle.Turtle()
left_paddle.speed(0)
left_paddle.shape("square")
left_paddle.color("white")
left_paddle.shapesize(stretch_wid=6, stretch_len=1)
left_paddle.penup()
left_paddle.goto(-350, 0)

# 右侧球拍
right_paddle = turtle.Turtle()
right_paddle.speed(0)
right_paddle.shape("square")
right_paddle.color("white")
right_paddle.shapesize(stretch_wid=6, stretch_len=1)
right_paddle.penup()
right_paddle.goto(350, 0)

# 球
ball = turtle.Turtle()
ball.speed(40)
ball.shape("circle")
ball.color("white")
ball.penup()
ball.goto(0, 0)
ball.dx = 0.175
ball.dy = -0.175

# 分数
left_score = 0
right_score = 0

# 分数板
scoreboard = turtle.Turtle()
scoreboard.speed(0)
scoreboard.color("white")
scoreboard.penup()
scoreboard.hideturtle()
scoreboard.goto(0, 260)
scoreboard.write("左侧: 0  右侧: 0", align="center", font=("Courier", 24, "normal"))

# 控制左侧球拍
def left_paddle_up():
    y = left_paddle.ycor()
    if y < 250:
        y += 20
        left_paddle.sety(y)

def left_paddle_down():
    y = left_paddle.ycor()
    if y > -240:
        y -= 20
        left_paddle.sety(y)

# 控制右侧球拍
def right_paddle_up():
    y = right_paddle.ycor()
    if y < 250:
        y += 20
        right_paddle.sety(y)

def right_paddle_down():
    y = right_paddle.ycor()
    if y > -240:
        y -= 20
        right_paddle.sety(y)

# 键盘绑定
win.listen()
win.onkeypress(left_paddle_up, "w")
win.onkeypress(left_paddle_down, "s")
win.onkeypress(right_paddle_up, "Up")
win.onkeypress(right_paddle_down, "Down")

# 主游戏循环
while True:
    win.update()

    # 移动球
    ball.setx(ball.xcor() + ball.dx)
    ball.sety(ball.ycor() + ball.dy)

    # 边界检测
    if ball.ycor() > 290:
        ball.sety(290)
        ball.dy *= -1

    if ball.ycor() < -290:
        ball.sety(-290)
        ball.dy *= -1

    if ball.xcor() > 390:
        ball.goto(0, 0)
        ball.dx *= -1
        left_score += 1
        scoreboard.clear()
        scoreboard.write(f"左侧: {left_score}  右侧: {right_score}", align="center", font=("Courier", 24, "normal"))

    if ball.xcor() < -390:
        ball.goto(0, 0)
        ball.dx *= -1
        right_score += 1
        scoreboard.clear()
        scoreboard.write(f"左侧: {left_score}  右侧: {right_score}", align="center", font=("Courier", 24, "normal"))

    # 球拍与球的碰撞检测
    if (ball.dx > 0) and (350 > ball.xcor() > 340) and (right_paddle.ycor() + 50 > ball.ycor() > right_paddle.ycor() - 50):
        ball.setx(340)
        ball.dx *= -1

    if (ball.dx < 0) and (-350 < ball.xcor() < -340) and (left_paddle.ycor() + 50 > ball.ycor() > left_paddle.ycor() - 50):
        ball.setx(-340)
        ball.dx *= -1

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值