#! /usr/bin/python3 # ================================================================== # Space Invaders (from YouTube) # ================================================================== # Part 1: www.youtube.com/watch?v=crV6T3piwHQ # Set up the screen # Part 2: www.youtube.com/watch?v=FdmjXnyoS0A # Move player left and right # Part 3: www.youtube.com/watch?v=zYeEHIX7sfo # Create the enemy and move up, down, left, right # Part 4: www.youtube.com/watch?v=74msqu5phts # Create playser bullet and fire with the space bar # Part 5: www.youtube.com/watch?v=OnR9acEWMC0 # Register collisions between the bullet and enemies and # the enemies and the player # # ---- THE FOLLOWING NOT CURRENTLY IMPLEMENTED --------------------- # Part 6: www.youtube.com/watch?v=Ve-BvoCVN40 # Add multiple enemies # Part 7: www.youtube.com/watch?v=-Bi0W_EKeYg # Move all enemies down at the same time # Part 8: www.youtube.com/watch?v=ZNVxp8cT_JI # Scoring # Part 9: www.youtube.com/watch?v=--MZ7I9Eepw # Image for invaders # Image for player # Image for background # Part 10: www.youtube.com/watch?v=wOZw9EytJEE # Sound (MacOSX and Linux) # ================================================================== import turtle import math import os # ---- global data # ---- collected here for ease of modification # ---- Note: bullet state # ---- ready - ready to fire # ---- fire - bullet is firing bulletspeed = 20 bulletstate = 'ready' enemyspeed = 2 playerspeed = 15 # ---- setup the screen wn = turtle.Screen() wn.bgcolor('black') wn.title('Space Invaders') # ---- draw a border border_pen = turtle.Turtle() border_pen.speed(0) border_pen.color('white') border_pen.penup() border_pen.setposition(-300,-300) border_pen.pendown() border_pen.pensize(3) for side in range(4): border_pen.fd(600) border_pen.lt(90) border_pen.hideturtle() # ---- create the player turtle player = turtle.Turtle() player.color('blue') player.shape('triangle') player.penup() player.speed(0) player.setposition(0,-250) player.setheading(90) # ---- move player left and right def move_left(): x = player.xcor() x -= playerspeed if x < -280: # boundary checking x = -280 player.setx(x) def move_right(): x = player.xcor() x += playerspeed if x > 280: # boundary checking x = 280 player.setx(x) # ---- fire the bullet def fire_bullet(): # declare bulletstate as global global bulletstate # if ready fire the bullet else do nothing (already firing) if bulletstate == 'ready': bulletstate = 'fire' # move the bullet to just above the player x = player.xcor() y = player.ycor() + 10 bullet.setposition(x,y) bullet.showturtle() # ---- test for a collision? # ---- Note: a collision is when two turtles are within # ---- 20 pixels of each other def isCollision(t1,t2): distance = math.sqrt(math.pow(t1.xcor()-t2.xcor(),2) + math.pow(t1.ycor()-t2.ycor(),2)) if distance > 20: return False else: return True # ---- create the enemy enemy = turtle.Turtle() enemy.color('red') enemy.shape('circle') enemy.penup() enemy.speed(0) enemy.setposition(-200,250) enemy.setheading(270) # ---- create the player's bullet bullet = turtle.Turtle() bullet.color('yellow') bullet.shape('triangle') bullet.penup() bullet.speed(0) bullet.setheading(90) bullet.shapesize(0.5,0.5) bullet.hideturtle() # ---- create keyboard bindings turtle.listen() turtle.onkey(move_left,'Left') turtle.onkey(move_right,'Right') turtle.onkey(fire_bullet,'space') # ------------------------------------------------------------------- # ---- main game loop ----------------------------------------------- # ------------------------------------------------------------------- while True: # move the enemy left, right, and down if enemy.xcor() < -280: enemyspeed *= -1 # reverse enemy movement direction y = enemy.ycor() y -= 40 enemy.sety(y) if enemy.xcor() > 280: enemyspeed *= -1 # reverse enemy movement direction y = enemy.ycor() y -= 40 enemy.sety(y) if bulletstate == 'fire': # move the bullet y = bullet.ycor() y += bulletspeed bullet.sety(y) # check if the bullet has reached the top if bullet.ycor() > 275: bullet.hideturtle() bulletstate = 'ready' # check for a collision between the bullet and the enemy if isCollision(bullet,enemy): # Reset the bullet bullet.hideturtle() bulletstate = 'ready' # hide the bullet so no collisions are possible bullet.setposition(0,-400) # reset the enemy enemy.setposition(-200,250) # check for collision between the enemy and the player if isCollision(enemy,player): print('Game Over - You Loose') break # automatically move the enemy x = enemy.xcor() x += enemyspeed enemy.setx(x) # ---- end of game delay = input('Press enter to exit ')