# EG16-07 Ser i krakers

import pygame

import random

class Sprite:
    '''
    Postać w grze. Pozwala na tworzenie klas potomnych,
    reprezentujących postacie o określonych zachowaniach 
    '''
    def __init__(self, image, game):
        '''
        Inicjalizacja postaci.
        image reprzezentuje obraz wymagany do narysowania postaci
        domyślna pozycja na ekranie to początek układu współrzędnych w punkcie (0,0)
        game reprezentuje obiekt gry, w której występuje ta postać
        '''
        self.image = image
        self.position = [0,0]
        self.game = game
        self.reset()

    def update(self):
        '''
        Metoda wywoływana w pętli gry w celu aktualizacji
        statusu postaci.
        W klasie bazowej nie robi nic.
        '''
        pass

    def draw(self):
        '''
        Rysuje obraz postaci na ekranie w jej
        bieżącym położeniu
        '''
        self.game.surface.blit(self.image, self.position)

    def reset(self):
        '''
        Metoda wywoływana na początku gry w celu
        zresetowania postaci
        '''
        pass


class Cheese(Sprite):
    '''
    Obiekt sera sterowany 
    wokół ekranu przez gracza 
    '''

    def reset(self):
        '''
        Zresetuj pozycję sera i zatrzymaj ruch
        Przywrócenie prędkości ruchu do wartości początkowej
        '''
        self.movingUp = False
        self.movingDown = False
        self.movingLeft = False
        self.movingRight = False
        self.position[0] = (self.game.width - self.image.get_width())/2
        self.position[1] = (self.game.height - self.image.get_height())/2
        self.movement_speed=[5,5]
        
    def update(self):
        '''
        Zresetuj pozycję sera i zatrzymaj jego ruch 
        na ekranie.
        '''
        if self.movingUp:
            self.position[1] = self.position[1] - (self.movement_speed[1])
        if self.movingDown:
            self.position[1] = self.position[1] + (self.movement_speed[1])
        if self.movingLeft:
            self.position[0] = self.position[0] - (self.movement_speed[0])
        if self.movingRight:
            self.position[0] = self.position[0] + (self.movement_speed[0])

        if self.position[0] < 0:
            self.position[0]=0
        if self.position[1] < 0:
            self.position[1]=0
        if self.position[0] + self.image.get_width() > self.game.width:
            self.position[0] = self.game.width - self.image.get_width()
        if self.position[1] + self.image.get_height() > self.game.height:
            self.position[1] = self.game.height - self.image.get_height()

        
    def StartMoveUp(self):
        'Rozpoczęcie ruchu sera w górę'
        self.movingUp = True
        
    def StopMoveUp(self):
        'Zatrzymanie ruchu sera w górę'
        self.movingUp = False
        
    def StartMoveDown(self):
        'Rozpoczęcie ruchu sera w dół'
        self.movingDown = True
        
    def StopMoveDown(self):
        'Zatrzymanie ruchu sera w dół'
        self.movingDown = False

    def StartMoveLeft(self):
        'Rozpoczęcie ruchu sera w lewo'
        self.movingLeft = True
        
    def StopMoveLeft(self):
        'Zatrzymanie ruchu sera w lewo'
        self.movingLeft = False

    def StartMoveRight(self):
        'Rozpoczęcie ruchu sera w prawo'
        self.movingRight = True
        
    def StopMoveRight(self):
        'Zatrzymanie ruchu sera w prawo'
        self.movingRight = False

class Cracker(Sprite):
    '''
    Krakers jest celem dla sera.
    Po zresetowaniu przechodzi do nowego losowego miejsca 
    na ekranie
    '''
    def reset(self):
        self.position[0] = random.randint(0,
                self.game.width-self.image.get_width())
        self.position[1] = random.randint(0,
                self.game.height-self.image.get_height())
        

class CrackerChase:
    '''
    Odtwarza niesamowitą grę o pościgach za krakersami
    '''
    
    def play_game(self):
        '''
        Rozpoczęcie gry.
        Zwraca sterowanie, gdy gracz wyjdzie 
        z gry.
        '''
        init_result = pygame.init()
        if init_result[1] != 0:
            print('biblioteka pygame nie została poprawnie zainstalowana')
            return

        self.width = 800
        self.height = 600
        self.size = (self.width, self.height)

        self.surface = pygame.display.set_mode(self.size)
        pygame.display.set_caption('Pościg za krakersami')
        background_image = pygame.image.load('background.png')
        self.background_sprite = Sprite(image=background_image,
                                        game=self)

        cheese_image = pygame.image.load('cheese.png')
        self.cheese_sprite = Cheese(image=cheese_image,
                                        game=self)
        cracker_image = pygame.image.load('cracker.png')
        self.cracker_sprite = Cracker(image=cracker_image,
                                      game=self)

        clock = pygame.time.Clock()        
        
        while True:
            clock.tick(60)
            for e in pygame.event.get():
                if e.type == pygame.KEYDOWN:
                    if e.key == pygame.K_ESCAPE:
                        pygame.quit()
                        return
                    elif e.key == pygame.K_UP:
                        self.cheese_sprite.StartMoveUp()
                    elif e.key == pygame.K_DOWN:
                        self.cheese_sprite.StartMoveDown()
                    elif e.key == pygame.K_LEFT:
                        self.cheese_sprite.StartMoveLeft()
                    elif e.key == pygame.K_RIGHT:
                        self.cheese_sprite.StartMoveRight()
                elif e.type == pygame.KEYUP:
                    if e.key == pygame.K_UP:
                        self.cheese_sprite.StopMoveUp()
                    elif e.key == pygame.K_DOWN:
                        self.cheese_sprite.StopMoveDown()
                    elif e.key == pygame.K_LEFT:
                        self.cheese_sprite.StopMoveLeft()
                    elif e.key == pygame.K_RIGHT:
                        self.cheese_sprite.StopMoveRight()
                     
            self.background_sprite.draw()
            self.background_sprite.update()
            self.cheese_sprite.draw()
            self.cheese_sprite.update()
            self.cracker_sprite.draw()
            self.cracker_sprite.update()
            pygame.display.flip()


game = CrackerChase()
game.play_game()
