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
相关产品推荐
相关产品推荐

