You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于Python Turtle的Pong游戏:碰撞检测实现求助(结束游戏+墙体碰撞)

解决方案

针对你的两个需求,以下是修改后的完整代码及关键改动说明:

修改后的代码

# Game creation
# Pong game test

import time
import turtle

wn = turtle.Screen()
wn.title("Pong")
wn.bgcolor("Black")
wn.setup(width=800, height=800)
wn.tracer(0)

# paddle a
paddle_a = turtle.Turtle()
paddle_a.speed(0)
paddle_a.shape("square")
paddle_a.color("white")
paddle_a.penup()
paddle_a.goto(0, -300)

# 存储所有红色方块的列表
red_blocks = []

# 创建红色方块并加入列表
def create_red_block(x, y):
    block = turtle.Turtle()
    block.speed(0)
    block.shape("square")
    block.color("red")
    block.penup()
    block.goto(x, y)
    red_blocks.append(block)

# 创建所有红色方块
create_red_block(0, 0)
create_red_block(0, 100)
create_red_block(0, 300)
create_red_block(0, -200)
create_red_block(0, -100)
create_red_block(0, 200)
create_red_block(0, 100)  # 重复位置的方块
create_red_block(0, 1)

# 检查是否与红色方块碰撞
def is_colliding(turtle_obj):
    for block in red_blocks:
        if turtle_obj.distance(block) < 20:
            return True
    return False

# Functions
def paddle_a_up():
    # 记录当前位置
    prev_y = paddle_a.ycor()
    y = prev_y + 30
    paddle_a.sety(y)
    # 碰撞则回退
    if is_colliding(paddle_a):
        paddle_a.sety(prev_y)

def paddle_a_down():
    prev_y = paddle_a.ycor()
    y = prev_y - 30
    paddle_a.sety(y)
    if is_colliding(paddle_a):
        paddle_a.sety(prev_y)

def paddle_a_fun():
    prev_x = paddle_a.xcor()
    x = prev_x + 20
    paddle_a.setx(x)
    if is_colliding(paddle_a):
        paddle_a.setx(prev_x)

def paddle_a_dow():
    prev_x = paddle_a.xcor()
    x = prev_x - 20
    paddle_a.setx(x)
    if is_colliding(paddle_a):
        paddle_a.setx(prev_x)

# Keyboard binding
wn.listen()
wn.onkeypress(paddle_a_up, "w")
wn.onkeypress(paddle_a_down, "s")
wn.onkeypress(paddle_a_fun, "d")
wn.onkeypress(paddle_a_dow, "a")

# 主循环
while True:
    wn.update()

    # Border checking
    if paddle_a.ycor() > 380:
        turtle.bye()

    # 检测是否碰到任意红色方块,碰到则结束游戏
    if is_colliding(paddle_a):
        turtle.bye()

关键改动说明

  • 批量管理红色方块:
    把所有红色方块存入red_blocks列表,避免单个变量的冗余,方便统一做碰撞检测。新增create_red_block函数简化方块创建流程。

  • 碰撞检测函数:
    新增is_colliding函数,遍历所有红色方块,通过turtle.distance()判断是否发生碰撞(方块默认尺寸20x20,距离小于20即为碰撞)。

  • 墙体效果实现:
    修改每个移动函数:先记录paddle移动前的位置,执行移动后检测是否碰撞,若碰撞则将paddle移回原位置,实现无法穿过方块的墙体效果。

  • 碰到方块结束游戏:
    在主循环中调用is_colliding函数,一旦检测到碰撞,立即调用turtle.bye()关闭游戏窗口。

内容的提问来源于stack exchange,提问作者NewPycoder

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 17:35:33