- import random
- import time
- import turtle
- lasers = []
- aliens = []
- CANNON_STEP = 10
- LASER_LENGTH = 20
- LASER_SPEED = 10
- ALIEN_SPAWN_INTERVAL = 1.2 # Seconds
- ALIEN_SPEED = 2
- # Draw cannon
- def draw_cannon():
- cannon.clear()
- cannon.turtlesize(1, 4) # Base
- cannon.stamp()
- cannon.sety(FLOOR_LEVEL + 10)
- cannon.turtlesize(1, 1.5) # Next tier
- cannon.stamp()
- cannon.sety(FLOOR_LEVEL + 20)
- cannon.turtlesize(0.8, 0.3) # Tip of cannon
- cannon.stamp()
- cannon.sety(FLOOR_LEVEL)
- window.update()
- def move_left():
- new_x = cannon.xcor() - CANNON_STEP
- if new_x >= LEFT + GUTTER:
- cannon.setx(new_x)
- draw_cannon()
- def move_right():
- new_x = cannon.xcor() + CANNON_STEP
- if new_x <= RIGHT - GUTTER:
- cannon.setx(new_x)
- draw_cannon()
- def create_laser():
- laser = turtle.Turtle()
- laser.penup()
- laser.color(1, 0, 0)
- laser.hideturtle()
- laser.setposition(cannon.xcor(), cannon.ycor())
- laser.setheading(90)
- # Move laser to just above cannon tip
- laser.forward(20)
- # Prepare to draw the laser
- laser.pendown()
- laser.pensize(5)
- lasers.append(laser)
- def move_laser(laser):
- laser.clear()
- laser.forward(LASER_SPEED)
- # Draw the laser
- laser.forward(LASER_LENGTH)
- laser.forward(-LASER_LENGTH)
- def create_alien():
- alien = turtle.Turtle()
- alien.penup()
- alien.turtlesize(1.5)
- alien.setposition(
- random.randint(
- int(LEFT + GUTTER),
- int(RIGHT - GUTTER),
- ),
- TOP,
- )
- alien.shape("turtle")
- alien.setheading(-90)
- alien.color(random.random(), random.random(), random.random())
- aliens.append(alien)
- # Remove alien
- def remove_alien(alien):
- alien.clear()
- alien.hideturtle()
- aliens.remove(alien)
- turtle.turtles().remove(alien)
- # Remove laser
- def remove_laser(laser):
- laser.clear()
- laser.hideturtle()
- lasers.remove(laser)
- turtle.turtles().remove(laser)
- # Remove sprite
- def remove_sprite(sprite, sprite_list):
- sprite.clear()
- sprite.hideturtle()
- window.update()
- sprite_list.remove(sprite)
- turtle.turtles().remove(sprite)
- window = turtle.Screen()
- window.tracer(0)
- window.setup(0.5, 0.75)
- window.bgcolor(0.2, 0.2, 0.2)
- window.title("The Real Python Space Invaders")
- LEFT = -window.window_width() / 2
- RIGHT = window.window_width() / 2
- TOP = window.window_height() / 2
- BOTTOM = -window.window_height() / 2
- FLOOR_LEVEL = 0.9 * BOTTOM
- GUTTER = 0.025 * window.window_width()
- # Create laser cannon
- cann
- cannon.penup()
- cannon.color(1, 1, 1)
- cannon.shape("square")
- cannon.setposition(0, FLOOR_LEVEL)
- # Create turtle for writing text
- text = turtle.Turtle()
- text.penup()
- text.hideturtle()
- text.setposition(LEFT * 0.8, TOP * 0.8)
- text.color(1, 1, 1)
- draw_cannon()
- window.onkeypress(move_left, "Left")
- window.onkeypress(move_right, "Right")
- window.onkeypress(create_laser, "space")
- window.onkeypress(turtle.bye, "q")
- window.listen()
- # Game loop
- alien_timer = 0
- score = 0
- game_timer = time.time()
- game_running = True
- while game_running:
- time_elapsed = time.time() - game_timer
- text.clear()
- text.write(
- f"Time: {time_elapsed:5.1f}snScore: {score:5}",
- f 20, "bold"),
- )
- # Move all lasers
- for laser in lasers.copy():
- move_laser(laser)
- # Remove laser if it goes off screen
- if laser.ycor() > TOP:
- remove_sprite(laser, lasers)
- break
- # Check for collision with aliens
- for alien in aliens.copy():
- if laser.distance(alien) < 20:
- remove_sprite(laser, lasers)
- remove_sprite(alien, aliens)
- score += 1
- break
- # Spawn new aliens when time interval elapsed
- if time.time() - alien_timer > ALIEN_SPAWN_INTERVAL:
- create_alien()
- alien_timer = time.time()
- # Move all aliens
- for alien in aliens:
- alien.forward(ALIEN_SPEED)
- # Check for game over
- if alien.ycor() < FLOOR_LEVEL:
- game_running = False
- break
- window.update()
- splash_text = turtle.Turtle()
- splash_text.hideturtle()
- splash_text.color(1, 1, 1)
- splash_text.write("GAME OVER", f 40, "bold"), align="center")
- turtle.done()