【问题标题】:How to prevent the character from escaping out of the box?如何防止角色逃出盒子?
【发布时间】:2021-11-25 05:08:30
【问题描述】:

所以,我一直在尝试使用 python 制作迷宫,并且进展顺利,只是我无法阻止角色走出迷宫的盒子!这是我的代码:

import turtle

wn = turtle.Screen()
wn.setup(width=1000, height=700)
wn.bgcolor('white')
wn.title('test')
wn.tracer(0)

box_1 = turtle.Turtle()
box_1.shape('square')
box_1.penup()
box_1.color('black')
box_1.goto(-485, 0)
box_1.shapesize(stretch_len=1.5, stretch_wid=35)

box_2 = turtle.Turtle()
box_2.shape('square')
box_2.penup()
box_2.color('black')
box_2.goto(-500, -95)
box_2.shapesize(stretch_len=35, stretch_wid=1.5)

box_3 = turtle.Turtle()
box_3.shape('square')
box_3.penup()
box_3.color('black')
box_3.goto(-325, 0)
box_3.shapesize(stretch_len=1.5, stretch_wid=10)

box_4 = turtle.Turtle()
box_4.shape('square')
box_4.penup()
box_4.color('black')
box_4.goto(-145, -180)
box_4.shapesize(stretch_len=1.5, stretch_wid=10)

box_4 = turtle.Turtle()
box_4.shape('square')
box_4.penup()
box_4.color('black')
box_4.goto(-240, -265)
box_4.shapesize(stretch_len=10, stretch_wid=1.5)

box_4 = turtle.Turtle()
box_4.shape('square')
box_4.penup()
box_4.color('black')
box_4.goto(-345, -220)
box_4.shapesize(stretch_len=1.5, stretch_wid=6)

box_4 = turtle.Turtle()
box_4.shape('square')
box_4.penup()
box_4.color('black')
box_4.goto(-190, 90)
box_4.shapesize(stretch_len=15, stretch_wid=1.5)

character = turtle.Turtle()
character.shape('square')
character.speed(0)
character.penup()
character.color('yellow')
character.goto(-485, 335)
character.shapesize(stretch_wid=1, stretch_len=1)


def character_up():
    y = character.ycor()
    y += 10
    character.sety(y)


def character_down():
    y = character.ycor()
    y -= 10
    character.sety(y)


def character_right():
    x = character.xcor()
    x += 10
    character.setx(x)


def character_left():
    x = character.xcor()
    x -= 10
    character.setx(x)


wn.listen()
wn.onkeypress(character_up, "Up")
wn.onkeypress(character_down, "Down")
wn.onkeypress(character_right, "Right")
wn.onkeypress(character_left, "Left")


while True:
    wn.update()
    x = character.xcor()
    y = character.ycor()


您可以自己尝试一下,您会发现您可以轻松地将角色从迷宫中救出,但我想阻止它。有人可以帮我吗?

【问题讨论】:

    标签: python turtle-graphics maze python-turtle


    【解决方案1】:

    我目前缺乏运行这段代码的能力,但我可以给出以下几点:

    1. 不要重复使用 box_4 变量。设置box_5box_6box_7

    2. 在您的 character_[up/down/right/left] 函数中,检查 X 值是否高于或低于某个值,如果是,则不接受移动。例如:

    def character_up():
        y = character.ycor()
        if (y < 100) { // Only do this if the Y variable is within bounds
            y += 10
        }
        character.sety(y)
    
    
    def character_down():
        y = character.ycor()
        if (y > -100) {
            y -= 10
        }
        character.sety(y)
    
    
    def character_right():
        x = character.xcor()
        if (x < 100) {
            x += 10
        }
        character.setx(x)
    
    
    def character_left():
        x = character.xcor()
        if (x > -100) {
            x -= 10
        }
        character.setx(x)
    

    您可能需要调整边界(-100 --> -200100 --> 200

    【讨论】:

    • 哦,谢谢,我想这会解决它!
    • 我认为这里的 OP 术语存在混淆。我认为问题不在于将角色保持在外围框内,而是迫使角色停留在迷宫的线内,这无法通过移动例程中的简单边界测试来完成。我会提供我自己的解决方案,但我可能错了。
    • @cdlane 是的,我认为澄清一下会很好。我希望我们的答案之一解决了这个问题。
    【解决方案2】:

    在我看来,您正在尝试找到解决难题的简单方法。您想绘制迷宫的黑线,并将黄色字符绑定到这些线。人们经常将其视为绘制迷宫的墙壁并阻止角色移动到它们上面。你已经扭转了这一点,因为一切都是一堵墙,你想绘制路径,让你的角色保持在路径上。我们可以做到。

    这里的方法是,我们用海龟的同质小方块构建路径。我们保留了这些块的list,并且每当角色移动时,我们都会通过确保它们始终在某个块的短距离内来验证移动:

    from turtle import Screen, Turtle
    
    BLOCK_SIZE = 30
    CURSOR_SIZE = 20
    CHARACTER_SIZE = CURSOR_SIZE
    
    def character_up():
        character.sety(character.ycor() + CHARACTER_SIZE/2)
    
        if not any(box.distance(character) < BLOCK_SIZE/2 for box in boxes):
            character.undo()
    
    def character_down():
        character.sety(character.ycor() - CHARACTER_SIZE/2)
    
        if not any(box.distance(character) < BLOCK_SIZE/2 for box in boxes):
            character.undo()
    
    def character_right():
        character.setx(character.xcor() + CHARACTER_SIZE/2)
    
        if not any(box.distance(character) < BLOCK_SIZE/2 for box in boxes):
            character.undo()
    
    def character_left():
        character.setx(character.xcor() - CHARACTER_SIZE/2)
    
        if not any(box.distance(character) < BLOCK_SIZE/2 for box in boxes):
            character.undo()
    
    screen = Screen()
    screen.setup(width=1000, height=700)
    screen.tracer(False)
    
    box = Turtle()
    box.shape('square')
    box.penup()
    box.color('black')
    box.shapesize(BLOCK_SIZE / CURSOR_SIZE)
    
    boxes = []
    
    box.goto(-485, 335)
    box.setheading(270)
    for _ in range(23):
        boxes.append(box.clone())
        box.forward(BLOCK_SIZE)
    
    box.backward(9 * BLOCK_SIZE)
    box.setheading(0)
    for _ in range(13):
        boxes.append(box.clone())
        box.forward(BLOCK_SIZE)
    
    box.backward(8 * BLOCK_SIZE)
    box.setheading(90)
    for _ in range(7):
        boxes.append(box.clone())
        box.forward(BLOCK_SIZE)
    
    box.setheading(0)
    for _ in range(10):
        boxes.append(box.clone())
        box.forward(BLOCK_SIZE)
    
    box.backward(3 * BLOCK_SIZE)
    box.setheading(270)
    box.forward(7 * BLOCK_SIZE)
    for _ in range(6):
        boxes.append(box.clone())
        box.forward(BLOCK_SIZE)
    
    box.setheading(180)
    for _ in range(6):
        boxes.append(box.clone())
        box.forward(BLOCK_SIZE)
    
    box.setheading(90)
    for _ in range(4):
        boxes.append(box.clone())
        box.forward(BLOCK_SIZE)
    
    box.hideturtle()
    screen.tracer(True)
    
    character = Turtle()
    character.shape('square')
    character.speed('fastest')
    character.color('yellow')
    character.penup()
    character.goto(-485, 335)
    character.shapesize(CHARACTER_SIZE / CURSOR_SIZE)
    
    screen.onkeypress(character_up, 'Up')
    screen.onkeypress(character_down, 'Down')
    screen.onkeypress(character_right, 'Right')
    screen.onkeypress(character_left, 'Left')
    
    screen.listen()
    screen.mainloop()
    

    我的迷宫绘制代码可能看起来很复杂,但是通过使用块的相对绘制而不是绝对位置,它实际上简化了问题,因为我们开始在面向块的坐标系而不是像素中思考。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-16
      • 1970-01-01
      • 1970-01-01
      • 2019-05-12
      相关资源
      最近更新 更多