Обнаружить столкновение двух черепах, используя операторы if - PullRequest
0 голосов
/ 25 апреля 2019

Я пытаюсь создать игру, в которой черепаха находится в коробке.Мяч отскакивает от коробки, и если он сталкивается с черепахой или если черепаха касается периметра коробки, игра окончена.Красная точка появляется в случайном месте в коробке, и когда черепаха бежит по этой точке, точка должна исчезнуть и возродиться где-то еще.Однако это работает только иногда.Иногда точка будет случайным образом исчезать и появляться где-то еще, даже если черепаха даже близко не находится к ней.Как я могу это исправить?

from turtle import Screen, Turtle, mainloop

wn = Screen()
wn.bgcolor("light blue")



#CONTROLLABLE TURTLE
t = Turtle()
t.color('black')
t.pensize(10)
t.shape("turtle")
t.speed("fastest")
t.penup()
t.goto(-130,-200)
t.pendown()

global hit
global score
hit = False
score = 0

#MAKE SQUARE
for i in range(4):
    t.forward(400)
    t.left(90)


t.penup()
t.goto(50,0)
speed = 2
t.color("black")

#BALL
ball1 = turtle.Turtle()
ball1.color("blue")
ball1.speed(0)
ball1.penup()
ball1.shape("circle")




A = random.randint(30,60)
B = random.randint(120,150)
C = random.randint(210,240)
D = random.randint(300,330)
Directions = [A, B, C, D]
direct = random.choice(Directions)
def tDirection(direct):
  ball1.right(direct)
tDirection(direct)
angle = 90

#DOT TURTLE
dot = turtle.Turtle()
dot.color("black")
dot.speed(0)
dot.hideturtle()

def createDot():
    dotx = random.randint(-10,230)
    doty = random.randint(-160,200)
    dot.penup()
    dot.goto(dotx,doty)
    dot.pendown()
    dot.pensize(3)
    dot.fillcolor("Red")
    dot.begin_fill()
    dot.circle(7)
    dot.end_fill()

createDot()


#make score function

while True:
  if hit == False:

    #moving ball
    ty = ball1.ycor()
    tx = ball1.xcor()
    if ty < -183:
      angleCurr = ball1.heading()
      if(270>angleCurr>180):
        ball1.right(angle)
      else:
        ball1.left(angle)

      ball1.forward(2)
    elif ty > 185:
      angleCurr = ball1.heading()
      if(0<angleCurr<90):
        ball1.right(angle)
      else:
        ball1.left(angle)

      ball1.forward(2)
    elif tx < -115:
      angleCurr = ball1.heading()
      if(180<angleCurr<270):
        ball1.left(angle)
      else:
        ball1.right(angle)

      ball1.forward(2)
    elif tx > 251:
      angleCurr = ball1.heading()
      if(0<angleCurr<90):
        ball1.left(angle)
      else:
        ball1.right(angle)

    ball1.forward(9)  

    wn.onkey(lambda: t.setheading(180), 'Left')
    wn.onkey(lambda: t.setheading(0), 'Right')
    wn.onkey(lambda: t.setheading(90), 'Up')
    wn.onkey(lambda: t.setheading(270), 'Down')



    w = turtle.Turtle()
    w.hideturtle()
    w.penup()
    w.speed("fastest")

    def end():
      w.goto(-95,-20)
      w.pendown()
      w.write("GAME OVER", font=("Arial", 40, "normal")) 
      t.hideturtle()
      ball1.hideturtle() 
      dot.hideturtle()
      dot.clear()

    speed = 2

    def turtleMove():
        t.forward(speed)
        wn.ontimer(turtleMove, 10)
    dodx = dot.xcor()
    dody = dot.ycor()
    if abs(t.xcor() - dodx) < 5 and abs(t.ycor() == dody) < 5:
      hit = True
      dot.clear()
    elif abs(t.xcor() - tx) < 5 and abs(t.ycor() - ty) < 5:
      end()

    if t.xcor() > 253 or t.xcor() < -115 or t.ycor() > 185 or t.ycor() < -183:
      end()

    turtleMove()
    wn.mainloop()
    wn.listen()


  if hit == True:
    createDot()
    score+=1
    print(score)
    hit = False

Ответы [ 2 ]

0 голосов
/ 25 апреля 2019

Я бы избегал кода, подобного этому:

dodx = dot.xcor()
dody = dot.ycor()
if abs(t.xcor() - dodx) < 5 and abs(t.ycor() == dody) < 5:
    hit = True
    dot.clear()
elif abs(t.xcor() - tx) < 5 and abs(t.ycor() - ty) < 5:
    end()

И вместо этого использовал бы метод distance() черепахи:

if t.distance(dot) < 5:
    hit = True
    dot.clear()
elif t.distance(ball1) < 5:
    end()

Однако, это работает только иногда.Иногда точка будет случайным образом исчезать и появляться где-то еще, даже если черепаха даже близко к ней не будет.

Вы притворяетесь, что этот код выполняется?Он даже не запускается из-за двух разных проблем import.Исправляя это, средства управления черепахой не работают вообще.И мяч не отскакивает от коробки!

Похоже, это случайная коллекция битов кода, заимствованных из других программ, исправленных вместе с желаемым мышлением.Это просто не работает.

Ниже я разобрал ваш код и снова собрал его так, чтобы он в основном работал.Синий шар действительно прыгает вокруг коробки;вы можете перемещать черепаху с помощью клавиш со стрелками;красная точка исчезает и снова появляется в другом месте, когда черепаха касается ее:

from turtle import Screen, Turtle
from random import randint, choice

CURSOR_SIZE = 20

def tDirection(direct):
    ball.right(direct)

def turtleMove():
    turtle.forward(speed)
    screen.ontimer(turtleMove, 10)

def createDot():
    x, y = randint(CURSOR_SIZE - 200, 200 - CURSOR_SIZE), randint(CURSOR_SIZE - 200, 200 - CURSOR_SIZE)
    dot.goto(x, y)

def end():
    marker.write("GAME OVER", align='center', font=("Arial", 40, "normal"))

    turtle.hideturtle()
    ball.hideturtle()
    dot.hideturtle()

screen = Screen()
screen.bgcolor("light blue")

score = 0
speed = 2

# CONTROLLABLE TURTLE
turtle = Turtle("turtle")
turtle.color('black')
turtle.pensize(10)
turtle.speed("fastest")
turtle.penup()
turtle.goto(-200, -200)
turtle.pendown()

# MAKE SQUARE
for i in range(4):
    turtle.forward(400)
    turtle.left(90)

turtle.penup()
turtle.goto(50, 0)

# BALL
ball = Turtle("circle")
ball.color("blue")
ball.speed('fastest')
ball.penup()

A = randint(30, 60)
B = randint(120, 150)
C = randint(210, 240)
D = randint(300, 330)

directions = [A, B, C, D]
direct = choice(directions)

tDirection(direct)
angle = 90

# DOT TURTLE
dot = Turtle('circle')
dot.color("red")
dot.speed('fastest')
dot.pensize(3)
dot.penup()

createDot()

marker = Turtle(visible=False)
marker.penup()
marker.sety(-20)

screen.onkey(lambda: turtle.setheading(0), 'Right')
screen.onkey(lambda: turtle.setheading(90), 'Up')
screen.onkey(lambda: turtle.setheading(180), 'Left')
screen.onkey(lambda: turtle.setheading(270), 'Down')
screen.listen()

turtleMove()

while True:
    # moving ball
    tx, ty = ball.position()

    if ty < CURSOR_SIZE - 200:
        angleCurr = ball.heading()

        if 270 > angleCurr > 180:
            ball.right(angle)
        else:
            ball.left(angle)

        ball.forward(2)
    elif ty > 200 - CURSOR_SIZE:
        angleCurr = ball.heading()

        if 0 < angleCurr < 90:
            ball.right(angle)
        else:
            ball.left(angle)

        ball.forward(2)
    elif tx < CURSOR_SIZE - 200:
        angleCurr = ball.heading()

        if 180 < angleCurr < 270:
            ball.left(angle)
        else:
            ball.right(angle)

        ball.forward(2)
    elif tx > 200 - CURSOR_SIZE:
        angleCurr = ball.heading()

        if 0 < angleCurr < 90:
            ball.left(angle)
        else:
            ball.right(angle)

        ball.forward(2)

    ball.forward(9)

    if turtle.distance(dot) < CURSOR_SIZE/2:
        score += 1
        dot.hideturtle()
        createDot()
        dot.showturtle()
    elif turtle.distance(ball) < CURSOR_SIZE/2:
        end()

    if not CURSOR_SIZE - 200 < turtle.xcor() < 200 - CURSOR_SIZE or not CURSOR_SIZE - 200 < turtle.ycor() < 200 - CURSOR_SIZE:
        end()

screen.mainloop()

При обращении за помощью к SO, будьте честны в отношении состояния вашего кода.

Приведенный выше код нене завершена, еще есть над чем поработать.Например, while True: цикл должен быть преобразован в функцию и ontimer() событие;оценка должна быть отображена;игра должна быть перезапущена.

0 голосов
/ 25 апреля 2019

Я думаю, это может быть просто опечатка:

if abs(t.xcor() - dodx) < 5 and abs(t.ycor() == dody) < 5:

Ваше обнаружение столкновений выполняет сравнение с координатами y, а не вычитает, как вы делали с координатами x.

Такэто должно это исправить:

if abs(t.xcor() - dodx) < 5 and abs(t.ycor() - dody) < 5:
...