>source

아래 코드에서는 new_turtle (6 개)이 화면에서 왼쪽에서 오른쪽으로 수평으로 이동하고 bad_turtle이 아래에서 위로 그리고 다시 수직으로 이동합니다. 내가 찾고있는 것은 bad_turtle이 "달리는"때 또는 new_turtle과 동일한 x, y 좌표를 가질 때 어떤 new_turtle이 "적중"하든 갈색으로 변하기를 원합니다. 아래의 마지막 if 문에 이것을 작성하려고 시도했지만 작동하지 않습니다. 어떻게 할 수 있습니까? 어떤 도움/조언이라도 대단히 감사하겠습니다.

from turtle import Turtle, Screen
import random
is_race_on = False
screen = Screen()
screen.setup(width=500, height=500)
user_bet = screen.textinput(title="Make your bet!", prompt="Which turtle will win the race? Enter a color: ")
print(user_bet)
colors = ["red", "blue", "green", "yellow", "purple", "orange"]
y_positions = [175, 100, 25, -50, -125, -200]
all_turtles = []
bad_turtle = Turtle(shape="turtle")
bad_turtle.up()
bad_turtle.goto(140, -200)
bad_turtle.right(270)
for turtle_index in range(0, 6):
    new_turtle = Turtle(shape="turtle")
    new_turtle.color(colors[turtle_index])
    new_turtle.up()
    new_turtle.goto(-230, y_positions[turtle_index])
    all_turtles.append(new_turtle)
if user_bet:
    is_race_on = True
while is_race_on:
    for turtle in all_turtles:
        if turtle.xcor() > 230:
            is_race_on = False
            winning_color = turtle.pencolor()
            if winning_color == user_bet:
                print(f"You've won! The {winning_color} turtle is the winner!")
            else:
                print(f"You lost! The {winning_color} turtle is the winner!")
        rand_distance = random.randint(0, 10)
        turtle.forward(rand_distance)
        # rand_bad = random.choice(y_positions_bad)
    rand_distance_bad = random.randint(20, 40)
    bad_turtle.forward(rand_distance_bad)
    if bad_turtle.ycor() > 200 or bad_turtle.ycor() < -200:
        bad_turtle.right(180)
        bad_turtle.forward(rand_distance_bad)
    if bad_turtle.xcor() and bad_turtle.ycor() == new_turtle.xcor() and new_turtle.ycor():
        new_turtle.color("brown")
screen.exitonclick()

  • 답변 # 1

    @ ErickY.Carreno의 대답은 올바른 방향으로 나아가는 단계이지만 요점을 놓친 것입니다. 거북이는 부동 소수점 평면을 돌아 다니며 같은 장소로 돌아갈 때 반드시 정확히 같은 장소는 아닙니다 (예 : 13.99999 대 14.00001). 사용 == 실행 가능하지 않습니다. 따라서 대신 거리 비교를 사용하여 충돌을 테스트합니다.

    if bad_turtle.distance(new_turtle) < 20:
        new_turtle.color("brown")
    
    

    어디 20 최소 거리가 가장 적합 할 수 있습니다.

    다음 문제는 코드의 잘못된 위치에 충돌이 있고 참조하는 것입니다. new_turtle 이 시점에서 더 이상 활성 변수가 아닙니다. 위의 모든 사항을 수정하고 프로그램의 다른 측면을 조정합니다.

    from turtle import Turtle, Screen
    from random import randint
    RUNNERS = [('red', 175), ('blue', 100), ('green', 25), ('yellow', -50), ('purple', -125), ('orange', -200)]
    screen = Screen()
    screen.setup(width=500, height=500)
    is_race_on = False
    user_bet = screen.textinput(title="Make your bet!", prompt="Which turtle will win the race? Enter a color: ")
    print(user_bet)
    if user_bet:
        is_race_on = True
    bad_turtle = Turtle(shape='turtle')
    bad_turtle.speed('fastest')
    bad_turtle.up()
    bad_turtle.goto(140, -200)
    bad_turtle.right(270)
    all_turtles = []
    for color, y_position in RUNNERS:
        new_turtle = Turtle(shape='turtle')
        new_turtle.color(color)
        new_turtle.up()
        new_turtle.goto(-230, y_position)
        all_turtles.append(new_turtle)
    while is_race_on:
        for turtle in all_turtles:
            if turtle.xcor() > 230:
                is_race_on = False
                winning_color = turtle.pencolor()
                if winning_color == user_bet:
                    print(f"You've won!", end=' ')
                else:
                    print(f"You lost!", end=' ')
                print(f"The {winning_color} turtle is the winner!")
            elif bad_turtle.distance(turtle) < 20:
                turtle.color('brown')
                all_turtles.remove(turtle)
            else:
                turtle.forward(randint(0, 10))
        if abs(bad_turtle.ycor()) > 200:
            bad_turtle.right(180)
            bad_turtle.forward(abs(bad_turtle.ycor()) - 200)
        bad_turtle.forward(randint(20, 40))
    screen.exitonclick()
    
    

  • 답변 # 2

    진술이 잘못된 경우 다음을 변경해 볼 수 있습니다.

    if bad_turtle.xcor() and bad_turtle.ycor() == new_turtle.xcor() and new_turtle.ycor():
            new_turtle.color("brown")
    
    

    이에:

    if bad_turtle.xcor() == new_turtle.xcor() and bad_turtle.ycor() == new_turtle.ycor():
            new_turtle.color("brown")
    
    

관련 자료

  • 이전 클로저 함수 이름을 인수로 사용
  • 다음 Alternate to a switch case - 스위치 케이스의 대안 - 자바 스크립트