写点什么

用 Python 实现一个简易版的 Pong 游戏 (二)

用户头像
Matrix Chan
关注
发布于: 2020 年 09 月 07 日
用 Python 实现一个简易版的 Pong 游戏 (二)

回顾

在第一部分,对 Pong 游戏进行了简单的介绍,以及演示了 Turtle 模块的使用。

有了 Turtle 的初步体验后,接下来将开始实现 Pong 游戏。


注意:由于篇幅所限,正文的代码区域不一定显示完整代码,"......" 代表省略的代码。

游戏窗口配置

在 Visual Studio Code 里新建一个 名为 pong.py 的 Python 文件,然后对它进行编辑。

#  引入turtle模块import turtle# 创建一个 Screen 对象,并赋给变量 wnwn = turtle.Screen()# 设置程序窗口的标题为 Pong by @MatrixTechwn.title("Pong by @MatrixTech")# 设置程序窗体的背景颜色为黑色wn.bgcolor("black")# 设置绘图屏幕宽为 800 像素大小,高为 600 像素大小wn.setup(width=800, height=600)# tracer方法调用禁止动画显示wn.tracer(0)
# 主循环while True: # 执行 TurtleScreen 刷新。在每帧绘制结束后调用update方法进行屏幕刷新,让绘制的图形一次性显示在窗口里。 wn.update()
复制代码


这里特别注意的是,wn.tracer(0) 使用 tracer 方法禁止动画显示,然后通过 wn.update() 对屏幕进行刷新,让绘制的图形一次性显示在窗口,无需漫长地等待绘制过程。


运行 pong.py:Visual Studio Code -> 右键-> Run Python File Terminal 


运行成功后,会出现游戏应用的窗体:

添加球拍和乒乓球

添加球拍 A

#  引入turtle模块import turtle# 创建一个 Screen 对象,并赋给变量 wnwn = turtle.Screen()# 设置程序窗口的标题为 Pong by @MatrixTechwn.title("Pong by @MatrixTech")# 设置程序窗体的背景颜色为黑色wn.bgcolor("black")# 设置游戏屏幕宽为 800 像素大小,高为 600 像素大小wn.setup(width=800, height=600)# tracer方法调用禁止动画显示wn.tracer(0)
# 球拍 A (左边球拍)# 通过 turtle 模块创建一个 Turtle 对象,并赋给变量 paddle_apaddle_a = turtle.Turtle()# 设置速度为0paddle_a.speed(0)# 设置形状为矩形paddle_a.shape("square")# 设置颜色为白色paddle_a.color("white")# 画笔抬起,移动时不画线paddle_a.penup()# 前往 x 坐标为 -350, y 坐标为 0 的位置paddle_a.goto(-350,0)
# 球拍 B
# 乒乓球

# 游戏主循环while True: # 执行 TurtleScreen 刷新。在每帧绘制结束后调用update方法进行屏幕刷新,让绘制的图形一次性显示在窗口里。 wn.update()
复制代码

运行程序,查看效果:


程序运行后,球拍 A 是一个长和高都是 20 像素的方块,因此我们需要调整它形状大小。

使用 turtle.shapesize 方法可以调整球拍的形状大小。


turtle.shapesize(stretch_wid=None, stretch_len=None, outline=None)

  • stretch_wid : 接受正数值,垂直方向拉伸;

  • stretch_len : 接受正数值,水平方向拉伸;

  • outline :接受正数值,形状轮廓描边的宽度;

返回或设置画笔的属性 x/y-拉伸因子和/或轮廓。海龟基于拉伸因子调整外观: stretch_wid 为垂直于其朝向的宽度拉伸因子,stretch_len 为水平于其朝向的长度拉伸因子,决定形状轮廓线的粗细。


turtle.shapesize 方法的详细介绍可参阅手册 : https://docs.python.org/zh-cn/3/library/turtle.html#turtle.shapesize


球拍 A 方块原来是 20*20 像素,现在垂直方向拉伸 5,水平拉伸 1,最终长水平方向为 20 像素,垂直方向为 100 像素。


..................
# 球拍 A (左边球拍)# 通过 turtle 模块创建一个 Turtle 对象,并赋给变量 paddle_apaddle_a = turtle.Turtle()# 设置速度为0paddle_a.speed(0)# 设置形状为矩形paddle_a.shape("square")# 设置颜色为白色paddle_a.color("white")# 球拍A 在垂直方向拉伸5(100 像素),水平方向拉伸1(20 像素)paddle_a.shapesize(stretch_wid=5,stretch_len=1)# 画笔抬起 -- 移动时不画线paddle_a.penup()# 前往 x 坐标为 -350, y 坐标为 0 的位置paddle_a.goto(-350,0)..................
复制代码

运行,查看效果:

添加球拍 B

球拍 B 的代码与球拍 A 的代码相似,因此复制球拍 A 的代码块,做些许修改即可。

#  引入turtle模块import turtle# 创建一个 Screen 对象,并赋给变量 wnwn = turtle.Screen()# 设置程序窗口的标题为 Pong by @MatrixTechwn.title("Pong by @MatrixTech")# 设置程序窗体的背景颜色为黑色wn.bgcolor("black")# 设置程序屏幕宽为 800 像素,高为 600 像素wn.setup(width=800, height=600)# tracer方法调用禁止动画显示wn.tracer(0)
# 球拍 A (左边球拍)# 通过 turtle 模块创建一个 Turtle 对象,并赋给变量 paddle_apaddle_a = turtle.Turtle()# 设置速度为0paddle_a.speed(0)# 设置形状为矩形paddle_a.shape("square")# 设置颜色为白色paddle_a.color("white")paddle_a.shapesize(stretch_wid=5,stretch_len=1)# 画笔抬起 -- 移动时不画线paddle_a.penup()# 前往 x 坐标为 -350, y 坐标为 0 的位置paddle_a.goto(-350,0)
# 球拍 B (右边球拍)# 通过 turtle 模块创建一个 Turtle 对象,并赋给变量 paddle_bpaddle_b = turtle.Turtle()# 设置速度为0paddle_b.speed(0)# 设置形状为矩形paddle_b.shape("square")# 设置颜色为白色paddle_b.color("white")paddle_b.shapesize(stretch_wid=5,stretch_len=1)# 画笔抬起 -- 移动时不画线paddle_b.penup()# 前往 x 坐标为 350, y 坐标为 0 的位置paddle_b.goto(350,0)
# 乒乓球

# 游戏主循环while True: # 执行 TurtleScreen 刷新。在每帧绘制结束后调用update方法进行屏幕刷新,让绘制的图形一次性显示在窗口里。 wn.update()
复制代码


运行程序,查看效果:

添加乒乓球

在原点添加一个方块作乒乓求,添加的方法和上面的球拍添加一样, 代码如下:

..................
# 球拍 B (右边球拍)# 通过 turtle 模块创建一个 Turtle 对象,并赋给变量 paddle_bpaddle_b = turtle.Turtle()# 设置速度为0paddle_b.speed(0)# 设置形状为矩形paddle_b.shape("square")# 设置颜色为白色paddle_b.color("white")paddle_b.shapesize(stretch_wid=5,stretch_len=1)# 画笔抬起 -- 移动时不画线paddle_b.penup()# 前往 x 坐标为 350, y 坐标为 0 的位置paddle_b.goto(350,0)
# 乒乓球ball = turtle.Turtle()ball.speed(0)ball.shape("square")ball.color("white")ball.penup()ball.goto(0,0)
# 游戏主循环while True: # 执行 TurtleScreen 刷新。在每帧绘制结束后调用update方法进行屏幕刷新,让绘制的图形一次性显示在窗口里。 wn.update()
复制代码

实现球拍的移动

步骤

  • 创建控制球拍垂直方向上下移动的函数;

  • 把移动函数与键盘按键事件绑定,程序监听键盘按键事件;

  • 用户按下被绑定的按键,触发移动的函数;

移动球拍 A

球拍 A 向上移动:

..................
# 乒乓球ball = turtle.Turtle()ball.speed(0)ball.shape("square")ball.color("white")ball.penup()ball.goto(0,0)
# 向上移动球拍 Adef paddle_a_up(): # 获得 paddle_a 的y坐标数值,并赋给变量 y y = paddle_a.ycor() # 在原来的数值基础上,增加20个像素 y += 20 # 重新设置 paddle_a 的y坐标,使其向上移动20个像素的距离 paddle_a.sety(y)
# 键盘事件绑定# 事件监听wn.listen()# 键盘 w 键的按下事件与方法 paddle_a_up 绑定wn.onkeypress(paddle_a_up,'w')
复制代码


运行程序,查看效果:


球拍 A 向下移动:

..................
# 函数# 向上移动球拍 Adef paddle_a_up(): # 获得 paddle_a 的 y 坐标数值,并赋给变量 y y = paddle_a.ycor() # 在原来的数值基础上,增加20个像素 y += 20 # 重新设置 paddle_a 的y坐标,使其向上移动20个像素的距离 paddle_a.sety(y)
# 向下移动球拍 Adef paddle_a_down(): # 获得 paddle_a 的y坐标数值,并赋给变量 y y = paddle_a.ycor() # 在原来的数值基础上,减少20个像素 y -= 20 # 重新设置 paddle_a 的y坐标,使其向下移动20个像素的距离 paddle_a.sety(y)
# 键盘事件绑定# 事件监听wn.listen()# 键盘 w 键的按下事件与方法 paddle_a_up 绑定wn.onkeypress(paddle_a_up,'w')# 键盘 s 键的按下事件与方法 paddle_a_down 绑定wn.onkeypress(paddle_a_down,'s')

复制代码


运行程序,查看效果:


移动球拍 B

球拍 B 的移动实现与球拍 A 的一样,可以参考球拍 A 移动的代码。

# 函数..................
# 向上移动球拍 Bdef paddle_b_up(): # 获得 paddle_b 的y坐标数值,并赋给变量 y y = paddle_b.ycor() # 在原来的数值基础上,增加20个像素 y += 20 # 重新设置 paddle_b 的y坐标,使其向上移动20个像素的距离 paddle_b.sety(y)
# 向下移动球拍 Bdef paddle_b_down(): # 获得 paddle_b 的y坐标数值,并赋给变量 y y = paddle_b.ycor() # 在原来的数值基础上,减少20个像素 y -= 20 # 重新设置 paddle_b 的y坐标,使其向下移动20个像素的距离 paddle_b.sety(y)
# 键盘事件绑定# 事件监听wn.listen()# 键盘 w 键的按下事件与方法 paddle_a_up 绑定wn.onkeypress(paddle_a_up,'w')# 键盘 s 键的按下事件与方法 paddle_a_down 绑定wn.onkeypress(paddle_a_down,'s')# 键盘 ↑ 键的按下事件与方法 paddle_b_up 绑定wn.onkeypress(paddle_b_up,'Up')# 键盘 ↑ 键的按下事件与方法 paddle_b_down 绑定wn.onkeypress(paddle_b_down,'Down')
..................
复制代码


运行程序,查看效果:


实现乒乓球的移动

程序运行后,在游戏的主循环里不断地按一个坐标增量去更新原先的乒乓球坐标,从而实现乒乓球的移动。

乒乓球的移动

为乒乓球添加坐标的增量:

..................
# 乒乓球ball = turtle.Turtle()ball.speed(0)ball.shape("square")ball.color("white")ball.penup()ball.goto(0,0)# 乒乓球的 x 坐标增量ball.dx = 2# 乒乓球的 y 坐标增量ball.dy = 2..................
复制代码


在游戏主循环中更新乒乓球坐标:

..................
# 游戏主循环while True: # 执行 TurtleScreen 刷新。在每帧绘制结束后调用update方法进行屏幕刷新,让绘制的图形一次性显示在窗口里。 wn.update() # 移动乒乓球 ball.setx(ball.xcor() + ball.dx) ball.sety(ball.ycor() + ball.dy) ..................
复制代码


如果在添加上述代码后运行程序,就会看到乒乓球向右上角移动然后消失。

我们可以为乒乓球添加边界检测解决其消失的问题,实现当乒乓球碰撞到窗口边界后反弹。

我们先把乒乓球对象的 ball.penup() 注释,让“钢笔”放下,这样海龟移动时候就出现轨迹,方便我们看看它碰撞边界后反弹的轨迹。

上边界检测

注释 ball.penup() :

..................
# 乒乓球ball = turtle.Turtle()ball.speed(0)ball.shape("square")ball.color("white")# ball.penup()ball.goto(0,0)# 乒乓球的 x 坐标增量ball.dx = 2# 乒乓球的 y 坐标增量ball.dy = 2
..................
复制代码


在游戏主循环添加上边界检测代码:

..............................
# 游戏主循环while True: print("x: ",ball.xcor()," y: ",ball.ycor() ) # 执行 TurtleScreen 刷新。在每帧绘制结束后调用update方法进行屏幕刷新,让绘制的图形一次性显示在窗口里。 wn.update() # 移动乒乓球 ball.setx(ball.xcor() + ball.dx) ball.sety(ball.ycor() + ball.dy)
# 上边界检测 if ball.ycor() > 290:# 当乒乓球的 y 坐标大于 290 像素时候 # 设置乒乓球的 y 坐标设置为290 ball.sety(290) # 把乒乓球 y 坐标的增量变成 -2 ball.dy *= -1
复制代码


运行程序后,看到效果:


程序启动后,乒乓球从坐标原点(0,0)以增量 (dx=2,dy=2) 往右上角移动。当乒乓球的 y 坐标大于 290 时,乒乓球被被反弹,以增量(dx=2,dy=-2)移动。

下边界检测

..............................
# 游戏主循环while True: print("x: ",ball.xcor()," y: ",ball.ycor() ) # 执行 TurtleScreen 刷新。在每帧绘制结束后调用update方法进行屏幕刷新,让绘制的图形一次性显示在窗口里。 wn.update() # 移动乒乓球 ball.setx(ball.xcor() + ball.dx) ball.sety(ball.ycor() + ball.dy)
# 上边界检测 if ball.ycor() > 290:# 当乒乓球的 y 坐标大于 290 像素时候 # 设置乒乓球的 y 坐标设置为290 ball.sety(290) # 把乒乓球 y 坐标的增量变成 -2 ball.dy *= -1 # 下边界检测 if ball.ycor() < -290:# 当乒乓球的 y 坐标小于 290 像素时候 # 设置乒乓球的 y 坐标设置为290 ball.sety(-290) # 把乒乓球 y 坐标的增量变成 -2 ball.dy *= -1
复制代码


为了查看效果,在运行程序之前,还需要修改乒乓球的坐标增量如下:

# 乒乓球ball = turtle.Turtle()ball.speed(0)ball.shape("square")ball.color("white")# ball.penup()ball.goto(0,0)# 乒乓球的 x 坐标增量ball.dx = 2# 乒乓球的 y 坐标增量ball.dy = -2
复制代码

把 ball.dy = 2 改成 ball.dy = -2 后,乒乓球在程序运行后会向右下方移动。


运行程序,查看结果:


至此,已经完成了上下边界的检测,可以把 ball.penup() 的注释取消:


..................
# 乒乓球ball = turtle.Turtle()ball.speed(0)ball.shape("square")ball.color("white")ball.penup()ball.goto(0,0)# 乒乓球的 x 坐标增量ball.dx = 2# 乒乓球的 y 坐标增量ball.dy = 2
..................
复制代码

左右边界检测

..................
# 游戏主循环while True: ...... ...... ......
# 下边界检测 if ball.ycor() < -290:# 当乒乓球的 y 坐标小于 290 像素时候 # 设置乒乓球的 y 坐标设置为290 ball.sety(-290) # 把乒乓球 y 坐标的增量变成 -2 ball.dy *= -1
# 右边界检测 if ball.xcor() > 390: #当乒乓球的 y 坐标大于 390 像素时候 # 乒乓球恢复到原点坐标 ball.goto(0,0) # 改变开球方向 ball.dx *= -1
# 左边界检测 if ball.xcor() < -390: #当乒乓球的 y 坐标小于 -390 像素时候 # 乒乓球恢复到原点坐标 ball.goto(0,0) # 改变开球方向 ball.dx *= -1
复制代码


球拍 A 的 y 坐标为 -350,球拍 B 的 y 坐标为 350。

当乒乓球的 y 坐标大于 350 时候,说明球拍 B 没有接住乒乓球,球拍 B 失一分,球拍 A 得一分;

反之,当乒乓球的 y 坐标小于 - 350 时候,说明球拍 A 没有接住乒乓球,球拍 A 失一分,球拍 B 得一分。


运行程序,查看结果:


实现球拍和球的碰撞检测

..................
# 游戏主循环while True: ...... ...... ......
# 右边界检测 if ball.xcor() < -390: #当乒乓球的 y 坐标小于 -390 像素时候 # 乒乓球恢复到原点坐标 ball.goto(0,0) # 改变开球方向 ball.dx *= -1
# 乒乓球与球拍 B 的碰撞检测 if (ball.xcor() > 340 and ball.xcor() < 350) and (ball.ycor() < paddle_b.ycor() + 50 and ball.ycor() > paddle_b.ycor() - 50 ): ball.setx(340) ball.dx *= -1
# 乒乓球与球拍 A 的碰撞检测 if (ball.xcor() < -340 and ball.xcor() > -350) and (ball.ycor() < paddle_a.ycor() + 50 and ball.ycor() > paddle_a.ycor() - 50 ): ball.setx(-340) ball.dx *= -1
复制代码


运行程序,查看效果:


分数计算

创建 Pen 绘制得分


..................
# 乒乓球ball = turtle.Turtle()ball.speed(0)ball.shape("square")ball.color("white")ball.penup()ball.goto(0,0)# 乒乓球的 x 坐标增量ball.dx = 2# 乒乓球的 y 坐标增量ball.dy = -2
# Penpen = turtle.Turtle()pen.speed(0)pen.color("white")pen.penup()# 隐藏海龟,加快绘制速度pen.hideturtle()pen.goto(0,260)pen.write("玩家 A: 0 玩家 B: 0", align="center", font=("Courier",24,"normal"))
..................
复制代码


运行程序,查看效果:

计算得分

分别为玩家 A 和玩家 B 添加分数变量:

..................
# Penpen = turtle.Turtle()pen.speed(0)pen.color("white")pen.penup()# 隐藏海龟,加快绘制速度pen.hideturtle()pen.goto(0,260)pen.write("玩家 A: 0 玩家 B: 0", align="center", font=("Courier",24,"normal"))
# 得分score_a = 0score_b = 0
..................
复制代码


添加计分逻辑代码:

..................
# 游戏主循环while True: ...... ...... ......
# 左边界检测 if ball.xcor() > 390: #当乒乓球的 y 坐标大于 390 像素时候 # 乒乓球恢复到原点坐标 ball.goto(0,0) # 改变开球方向 ball.dx *= -1 # score_a 得 1 分 score_a += 1 # 清除画笔 pen 的绘图 pen.clear() # 重新绘制得分结果 pen.write("玩家 A: {} 玩家 B: {}".format(score_a,score_b), align="center", font=("Courier",24,"normal"))
# 右边界检测 if ball.xcor() < -390: #当乒乓球的 y 坐标小于 -390 像素时候 # 乒乓球恢复到原点坐标 ball.goto(0,0) # 改变开球方向 ball.dx *= -1 # 玩家 B 得 1 分 score_b += 1 # 清除画笔 pen 的绘图 pen.clear() # 重新绘制得分结果 pen.write("玩家 A: {} 玩家 B: {}".format(score_a,score_b), align="center", font=("Courier",24,"normal"))
...... ...... ......
复制代码


运行程序,查看效果:


添加音效

音效文件可在此下载: https://github.com/matrixtechxyz/Pong/blob/master/bounce.wav

MacOS 系统

如果在 MacOS 上开发 Pong, 可以通过引入 os 模块通过 sytem 方法调用 afplay 命令播放音效文件。


在顶部引入 os 模块

#  引入turtle模块import turtle# 引入 os 模块import os

..................
复制代码


在碰撞检测的地方添加音效:

# 游戏主循环while True:    # print("x: ",ball.xcor()," y: ",ball.ycor() )    # 执行 TurtleScreen 刷新。在每帧绘制结束后调用update方法进行屏幕刷新,让绘制的图形一次性显示在窗口里。    wn.update()    # 移动乒乓球    ball.setx(ball.xcor() + ball.dx)    ball.sety(ball.ycor() + ball.dy)
# 上边界检测 if ball.ycor() > 290:# 当乒乓球的 y 坐标大于 290 像素时候 # 设置乒乓球的 y 坐标设置为290 ball.sety(290) # 把乒乓球 y 坐标的增量变成 -2 ball.dy *= -1 os.system("afplay bounce.wav&")

# 下边界检测 if ball.ycor() < -290:# 当乒乓球的 y 坐标小于 290 像素时候 # 设置乒乓球的 y 坐标设置为290 ball.sety(-290) # 把乒乓球 y 坐标的增量变成 -2 ball.dy *= -1 os.system("afplay bounce.wav&")
# 左边界检测 if ball.xcor() > 390: #当乒乓球的 y 坐标大于 390 像素时候 # 乒乓球恢复到原点坐标 ball.goto(0,0) # 改变开球方向 ball.dx *= -1 # score_a 得 1 分 score_a += 1 # 清除画笔的绘图 pen.clear() # 重新生成新的绘图 pen.write("玩家 A: {} 玩家 B: {}".format(score_a,score_b), align="center", font=("Courier",24,"normal"))
# 右边界检测 if ball.xcor() < -390: #当乒乓球的 y 坐标小于 -390 像素时候 # 乒乓球恢复到原点坐标 ball.goto(0,0) # 改变开球方向 ball.dx *= -1 # 玩家 B 得 1 分 score_b += 1 # 清除画笔的绘图 pen.clear() # 重新生成新的绘图 pen.write("玩家 A: {} 玩家 B: {}".format(score_a,score_b), align="center", font=("Courier",24,"normal"))

# 乒乓球与球拍 B 的碰撞检测 if (ball.xcor() > 340 and ball.xcor() < 350) and (ball.ycor() < paddle_b.ycor() + 50 and ball.ycor() > paddle_b.ycor() - 50 ): ball.setx(340) ball.dx *= -1 os.system("afplay bounce.wav&")
# 乒乓球与球拍 A 的碰撞检测 if (ball.xcor() < -340 and ball.xcor() > -350) and (ball.ycor() < paddle_a.ycor() + 50 and ball.ycor() > paddle_a.ycor() - 50 ): ball.setx(-340) ball.dx *= -1 os.system("afplay bounce.wav&")
复制代码

Windows 系统

如果在 Windows 系统下开发 Pong ,可以使用 winsound 模块播放 音效文件。

在源码文件顶部引入 winsound 模块:

#  引入turtle模块import turtle# Windows 系统发声模块#import winsound
..................
复制代码


在碰撞检测的地方添加音效:

..................# 游戏主循环while True:    # print("x: ",ball.xcor()," y: ",ball.ycor() )    # 执行 TurtleScreen 刷新。在每帧绘制结束后调用update方法进行屏幕刷新,让绘制的图形一次性显示在窗口里。    wn.update()    # 移动乒乓球    ball.setx(ball.xcor() + ball.dx)    ball.sety(ball.ycor() + ball.dy)
# 上边界检测 if ball.ycor() > 290:# 当乒乓球的 y 坐标大于 290 像素时候 # 设置乒乓球的 y 坐标设置为290 ball.sety(290) # 把乒乓球 y 坐标的增量变成 -2 ball.dy *= -1 # Windows 系统下播放 bounce.wav 音频文件 #winsound.PlaySound("bounce.wav", winsound.SND_ASYNC)

# 下边界检测 if ball.ycor() < -290:# 当乒乓球的 y 坐标小于 290 像素时候 # 设置乒乓球的 y 坐标设置为290 ball.sety(-290) # 把乒乓球 y 坐标的增量变成 -2 ball.dy *= -1 # Windows 系统下播放 bounce.wav 音频文件 #winsound.PlaySound("bounce.wav", winsound.SND_ASYNC)
# 左边界检测 if ball.xcor() > 390: #当乒乓球的 y 坐标大于 390 像素时候 # 乒乓球恢复到原点坐标 ball.goto(0,0) # 改变开球方向 ball.dx *= -1 # score_a 得 1 分 score_a += 1 # 清除画笔的绘图 pen.clear() # 重新生成新的绘图 pen.write("玩家 A: {} 玩家 B: {}".format(score_a,score_b), align="center", font=("Courier",24,"normal"))
# 右边界检测 if ball.xcor() < -390: #当乒乓球的 y 坐标小于 -390 像素时候 # 乒乓球恢复到原点坐标 ball.goto(0,0) # 改变开球方向 ball.dx *= -1 # 玩家 B 得 1 分 score_b += 1 # 清除画笔的绘图 pen.clear() # 重新生成新的绘图 pen.write("玩家 A: {} 玩家 B: {}".format(score_a,score_b), align="center", font=("Courier",24,"normal"))

# 乒乓球与球拍 B 的碰撞检测 if (ball.xcor() > 340 and ball.xcor() < 350) and (ball.ycor() < paddle_b.ycor() + 50 and ball.ycor() > paddle_b.ycor() - 50 ): ball.setx(340) ball.dx *= -1 # Windows 系统下播放 bounce.wav 音频文件 #winsound.PlaySound("bounce.wav", winsound.SND_ASYNC)
# 乒乓球与球拍 A 的碰撞检测 if (ball.xcor() < -340 and ball.xcor() > -350) and (ball.ycor() < paddle_a.ycor() + 50 and ball.ycor() > paddle_a.ycor() - 50 ): ball.setx(-340) ball.dx *= -1 # Windows 系统下播放 bounce.wav 音频文件 #winsound.PlaySound("bounce.wav", winsound.SND_ASYNC)
复制代码

源代码

源代码地址 : https://github.com/matrixtechxyz/Pong


参考资源




用 Python 实现一个简易版的 Pong 游戏 (一)

https://xie.infoq.cn/article/273f9ff6dc0cc667bf80d5d93


发布于: 2020 年 09 月 07 日阅读数: 696
用户头像

Matrix Chan

关注

Write the Code. Change the World. 2018.06.12 加入

Hi,我是 Matrix,一名程序員、創客,目前主要研究方向是機器人與 人工智能技術。 個人網站: matrixtech.xyz

评论

发布
暂无评论
用 Python 实现一个简易版的 Pong 游戏 (二)