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

Python Turtle实现触碰迷宫墙壁输出collision功能咨询

Turtle海龟迷宫碰撞检测实现方案

我这里推荐你用位置颜色检测的方案实现,不需要额外存储所有墙壁的坐标数据,实现逻辑更简单:

实现原理

你的迷宫填充后默认是黑色,画布背景为白色,玩家移动轨迹为粉色,只需要每次移动前预判海龟下一个位置的像素颜色,如果为黑色就判定为触碰墙壁,触发打印即可。

完整修改代码

import turtle
from turtle import Screen

# 初始化窗口
wn = Screen()
wn.colormode(255)  # 开启255色值模式,方便颜色判断
canvas = wn.getcanvas()

# 迷宫绘制代码(和原逻辑一致)
maze = turtle.Turtle()
maze.speed(10)
maze.penup()
maze.goto(-12.5, -175)
maze.pendown()
maze.begin_fill()
maze.goto(-12.5, -100)
maze.goto(37.5, -100)
maze.goto(37.5, -75)
maze.goto(-112.5, -75)
maze.goto(-112.5, -37.5)
maze.goto(-125, -37.5)
maze.goto(-125, -87.5)
maze.goto(-87.5, -87.5)
maze.goto(-87.5, -137.5)
maze.goto(-75, -137.5)
maze.goto(-75, -100)
maze.goto(-50, -100)
maze.goto(-50, -162.5)
maze.goto(-150, -162.5)
maze.goto(-150, -137.5)
maze.goto(-112.5, -137.5)
maze.goto(-112.5, -112.5)
maze.goto(-162.5, -112.5)
maze.goto(-162.5, -87.5)
maze.goto(-150, -87.5)
maze.goto(-150, -37.5)
maze.goto(-162.5, -37.5)
maze.goto(-162.5, 12.5)
maze.goto(-137.5, 12.5)
maze.goto(-137.5, -12.5)
maze.goto(-112.5, -12.5)
maze.goto(-112.5, 12.5)
maze.goto(-87.5, 12.5)
maze.goto(-87.5, -50)
maze.goto(-62.5, -50)
maze.goto(-62.5, 25)
maze.goto(-162.5, 25)
maze.goto(-162.5, 137.5)
maze.goto(-112.5, 137.5)
maze.goto(-112.5, 162.5)
maze.goto(-87.5, 162.5)
maze.goto(-87.5, 137.5)
maze.goto(-25, 137.5)
maze.goto(-25, 87.5)
maze.goto(12.5, 87.5)
maze.goto(12.5, 112.5)
maze.goto(37.5, 112.5)
maze.goto(37.5, 87.5)
maze.goto(62.5, 87.5)
maze.goto(62.5, 125)
maze.goto(-12.5, 125)
maze.goto(-12.5, 175)
maze.goto(-175, 175)
maze.goto(-175, -175)
maze.goto(-12.5, -175)
maze.end_fill()
maze.penup()
maze.goto(12.5, -175)
maze.pendown()
maze.begin_fill()
maze.goto(12.5, -125)
maze.goto(87.5, -125)
maze.goto(87.5, -162.5)
maze.goto(150, -162.5)
maze.goto(150, -125)
maze.goto(162.5, -125)
maze.goto(162.5, -100)
maze.goto(125, -100)
maze.goto(125, -137.5)
maze.goto(112.5, -137.5)
maze.goto(112.5, -100)
maze.goto(62.5, -100)
maze.goto(62.5, -75)
maze.goto(150, -75)
maze.goto(150, -12.5)
maze.goto(162.5, -12.5)
maze.goto(162.5, 12.5)
maze.goto(125, 12.5)
maze.goto(125, 37.5)
maze.goto(150, 37.5)
maze.goto(150, 150)
maze.goto(125, 150)
maze.goto(125, 112.5)
maze.goto(100, 112.5)
maze.goto(100, 87.5)
maze.goto(125, 87.5)
maze.goto(125, 62.5)
maze.goto(100, 62.5)
maze.goto(100, 12.5)
maze.goto(37.5, 12.5)
maze.goto(37.5, -50)
maze.goto(-37.5, -50)
maze.goto(-37.5, -25)
maze.goto(25, -25)
maze.goto(25, 25)
maze.goto(0, 25)
maze.goto(0, 0)
maze.goto(-37.5, 0)
maze.goto(-37.5, 50)
maze.goto(-87.5, 50)
maze.goto(-87.5, 75)
maze.goto(-62.5, 75)
maze.goto(-62.5, 100)
maze.goto(-112.5, 100)
maze.goto(-112.5, 50)
maze.goto(-137.5, 50)
maze.goto(-137.5, 112.5)
maze.goto(-50, 112.5)
maze.goto(-50, 62.5)
maze.goto(12.5, 62.5)
maze.goto(12.5, 37.5)
maze.goto(37.5, 37.5)
maze.goto(37.5, 62.5)
maze.goto(87.5, 62.5)
maze.goto(87.5, 150)
maze.goto(12.5, 150)
maze.goto(12.5, 175)
maze.goto(175, 175)
maze.goto(175, -175)
maze.goto(12.5, -175)
maze.end_fill()
maze.penup()
maze.goto(62.5, -50)
maze.pendown()
maze.begin_fill()
maze.goto(125, -50)
maze.goto(125, -12.5)
maze.goto(62.5, -12.5)
maze.goto(62.5, -50)
maze.end_fill()
maze.ht()

# 玩家海龟初始化
myPen = turtle.Turtle()
myPen.penup()
myPen.goto(0,-180)
myPen.pendown()
myPen.color("#DB148E")
myPen.width(4)
myPen.left(90)

# 初始移动
myPen.forward(70)
myPen.right(90)

speed = 0.5
myPen.speed(10)
myPen.ht()

# 碰撞检测函数
def is_collision(x, y):
    # 转换turtle坐标为canvas坐标
    canvas_x = canvas.winfo_rootx() + x + canvas.winfo_width()//2
    canvas_y = canvas.winfo_rooty() + canvas.winfo_height()//2 - y
    # 获取像素颜色
    r = canvas.winfo_rgb(canvas.winfo_at(canvas_x, canvas_y))
    # 黑色墙壁的RGB值为0,0,0
    return r == (0, 0, 0)

def travel():
    # 先计算前进后的坐标
    next_x = myPen.xcor() + speed * turtle.cos(turtle.radians(myPen.heading()))
    next_y = myPen.ycor() + speed * turtle.sin(turtle.radians(myPen.heading()))
    if is_collision(next_x, next_y):
        print("collision")
    else:
        myPen.forward(speed)
    wn.ontimer(travel, 10)

wn.onkey(lambda: myPen.setheading(90), 'w')
wn.onkey(lambda: myPen.setheading(180), 'a')
wn.onkey(lambda: myPen.setheading(0), 'd')
wn.onkey(lambda: myPen.setheading(270), 's')

wn.listen()
travel()

wn.mainloop()

注意事项

  • 如果你的系统颜色映射有偏差,可以打印获取到的r值调整碰撞判定的阈值
  • 如果你修改了迷宫的填充颜色,对应修改is_collision函数里的判定值即可

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 21:24:01