Skip to content

Instantly share code, notes, and snippets.

@wolfflucas
Last active August 29, 2015 14:01
Show Gist options
  • Select an option

  • Save wolfflucas/7d871361fb76a4fa4eb9 to your computer and use it in GitHub Desktop.

Select an option

Save wolfflucas/7d871361fb76a4fa4eb9 to your computer and use it in GitHub Desktop.
# Modules
import pygame
import os
from pygame.locals import *
import random
# ---------- Application class
class Application():
width = 640
height = 640
running = True
total_score = 0
kill_points = 10
difficulty = 1
def __init__(self, background, caption):
self.background = background
self.caption = caption
Application.screen = pygame.display.set_mode((Application.width, Application.height))
pygame.display.set_caption(caption)
self.draw_background()
self.score_cfg = pygame.font.SysFont('Helvetica', 20, True)
def draw_background(self):
Application.screen.blit(self.background, (0, 0))
def create_element(self, image, pos_x, pos_y):
Application.screen.blit(image, (pos_x, pos_y))
def score_up(self):
self.total_score += self.kill_points
def show_score(self):
self.score = self.score_cfg.render('Score: ' + str(self.total_score), True, (255, 230, 0))
Application.screen.blit(self.score, (10, 10))
# ---------- Enemy class
class Spaceship():
speed = 7
def __init__(self, image, pos_x, pos_y):
self.image = image
self.pos_x = pos_x
self.pos_y = pos_y
self.draw()
def draw(self):
screen.create_element(self.image, self.pos_x, self.pos_y)
def move(self, direction):
self.verify_collision()
if direction == 'left':
self.pos_x -= Spaceship.speed
elif direction == 'right':
self.pos_x += Spaceship.speed
self.draw()
def shot(self):
bullet = Bullet(self.pos_x + 15, self.pos_y)
enemy_killed = False
self.fire = True
while self.fire:
bullet.move('spaceship')
screen.draw_background()
self.draw()
# Move left/right
if key_pressed[K_LEFT]:
spaceship.move('left')
if key_pressed[K_RIGHT]:
spaceship.move('right')
for index, enemy in enumerate(enemies):
enemy.auto_move()
if bullet.pos_y <= enemy.pos_y + 64 and ((bullet.pos_x >= enemy.pos_x - 32) and ( bullet.pos_x <= enemy.pos_x + 32)):
enemies.pop(index)
enemy.kill()
bullet.pos_y = 0
enemy_killed = True
self.fire = False
if not enemy_killed and self.fire:
bullet.move('spaceship')
screen.show_score()
pygame.display.flip()
def verify_collision(self):
if self.pos_x >= Application.width - 64:
self.pos_x = Application.width - 64
elif self.pos_x <= 0:
self.pos_x = 0
# ---------- Bullet class
class Bullet():
speed = 7
image_path = os.path.join('/home/lucas/python/space-invaders', 'bullet.png')
image = pygame.image.load(image_path)
def __init__(self, pos_x, pos_y):
self.pos_x = pos_x
self.pos_y = pos_y
self.draw()
def draw(self):
screen.create_element(Bullet.image, self.pos_x, self.pos_y)
def move(self, type):
if type == 'enemy':
self.pos_y += Bullet.speed
elif type == 'spaceship':
self.pos_y -= Bullet.speed
self.draw()
# ---------- Enemy class
class Enemy():
direction = 'right'
speed = 1
def __init__(self, image, pos_x, pos_y):
self.image = image
self.pos_x = pos_x
self.pos_y = pos_y
def create(self):
screen.create_element(self.image, self.pos_x, self.pos_y)
def auto_move(self):
# Look for collisions
self.verify_collision()
# Move
if Enemy.direction == 'right':
self.pos_x += Enemy.speed
elif Enemy.direction == 'left':
self.pos_x -= Enemy.speed
self.create()
def shot(self):
enemy_shot = random.choice(enemies)
bullet = Bullet(enemy_shot.pos_x + 15, enemy_shot.pos_y)
spaceship_killed = False
while bullet.pos_y <= Application.height:
screen.draw_background()
spaceship.draw()
for index, enemy in enumerate(enemies):
enemy.auto_move()
if bullet.pos_y <= spaceship.pos_y + 64 and ((bullet.pos_x >= spaceship.pos_x - 32) and ( bullet.pos_x <= spaceship.pos_x + 32)):
enemy.auto_move()
# spaceship_killed = True
if not spaceship_killed:
bullet.move('enemy')
screen.show_score()
pygame.display.flip()
def kill(self):
screen.score_up()
def verify_collision(self):
if self.pos_x >= Application.width - 64:
self.pos_x = Application.width - 64
Enemy.direction = 'left'
elif self.pos_x <= 0:
self.pos_x = 0
Enemy.direction = 'right'
# Create application
pygame.init()
background_draw = os.path.join('/home/lucas/python/space-invaders', 'background.jpg')
background_image = pygame.image.load(background_draw)
screen = Application(background_image, 'Space Invaders')
# Create spaceship
spaceship_draw = os.path.join('/home/lucas/python/space-invaders', 'spaceship.png')
spaceship_image = pygame.image.load(spaceship_draw)
spaceship = Spaceship(spaceship_image, 325, 570)
# Create enemies
enemies = []
enemy_draw = os.path.join('/home/lucas/python/space-invaders', 'enemy.png')
enemy_image = pygame.image.load(enemy_draw)
for x in range(96, 576, 96):
for y in range(32, 252, 64):
enemy = Enemy(enemy_image, x, y)
enemies.append(enemy)
enemy.create()
# Define enemy shot delay
if Application.difficulty == 1:
enemy_shot_delay = 3 * 60
enemy_shot_delay_temp = 0
# -------- MAIN LOOP
while Application.running:
# Draw background and score
screen.draw_background()
screen.show_score()
# Spaceship
spaceship.draw()
# Enemies automatic move
for enemy in enemies:
enemy.auto_move()
# if enemy_shot_delay_temp == enemy_shot_delay:
# enemy.shot()
# enemy_shot_delay_temp = 0
# Get pressed keys
key_pressed = pygame.key.get_pressed()
pygame.key.set_repeat(300, 0)
# Move left/right
if key_pressed[K_LEFT]:
spaceship.move('left')
if key_pressed[K_RIGHT]:
spaceship.move('right')
# Shot
if key_pressed[K_SPACE]:
spaceship.shot()
# Update screen
pygame.display.flip()
# Exit game
for event in pygame.event.get():
# Close app
if event.type == pygame.QUIT or (event.type == KEYDOWN and event.key == K_ESCAPE):
Application.running = False
enemy_shot_delay_temp += 1
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment