Почему моя пуля черепаха покидает 2 линии, когда она движется? - PullRequest
1 голос
/ 20 марта 2020

Программа работает нормально, пока не отпущена клавиша w. Соответствующей функцией для клавиши w является shoot_key (), которая устанавливает положение черепахи пули с положением черепахи пользователя (player1), а также настраивает перо и запускает функцию showturtle () для пули, делая ее видимой. Затем он запускает функцию shoot, которая вкладывается в shoot_key () каждые 50 миллисекунд, используя on_timer, устанавливая таким образом пулю вперед на 5 пикселей при одновременном запуске функции checkbullet () как 3 функции, каждая из которых имеет пулю в качестве одного аргумента и один из аргументов другие черепахи как другие. При запуске функции контрольной пули, если какие-либо из черепах находятся достаточно близко, чтобы столкнуться с пулей, они исчезают. Когда пуля и другая черепаха сталкиваются со стеной, запускается функция bullet_end (), которая при запуске скрывает пулю и предоставляет пользователю вводные данные, чтобы пользователь мог продолжать перемещать игрока по экрану, даже нажимая, отпуская клавишу w, повторяя, таким образом, обработать и выстрелить в пулю черепахи. Однако, когда я запускаю функцию стрельбы, линия следует за черепахой пули, несмотря на то, что я помещаю пенап, а линия также случайная линия, идущая от черепахи игрока, также в случайном направлении и на произвольной длине, и я не могу понять, почему

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

#screen setup
screen = Screen()
screen.setup(width=450, height=450)
screen.bgcolor('green')
screen.tracer(3)
#user
player = Turtle()
player.shape('square')
player.penup()
#First enemy
player2 = Turtle()
player2.shape('turtle')
player2.penup()
player2.setpos(random.randint(-200,200), random.randint(-200,200))
player2.setheading(random.randint(1,360))
#Second enemy
player3 = Turtle()
player3.shape('square')
player3.penup()
player3.setpos(random.randint(-200,200), random.randint(-200,200))
player3.setheading(random.randint(1,360))
#third enemy
player4 = Turtle()
player4.shape('triangle')
player4.penup()
player4.setpos(random.randint(-200,200), random.randint(-200,200))
player4.setheading(random.randint(1,360))
###4th enemy  
##player5 = Turtle()
##player5.shape('turtle')
##player5.penup()
##player5.setpos(random.randint(-200,200), random.randint(-200,200))
#bullet
bullet = Turtle()
bullet.shape("turtle")
bullet.hideturtle()
bullet.penup
bullet.setpos(random.randint(-200,200),random.randint(-200,200))
bullet.hideturtle()
bullet.penup
px = 0
py = 0

def up():
    global px
    global py
    py = player.ycor() + 5

    if py >= 200:
        py -= 15

    player.sety(py)

def down():
    global px
    global py
    py = player.ycor() - 5

    if py < -200:
        py += 15

    player.sety(py)

def left():
    global px
    global py
    px = player.xcor() - 5

    if px <= -200:
        px += 15

    player.setx(px)

def right():
    global px
    global py
    px = player.xcor() + 5

    if px >= 200:
        px -= 15 

    player.setx(px)




#distance calculator
def checkcollision(t1, t2):
    while t1.distance(t2) < 10:
        t2.setpos(randint(-100, 100), randint(-100, 100))

# the x and y distance that the player2 turtle moves 
dx = 5
dy = 5

def checkbullet(bullet,turtle):
    while bullet.distance(turtle) < 10:
        turtle.hideturtle()



#1st enemy(switch heading)
head = 0
def enemy1():
    checkcollision(player,player2)
    global head
    player2.fd(5)

    x2, y2 = player2.position()
    head = player2.heading()

    if y2 <= -200 or y2 >= 200:
        player2.fd(0)
        player2.backward(7.5)
        player2.setheading((head)* -1)

    if x2 <= -200 or x2 >= 200:
        player2.fd(0)
        player2.backward(7.5)
        if head < 90:
            player2.setheading(0 - ((head) * 2))
        if head>90<179:

            player2.setheading((head)/2)

        if head>179<260:
            player2.setheading((head)/3)


        if head>260<361:
            player2.setheading((head)/2)

    screen.ontimer(enemy1,50)

#Second enemy(dx,dy)
def enemy2():
    checkcollision(player, player3)

    global dx
    global dy
    x3, y3 = player3.position()

    player3.setposition(x3 + dx, y3 + dy)


    if y3 <= -200 or y3 >= 200:
        dy *= -1
        player3.sety(y3 + dy)

    if x3 <= -200 or x3 >= 200:
        dx *= -1
        player3.setx(x3 + dx)


    screen.ontimer(enemy2,50)

def enemy3():
    checkcollision(player,player4)
    player4.fd(5)
    x4, y4 = player4.position()
    head3 = player4.heading()

    if y4 <= -200 or y4 >= 200:
        player4.fd(0)
        player4.backward(7.5)
        player4.fd(0)
        player4.setheading((head3)* -1)

    if x4 <= -200 or x4 >= 200:
        player4.fd(0)
        player4.backward(7.5)
        player4.fd(0)
        if head3 < 90:
            player4.setheading(0 - ((head3) * 2))
        if head3>90<179:
            player4.setheading((head3)/2)

        if head3>179<260:
            player4.setheading((head3)/3)


        if head3>260<361:
            player4.setheading((head3)/2)
    screen.ontimer(enemy3,50)
#When bullet hits wall   
def bullet_end():
    screen.listen()   
    screen.onkeypress(up, 'Up')
    screen.onkeypress(left, 'Left')
    screen.onkeypress(right, 'Right')
    screen.onkeypress(down, 'Down')
    screen.onkeyrelease(shoot_key,"w")


def shoot_key():


    bullet.setposition(px,py)
    bullet.showturtle()
    bullet.penup

    def shoot():
        checkbullet(bullet,player2)
        checkbullet(bullet,player3)
        checkbullet(bullet,player4)
        bx = bullet.xcor()
        by = bullet.ycor()
        bullet.fd(5)
        if bx>=200 or bx<=-200:
            bullet.hideturtle()
            bullet.backward(7.5)
            bullet_end()
        if by>=200 or by<=-200:
            bullet.hideturtle()
            bullet.backward(7.5)
            bullet_end()

        screen.ontimer(shoot,50)
    shoot()
screen.listen() 
screen.onkeypress(up, 'Up')
screen.onkeypress(left, 'Left')
screen.onkeypress(right, 'Right')
screen.onkeypress(down, 'Down')
screen.onkeyrelease(shoot_key,"w")



enemy1()
enemy2()
enemy3()
screen.mainloop()

1 Ответ

0 голосов
/ 21 марта 2020

Вы почти у цели! У вас есть три использования bullet.penup, которые должны быть bullet.penup(). Только с () функция фактически вызывается.

...