Bullets Game 3
'''
Bullet shooter game
'''
import sys
import random
import pygame
pygame.init()
# let's try to avoid magic numbers for this
screen_width = 1200
screen_height = 800
FPS = 60
screen = pygame.display.set_mode([screen_width, screen_height])
pygame.display.set_caption("Bullet Shooter")
clock = pygame.time.Clock()
RED = [255, 0, 0]
LIGHT_GREY = [230, 230, 230]
BLACK = [0, 0, 0]
BLUE = [0,0,230]
char_start_x = 0
char_start_y = 0
char_width = 50
char_height = 50
char_speed = 5 # How fast does character move?
character = {"rect":pygame.Rect([char_start_x, char_start_y], [char_width, char_height]),
"dir": "right",
"x_vel": 0,
"y_vel": 0,
"color": BLUE}
bullets = [] # Here's where we'll track all of the bullets on the screen
bullet_speed = 10 # How fast should bullets move?
bullet_width = 7.5
bullet_height = 5
enemy_width = 50
enemy_height = 50
enemies = [{"rect": pygame.Rect([900,100],[enemy_width,enemy_height]), "dir": "left"},
{"rect": pygame.Rect([900,700],[enemy_width,enemy_height]), "dir": "left"}]
# Game loop
while True:
screen.fill(LIGHT_GREY)
# Determine character movement
# Is the player pressing a key?
# - Is player moving vertically?
pressed_keys = pygame.key.get_pressed()
if pressed_keys[pygame.K_UP]:
print("up arrow")
character["y_vel"] = -1*char_speed
elif pressed_keys[pygame.K_DOWN]:
print("down arrow")
character["y_vel"] = char_speed
else:
character["y_vel"] = 0
# - Is player moving horizontally?
if pressed_keys[pygame.K_RIGHT]:
print("down arrow")
character["x_vel"] = char_speed
elif pressed_keys[pygame.K_LEFT]:
print("down arrow")
character["x_vel"] = -1*char_speed
else:
character["x_vel"] = 0
# Draw the character!
character["rect"].left += character["x_vel"]
character["rect"].top += character["y_vel"]
pygame.draw.rect(screen, BLUE, character["rect"])
# - indicate where character is facing
if character["dir"] == "up":
pos = character["rect"].midtop
pygame.draw.rect(screen, BLACK, pygame.Rect([pos[0], pos[1]-5], [5, 5]))
elif character["dir"] == "down":
pos = character["rect"].midbottom
pygame.draw.rect(screen, BLACK, pygame.Rect([pos[0], pos[1]], [5, 5]))
elif character["dir"] == "right":
pos = character["rect"].midright
pygame.draw.rect(screen, BLACK, pygame.Rect([pos[0], pos[1]], [5, 5]))
elif character["dir"] == "left":
pos = character["rect"].midleft
pygame.draw.rect(screen, BLACK, pygame.Rect([pos[0]-5, pos[1]], [5, 5]))
# Draw the enemies!
for enemy in enemies:
pygame.draw.rect(screen, RED, enemy["rect"])
# Draw the bullets!
# Challenge: Every time you click, fire bullets from your mouse
# Challenge: Have bullets that collide with enemies remove that enemy from the screen
# Challenge: clean up off-screen bullets
# Challange: spawn new enemies
on_screen_bullets = []
for bullet in bullets:
# What direction is the bullet going?
if bullet["dir"] == "up":
bullet["rect"].top -= bullet_speed
elif bullet["dir"] == "right":
bullet["rect"].left += bullet_speed
elif bullet["dir"] == "down":
bullet["rect"].top += bullet_speed
elif bullet["dir"] == "left":
bullet["rect"].left -= bullet_speed
# bullet["rect"].left += bullet_speed
pygame.draw.rect(screen, BLACK, bullet["rect"])
alive_enemies = []
for enemy in enemies:
if bullet["rect"].colliderect(enemy["rect"]):
print(random.choice(["AAAAHHHH","GRUNT", "UUUGGG", "SPLAT", "POP"]))
continue
alive_enemies.append(enemy)
enemies = alive_enemies
if bullet["rect"].left <= screen_width:
on_screen_bullets.append(bullet)
bullets = on_screen_bullets
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
if event.type == pygame.KEYDOWN:
# Keydown event!
if event.key == pygame.K_SPACE:
# Fire a bullet
print("pressed space")
pos = [0, 0]
if character["dir"] == "up":
pos = character["rect"].midtop
h = bullet_width
w = bullet_height
elif character["dir"] == "down":
pos = character["rect"].midbottom
h = bullet_width
w = bullet_height
elif character["dir"] == "right":
pos = character["rect"].midright
h = bullet_height
w = bullet_width
elif character["dir"] == "left":
pos = character["rect"].midleft
h = bullet_height
w = bullet_width
bullet = {"rect": pygame.Rect(pos[0], pos[1], w, h), "dir": character["dir"]}
bullets.append(bullet)
if event.key == pygame.K_w:
character["dir"] = "up"
if event.key == pygame.K_d:
character["dir"] = "right"
if event.key == pygame.K_s:
character["dir"] = "down"
if event.key == pygame.K_a:
character["dir"] = "left"
pygame.display.update()
clock.tick(FPS)
# Challenges:
# - Add enemy spawns
# - Add enemy movement
# - Add enemy shooting
|>> download bullets_game_v1.py