【问题标题】:Why does my turtle bullet leave 2 lines when it moves?为什么我的乌龟子弹移动时会留下两条线?
【发布时间】:2020-03-20 20:19:39
【问题描述】:

程序运行良好,直到 w 键被释放。 w 键对应的函数是 shoot_key() ,它将子弹乌龟的位置设置为用户乌龟 ​​(player1) 的位置,并设置笔并为子弹运行 showturtle() 函数使其可见。然后,它使用 on_timer 每 50 毫秒运行一次嵌套在 shoot_key() 中的 shoot 函数,从而在将 checkbullet() 函数作为 3 个函数单独运行的同时将子弹向前设置 5 个像素,每个函数都将子弹作为一个参数,其中一个作为参数其他乌龟作为其他。当 checkbullet 函数运行时,如果有任何海龟足够靠近以与子弹发生碰撞,它们就会消失。当子弹和另一只海龟与墙壁发生碰撞时,bullet_end() 函数启动,该函数在运行时隐藏子弹并为用户提供 onkey 输入,因此用户可以继续在屏幕上移动玩家,即使按下释放 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()

【问题讨论】:

    标签: python-3.x turtle-graphics


    【解决方案1】:

    你快到了!你有bullet.penup的三种用法,应该是bullet.penup()。只有() 才会实际调用该函数。

    【讨论】:

      猜你喜欢
      • 2020-03-03
      • 1970-01-01
      • 1970-01-01
      • 2011-03-16
      • 1970-01-01
      • 2012-03-03
      • 1970-01-01
      • 2022-10-15
      • 1970-01-01
      相关资源
      最近更新 更多