2024-01-27 11:59:56 +00:00
|
|
|
import random
|
|
|
|
import pygame
|
|
|
|
|
|
|
|
|
|
|
|
class GameObject:
|
|
|
|
def __init__(self, game, image: str):
|
|
|
|
self.game = game
|
|
|
|
self.image = pygame.image.load(image)
|
|
|
|
image_rect = self.image.get_rect()
|
|
|
|
|
|
|
|
self.x = 0
|
|
|
|
self.y = 0
|
|
|
|
self.w = image_rect.w
|
|
|
|
self.h = image_rect.h
|
|
|
|
|
|
|
|
def update(self):
|
|
|
|
self.game.screen.blit(self.image, pygame.Rect(self.x, self.y, self.w, self.h))
|
|
|
|
|
|
|
|
def check_collision(self, game_obj):
|
|
|
|
return (
|
|
|
|
self.x < game_obj.x + game_obj.w and
|
|
|
|
self.x + self.w > game_obj.x and
|
|
|
|
self.y < game_obj.y + game_obj.h and
|
|
|
|
self.y + self.h > game_obj.y
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
class Player(GameObject):
|
|
|
|
def __init__(self, game):
|
|
|
|
super().__init__(game, "kolesar.png")
|
|
|
|
|
|
|
|
self.x = self.game.screen.get_width() / 2 - self.w / 2
|
|
|
|
self.y = self.game.screen.get_height() - self.h
|
|
|
|
|
|
|
|
self.lives = 3
|
|
|
|
|
|
|
|
def update(self):
|
2024-01-28 16:08:30 +00:00
|
|
|
keys = pygame.key.get_pressed()
|
|
|
|
if keys[pygame.K_LEFT]:
|
2024-01-27 11:59:56 +00:00
|
|
|
self.x -= 1
|
2024-01-28 16:08:30 +00:00
|
|
|
if keys[pygame.K_RIGHT]:
|
2024-01-27 11:59:56 +00:00
|
|
|
self.x += 1
|
|
|
|
|
|
|
|
for obstacle in self.game.obstacles:
|
|
|
|
if not self.check_collision(obstacle):
|
|
|
|
continue
|
|
|
|
|
|
|
|
if obstacle.get_point:
|
|
|
|
self.game.points += 1
|
|
|
|
self.game.play_sound("jump.mp3")
|
|
|
|
else:
|
|
|
|
self.lives -= 1
|
|
|
|
self.game.play_sound("explosion.mp3")
|
|
|
|
obstacle.delete()
|
|
|
|
|
|
|
|
if self.lives <= 0:
|
|
|
|
self.game.loose()
|
|
|
|
|
|
|
|
super().update()
|
|
|
|
|
|
|
|
|
|
|
|
class Obstacle(GameObject):
|
|
|
|
def __init__(self, game):
|
|
|
|
obstacles = {"bottle.png": False, "flowers.png": False, "grass.png": False, "scooter.png": False,
|
|
|
|
"stones.png": False, "walker.png": False, "mol.png": True}
|
|
|
|
|
|
|
|
image = random.choice(list(obstacles))
|
|
|
|
self.get_point = obstacles[image]
|
|
|
|
|
|
|
|
super().__init__(game, image)
|
|
|
|
|
|
|
|
self.x = (self.game.screen.get_width() - self.w) * random.random()
|
|
|
|
self.y = -self.h
|
|
|
|
|
|
|
|
self.game.obstacles.append(self)
|
|
|
|
|
|
|
|
def update(self):
|
|
|
|
if self.y > self.game.screen.get_height():
|
|
|
|
self.delete()
|
|
|
|
return
|
|
|
|
|
|
|
|
self.y += 1 + self.game.get_level() / 10
|
|
|
|
super().update()
|
|
|
|
|
|
|
|
def delete(self):
|
|
|
|
self.game.obstacles.remove(self)
|
|
|
|
del self
|
|
|
|
|
|
|
|
|
|
|
|
class Game:
|
|
|
|
def __init__(self):
|
|
|
|
pygame.init()
|
|
|
|
pygame.font.init()
|
|
|
|
pygame.display.set_caption("Slalom v D-molu")
|
|
|
|
|
|
|
|
self.screen = pygame.display.set_mode((800, 600))
|
|
|
|
self.clock = pygame.time.Clock()
|
|
|
|
self.font = pygame.font.SysFont("Consolas", 20)
|
|
|
|
|
|
|
|
pygame.mixer.music.load("arcade.mp3")
|
|
|
|
pygame.mixer.music.play(-1)
|
|
|
|
pygame.mixer.music.set_volume(0.1)
|
|
|
|
|
|
|
|
self.running = True
|
|
|
|
self.lost = False
|
|
|
|
self.obstacles = []
|
|
|
|
|
|
|
|
self.points = 0
|
|
|
|
self.next_obstacle = 0
|
|
|
|
|
|
|
|
self.player = Player(self)
|
|
|
|
|
|
|
|
while self.running:
|
|
|
|
self.update()
|
|
|
|
|
|
|
|
pygame.quit()
|
|
|
|
|
|
|
|
def get_level(self):
|
|
|
|
return self.points // 5 + 1
|
|
|
|
|
|
|
|
@staticmethod
|
|
|
|
def play_sound(sound: str):
|
|
|
|
channel = pygame.mixer.find_channel()
|
|
|
|
channel.set_volume(0.1)
|
|
|
|
channel.play(pygame.mixer.Sound(sound))
|
|
|
|
|
|
|
|
def loose(self):
|
|
|
|
self.lost = True
|
|
|
|
pygame.mixer.music.stop()
|
|
|
|
big_font = pygame.font.SysFont("Consolas", 40)
|
|
|
|
you_lost = big_font.render("Izgubil si!", True, "white")
|
|
|
|
self.screen.blit(
|
|
|
|
you_lost,
|
|
|
|
(self.screen.get_width() / 2 - you_lost.get_width() / 2,
|
|
|
|
self.screen.get_height() / 2 - you_lost.get_height() / 2))
|
|
|
|
|
|
|
|
def update(self):
|
|
|
|
for event in pygame.event.get():
|
|
|
|
match event.type:
|
|
|
|
case pygame.QUIT:
|
|
|
|
self.running = False
|
|
|
|
break
|
|
|
|
|
|
|
|
if self.lost:
|
|
|
|
return
|
|
|
|
|
|
|
|
self.next_obstacle -= 1
|
|
|
|
if self.next_obstacle <= 0:
|
|
|
|
if self.get_level() >= 13:
|
|
|
|
self.next_obstacle = 30
|
|
|
|
else:
|
|
|
|
self.next_obstacle = random.randrange(30, 160 - 10 * self.get_level())
|
|
|
|
|
|
|
|
Obstacle(self)
|
|
|
|
|
|
|
|
self.screen.fill("black")
|
|
|
|
|
|
|
|
for obstacle in self.obstacles:
|
|
|
|
obstacle.update()
|
|
|
|
|
|
|
|
self.player.update()
|
|
|
|
|
|
|
|
points = self.font.render(f'Točke: {self.points}', True, "white")
|
|
|
|
self.screen.blit(points, (10, 10))
|
|
|
|
|
|
|
|
level = self.font.render(f'Level: {self.get_level()}', True, "white")
|
|
|
|
self.screen.blit(level, (self.screen.get_width() / 2 - level.get_width() / 2, 10))
|
|
|
|
|
|
|
|
lives = self.font.render(f'Lives: {self.player.lives}', True, "white")
|
|
|
|
self.screen.blit(lives, (self.screen.get_width() - lives.get_width() - 10, 10))
|
|
|
|
|
|
|
|
pygame.display.flip()
|
|
|
|
self.clock.tick(480)
|
|
|
|
|
|
|
|
|
|
|
|
Game()
|