代码说明:
窗口设置:初始化游戏窗口,设置背景颜色和尺寸。
球拍和球:创建两个球拍和一个球,设置它们的外观和初始位置。
分数和分数板:显示当前的分数。
控制球拍:通过键盘事件控制球拍的移动。
主游戏循环:更新球的位置,处理边界和球拍碰撞,更新分数。
运行游戏:
运行代码后,使用 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
08-14
200
![](https://csdnimg.cn/release/blogv2/dist/pc/img/readCountWhite.png)