the-honk/gcse computer science/year 10/raspberry pie game/Raspberry Pie Game with Changes.py
2021-09-14 21:57:23 +01:00

200 lines
6.1 KiB
Python

import math, random, pygame, sys
# Game class
class Game():
def __init__(self):
self.score = 0
self.raspberryCount = 0
# Turret class
class Turret(pygame.sprite.Sprite):
def __init__(self):
pygame.sprite.Sprite.__init__(self) # extend the pygame Sprite class
self.image = pygame.image.load('turret.png')
self.rect = self.image.get_rect()
self.rect.x = 240
self.rect.y = 630
# Method that enables the turret to move
def move(self, direction):
if direction == 'left' and self.rect.x > 5:
self.rect.x -= 5
if direction == 'right' and self.rect.x < (480 - self.rect.width):
self.rect.x += 5
# Bullet class
class Bullet(pygame.sprite.Sprite):
def __init__(self, turret):
pygame.sprite.Sprite.__init__(self) # extend the pygame Sprite class
self.image = pygame.image.load('bullet.png')
self.rect = self.image.get_rect()
self.rect.x = turret.rect.x + (turret.rect.width / 2) - (self.rect.width / 2)
self.rect.y = turret.rect.y - turret.rect.height
# Method that moves bullets up the screen
def updatePosition(self):
if self.rect.y > 0 - self.rect.height: # ensures that the bullet is on the screen
self.rect.y -= 5
else:
self.kill() # remove the bullet when it goes off of the screen
# Fruit class
class Fruit(pygame.sprite.Sprite):
def __init__(self):
pygame.sprite.Sprite.__init__(self)
# Determine the type of fruit it will be
self.genus = random.randint(1, 3)
if self.genus == 1: imageFile = 'raspberry'
elif self.genus == 2: imageFile = 'strawberry'
elif self.genus == 3: imageFile = 'cherry'
self.image = pygame.image.load('{0}.png'.format(imageFile)) # load the type of fruit
self.image = pygame.transform.rotate(self.image, -15 + random.randint(0, 20)) # rotate the fruit
self.rect = self.image.get_rect()
self.rect.y = 0 - self.rect.height
self.rect.x = random.randint(2, 44) * 10
# Method that moves fruit down the screen
def updatePosition(self, game):
if self.rect.y < 640: # ensures that the fruit is on the screen
self.rect.y += 3
else:
if self.genus == 1: # if the fruit was a raspberry
game.score += 10 # add 10 points
game.raspberryCount += 1 # increase raspberry count
else: # otherwise
game.score -= 50 # remove 50 points
self.kill() # remove the fruit
# Method to update score and remove fruit when shot
def shot(self, game, bullet):
if self.genus == 1:
game.score -= 50
game.raspberryCount += 1
else:
game.score += 10
self.kill()
bullet.kill()
# Bullet timeout function
keyTimeout = {}
def keyPressed(keys, key, timeout):
if keys[key] == False:
return False
currentTime = pygame.time.get_ticks()
if key in keyTimeout and keyTimeout[key] > currentTime:
return False
keyTimeout[key] = currentTime + timeout
return True
# Initialise the game
pygame.init()
pygame.key.set_repeat(1, 20)
scoreFont = pygame.font.Font(None, 17) # set the score font
statusFont = pygame.font.Font(None, 17) # set the status font
black = (0, 0, 0) # rgb for black
screen = pygame.display.set_mode([480, 640]) # set the size of the window
pygame.display.set_caption('Raspberry Pie') # set the title of the window
# Create initial object instances
game = Game()
turret = Turret()
fruits = pygame.sprite.Group()
bullets = pygame.sprite.Group()
sprites = pygame.sprite.Group()
sprites.add(turret)
# Initialize game over flag and timer
endGame = False
clock = pygame.time.Clock()
tock = 0
# Game loop
while endGame == False:
clock.tick(30)
tock += 1
screen.fill(black)
# Process events
for event in pygame.event.get():
# Handle exiting
if event.type == pygame.QUIT:
sys.exit()
# Handle key presses
keys = pygame.key.get_pressed()
# If the key was the left arrow
if keys[pygame.K_LEFT]:
turret.move('left')
# If the key was the right arrow
if keys[pygame.K_RIGHT]:
turret.move('right')
# If the key was the space key
if keyPressed(keys, pygame.K_SPACE, 1000):
bullet = Bullet(turret)
bullets.add(bullet)
# If the key was the escape key
if keys[pygame.K_ESCAPE]:
sys.exit()
# Move objects
for bullet in bullets:
bullet.updatePosition()
for fruit in fruits:
fruit.updatePosition(game)
# Add new fruit if two seconds has elapsed
if tock > 60:
if len(fruits) < 10: # cap the amount of fruits to be less than 10
fruit = Fruit()
fruits.add(fruit)
tock = 0 # reset counter
# Check for collisions
collisions = pygame.sprite.groupcollide(fruits, bullets, False, True)
if collisions:
for fruit in collisions:
fruit.shot(game, collisions[fruit][0])
# Update player score
scoreText = scoreFont.render('Score: {0}'.format(str(game.score)), True, (255, 255, 255), (0, 0, 0))
screen.blit(scoreText, (0, 620)) # put the score onto the screen at 0, 620
statusText = statusFont.render('Raspberries: {0}'.format(str(10 - game.raspberryCount)), True, (255, 210, 210), (0, 0, 0))
screen.blit(statusText, (0, 10))
# Update the screen and check for game over
sprites.draw(screen)
bullets.draw(screen)
fruits.draw(screen)
pygame.display.flip()
if game.raspberryCount >= 10:
endGame = True
# Game over: display the player's final score
scoreBadge = pygame.image.load('scoreframe.png')
scoreBadge.convert_alpha()
screen.blit(scoreBadge, (90, 250))
scoreFont = pygame.font.Font(None, 52)
statusText = scoreFont.render('Your Score: {0}'.format(str(game.score)), True, (0, 0, 0), (231, 230, 33))
screen.blit(statusText, (105, 300))
pygame.display.flip()
# Wait for the player to close the game window
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()