Skip to content Skip to sidebar Skip to footer

Python Turtle Space Invaders Bullets Not Hitting Invaders

I'm very new to turtle and python in general, so I apologize if my code seems messy. I'm currently coding a turtle version of space invaders and I can't figure out why my invaders

Solution 1:

I belive your problem is the way you interlace bullet movements with invader movements. In your while True: loop (which shouldn't exist in an event-driven world like turtle) you call bullet_movement() at the top level, then in a for loop and again within a nested for loop. So where you see the bullet and where it is relative to invaders aren't necessarily the same.

I've reworked your code, and for example purposes, simplified it in places. Along with the above issues, I've also modified the code to use turtle tilt which is perfect for this sort of game where the turtles face in one direction but move in another. And I've completely trashed your isCollision() function as turtles already know how to compute their distance from another turtle.

from turtle import Screen, Turtle

class Invader(Turtle):
    def __init__(self, xcor, ycor):
        super().__init__(shape="turtle")
        self.color("red")
        self.penup()
        self.setposition(xcor, ycor)
        self.tilt(-90)
        self.speed('slow')

        self.hit = 0

class Bullet(Turtle):
    def __init__(self):
        super().__init__(shape="arrow", visible=False)
        self.shapesize(.5, 1)
        self.color("yellow")
        self.penup()
        self.setheading(90)
        self.speed('fastest')

        self.bulletspeed = 20

def move_right():
    if player.xcor() + playerspeed < 210:

        player.forward(playerspeed)

def move_left():
    if player.xcor() - playerspeed > -210:

        player.backward(playerspeed)

def bullet_movement():
    firedb.forward(10)

    if firedb.ycor() > 195:
        firedb.hideturtle()

def fire_bullet():
    if not firedb.isvisible():
        x, y = player.position()
        firedb.setposition(x, y + 20)
        firedb.showturtle()

def isCollision(t1, t2):
    return t1.distance(t2) < 20

def move():
    global enemyspeed

    if firedb.isvisible():
        bullet_movement()

    for invader in enemies:
        if firedb.isvisible() and isCollision(firedb, invader):
                invader.hit += 1

                if invader.hit == 1:
                    invader.color("orange")
                elif invader.hit == 2:
                    invader.color("yellow")
                elif invader.hit == 3:
                    invader.hideturtle()
                    enemies.remove(invader)

                firedb.hideturtle()  # only one hit per bullet!

        invader.forward(enemyspeed)

        if invader.xcor() < -200 or invader.xcor() > 200:
            for invader in enemies:
                y = invader.ycor() - 40
                invader.sety(y)
            enemyspeed *= -1

    win.update()
    win.ontimer(move, 50)

#### Player ####

player = Turtle("arrow")
player.color("white")
player.penup()
player.tilt(90)
player.sety(-175)
player.speed('fast')

#### Window ####

win = Screen()
win.bgcolor("black")
win.tracer(False)

border_pen = Turtle(visible=False)
border_pen.speed('fastest')
border_pen.color("white")
border_pen.pensize(3)

border_pen.penup()
border_pen.setposition(-225, -225)
border_pen.pendown()

for _ in range(4):
    border_pen.forward(450)
    border_pen.left(90)

### Bullet ###

firedb = Bullet()

enemies = []

xx = -175
xxxx = -190
for invader_count in range(19):
    if invader_count < 9:
        enemies.append(Invader(xx, 200))
        xx += 30
    else:
        enemies.append(Invader(xxxx, 175))
        xxxx += 30

playerspeed = 7
enemyspeed = 2

win.onkey(move_left, "Left")
win.onkey(move_right, "Right")
win.onkey(fire_bullet, "space")
win.listen()

move()

win.mainloop()

enter image description here

Finally, be careful with Python global and turtle tracer() which are routinely misunderstood.


Post a Comment for "Python Turtle Space Invaders Bullets Not Hitting Invaders"