簡體   English   中英

如何防止 escaping 開箱即用的字符?

[英]How to prevent the character from escaping out of the box?

所以,我一直在嘗試使用 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()


您可以自己嘗試一下,您會發現您可以輕松地將角色從迷宮中取出,但我想阻止它。 有人能幫我嗎?

我目前缺乏運行此代碼的能力,但我可以給出以下幾點:

  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

在我看來,您正試圖找到解決難題的簡單方法。 您想繪制迷宮的黑線,並將黃色字符綁定到這些線。 人們經常將其視為繪制迷宮的牆壁並阻止角色移動到它們上面。 你已經扭轉了這一點,因為一切都是一堵牆,你想繪制路徑,讓你的角色保持在路徑上。 我們做得到。

這里的方法是,我們用海龜的同質小方塊構建路徑。 我們保留了這些塊的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()

我的迷宮繪制代碼可能看起來很復雜,但是通過使用塊的相對繪制而不是絕對位置,它實際上簡化了問題,因為我們開始在面向塊的坐標系中思考,而不是像素。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM