Keeping Score
Let's keep a score, so we can compare and see who's the better player! Start by adding a score
variable.
score = 0
I'm programming in two ways to gain score...
- Destroy enemy: 10 points
- Pickup chocolate donuts: 100 points
- No points for matcha and strawberry donuts, as you already get powerups for them.
Look for this code in your program...
explosions.append(explosion)
enemies.remove(enemies[hit])
...and add code for increasing the score...
explosions.append(explosion)
enemies.remove(enemies[hit])
score += 10
For the chocolate donuts, look for this code...
if powerups[hit].image == 'powerup2':
powerup1 += 1
elif powerups[hit].image == 'powerup3':
powerup2 = True
...and change it to this...
if powerups[hit].image == 'powerup2':
powerup1 += 1
elif powerups[hit].image == 'powerup3':
powerup2 = True
else:
score += 100
We are changing score
from inside the update()
function, so don't forget to declare it as global.
global bullet_delay, powerup1, powerup2, game_state, score
Displaying the score
We can draw the score the same way we did in space gems, by adding a screen.draw.text()
fuction in draw()
.
screen.draw.text(str(score), (10, 10), color=(255,255,255), fontsize=40)
Remember that score
is an integer, so we'll need to change it to a str by using str()
.
At this Point
You game is now complete! Sort of... No program is ever truly complete, as you can always add more features or improve on it. Take a look at the challenges section to find some ideas on how to improve your game.
Your program should now look like this...
import pgzrun
import random
from pgzhelper import *
WIDTH=800
HEIGHT=600
player = Actor('player')
player.x = 400
player.y = 500
drone = Actor('drone')
game_over = Actor('game_over')
game_over.x = 400
game_over.y = 300
game_state = 1
bullets = []
bullet_delay = 0
background_images = ['background1','background2','background3']
backgrounds = []
background = Actor(random.choice(background_images))
background.x = 400
background.y = 300
backgrounds.append(background)
background = Actor(random.choice(background_images))
background.x = 400
background.y = -300
backgrounds.append(background)
enemies = []
explosions = []
enemy_bullets = []
powerups = []
powerup_images = ['powerup1', 'powerup2', 'powerup3']
powerup1 = 0
powerup2 = False
score = 0
sounds.main_theme.play(-1)
def shoot():
global bullet_delay
sounds.sfx_sounds_interaction25.play()
bullet_delay = 5
if powerup1 == 0:
bullet = Actor('player_bullet')
bullet.x = player.x
bullet.y = player.y
bullet.angle = 90
bullets.append(bullet)
elif powerup1 == 1:
bullet = Actor('player_bullet')
bullet.x = player.x - 15
bullet.y = player.y
bullet.angle = 90
bullets.append(bullet)
bullet = Actor('player_bullet')
bullet.x = player.x + 15
bullet.y = player.y
bullet.angle = 90
bullets.append(bullet)
elif powerup1 == 2:
bullet = Actor('player_bullet')
bullet.x = player.x
bullet.y = player.y
bullet.angle = 110
bullets.append(bullet)
bullet = Actor('player_bullet')
bullet.x = player.x
bullet.y = player.y
bullet.angle = 90
bullets.append(bullet)
bullet = Actor('player_bullet')
bullet.x = player.x
bullet.y = player.y
bullet.angle = 70
bullets.append(bullet)
elif powerup1 == 3:
bullet = Actor('player_bullet')
bullet.x = player.x
bullet.y = player.y
bullet.angle = 110
bullets.append(bullet)
bullet = Actor('player_bullet')
bullet.x = player.x - 15
bullet.y = player.y
bullet.angle = 90
bullets.append(bullet)
bullet = Actor('player_bullet')
bullet.x = player.x + 15
bullet.y = player.y
bullet.angle = 90
bullets.append(bullet)
bullet = Actor('player_bullet')
bullet.x = player.x
bullet.y = player.y
bullet.angle = 70
bullets.append(bullet)
elif powerup1 >= 4:
bullet = Actor('player_bullet')
bullet.x = player.x
bullet.y = player.y
bullet.angle = 115
bullets.append(bullet)
bullet = Actor('player_bullet')
bullet.x = player.x
bullet.y = player.y
bullet.angle = 100
bullets.append(bullet)
bullet = Actor('player_bullet')
bullet.x = player.x
bullet.y = player.y
bullet.angle = 90
bullets.append(bullet)
bullet = Actor('player_bullet')
bullet.x = player.x
bullet.y = player.y
bullet.angle = 80
bullets.append(bullet)
bullet = Actor('player_bullet')
bullet.x = player.x
bullet.y = player.y
bullet.angle = 65
bullets.append(bullet)
if powerup2:
bullet = Actor('player_bullet')
bullet.x = drone.x
bullet.y = drone.y
bullet.angle = 90
bullets.append(bullet)
def update():
global bullet_delay, powerup1, powerup2, game_state, score
if keyboard.up:
player.y -= 5
if keyboard.down:
player.y += 5
if keyboard.right:
player.x += 5
if keyboard.left:
player.x -= 5
if player.x < 25:
player.x = 25
if player.x > 775:
player.x = 775
if player.y < 30:
player.y = 30
if player.y > 570:
player.y = 570
drone.move_towards(player, 3)
if keyboard.space and bullet_delay == 0 and game_state == 1:
shoot()
if bullet_delay > 0:
bullet_delay -= 1
for bullet in bullets:
bullet.move_forward(15)
if bullet.y < 0:
bullets.remove(bullet)
for background in backgrounds:
background.y += 3
if background.y > 900:
background.y -= 1200
background.image = random.choice(background_images)
if random.randint(0, 1000) > 980:
enemy = Actor('enemy1_1')
enemy.images = ['enemy1_1', 'enemy1_2']
enemy.fps = 5
enemy.y = -50
enemy.x = random.randint(100, 700)
enemy.direction = random.randint(-100, -80)
enemies.append(enemy)
if random.randint(0, 1000) > 998:
powerup = Actor('powerup1')
powerup.y = -50
powerup.x = random.randint(100, 700)
powerups.append(powerup)
for powerup in powerups:
powerup.y += 4
for enemy in enemies:
enemy.move_in_direction(4)
enemy.animate()
if random.randint(0, 1000) > 990:
bullet = Actor('enemy_bullet')
bullet.x = enemy.x
bullet.y = enemy.y
bullet.angle = random.randint(0, 359)
enemy_bullets.append(bullet)
if enemy.y > 700:
enemies.remove(enemy)
for bullet in bullets:
hit = bullet.collidelist(enemies)
if hit != -1:
bullets.remove(bullet)
explosion = Actor('explosion1')
explosion.x = enemies[hit].x
explosion.y = enemies[hit].y
explosion.images = ['explosion1', 'explosion2']
explosion.fps = 8
explosion.life = 15
explosions.append(explosion)
enemies.remove(enemies[hit])
score += 10
for bullet in enemy_bullets:
bullet.move_forward(5)
if bullet.x < 0 or bullet.x > 800 or bullet.y < 0 or bullet.y > 600:
enemy_bullets.remove(bullet)
for explosion in explosions:
explosion.animate()
explosion.life -= 1
if explosion.life == 0:
explosions.remove(explosion)
for powerup in powerups:
hit = powerup.collidelist(bullets)
if hit != -1:
powerup.y -= 40
powerup.image = random.choice(powerup_images)
bullets.remove(bullets[hit])
hit = player.collidelist(powerups)
if hit != -1 and game_state == 1:
sounds.sfx_sounds_fanfare3.play()
if powerups[hit].image == 'powerup2':
powerup1 += 1
elif powerups[hit].image == 'powerup3':
powerup2 = True
else:
score += 100
powerups.remove(powerups[hit])
if game_state == 1:
if player.collidelist(enemy_bullets) != -1 or player.collidelist(enemies) != -1:
game_state = 2
explosion = Actor('explosion1')
explosion.x = player.x
explosion.y = player.y
explosion.images = ['explosion1', 'explosion2']
explosion.fps = 8
explosion.life = 100
explosions.append(explosion)
sounds.main_theme.stop()
sounds.sfx_exp_medium12.play()
sounds.subdued_theme.play(-1)
def draw():
screen.clear()
for background in backgrounds:
background.draw()
for explosion in explosions:
explosion.draw()
for bullet in enemy_bullets:
bullet.draw()
for enemy in enemies:
enemy.draw()
for powerup in powerups:
powerup.draw()
if powerup2:
drone.draw()
if game_state == 1:
player.draw()
for bullet in bullets:
bullet.draw()
screen.draw.text(str(score), (10, 10), color=(255,255,255), fontsize=40)
if game_state == 2:
game_over.draw()
pgzrun.go() # Must be last line