import pygame
import random

pygame.init()

SCREEN_WIDTH = 800
SCREEN_HEIGHT = 600
screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT))
pygame.display.set_caption("Моя Pygame Игра")

WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
RED = (255, 0, 0)
GREEN = (0, 255, 0)
BLUE = (0, 0, 255)
ORANGE = (156, 100, 17)

class Player(pygame.sprite.Sprite):
    def __init__(self, x, y):
        super().__init__()
        self.image = pygame.Surface([50, 50])
        self.image.fill(BLUE)
        self.rect = self.image.get_rect()
        self.rect.x = x
        self.rect.y = y
        self.change_x = 0
        self.change_y = 0
        self.speed = 6
    def update(self):
        self.rect.x += self.change_x
        self.rect.y += self.change_y
    def go_left(self):
        self.change_x = -self.speed
    def go_right(self):
        self.change_x = self.speed
    def go_up(self):
        self.change_y = -self.speed
    def go_down(self):
        self.change_y = self.speed
    def stopx(self):
        self.change_x = 0
    def stopy(self):
        self.change_y = 0

class Coin(pygame.sprite.Sprite):
    def __init__(self, x, y):
        super().__init__()
        self.image = pygame.Surface([20, 20])
        self.image.fill((0, 255, 0))
        self.rect = self.image.get_rect()
        self.rect.x = x
        self.rect.y = y

class enemy(pygame.sprite.Sprite):
    def __init__(self, x, y, target):
        super().__init__()
        self.image = pygame.Surface([50, 50])
        self.image.fill((255, 0, 0))
        self.rect = self.image.get_rect()
        self.rect.x = x
        self.rect.y = y
        self.speed = 3
        self.target = target
        self.lastchange = pygame.time.get_ticks()
        self.state = "normal"
    def update(self):
        dx = self.target.rect.x - self.rect.x
        dy = self.target.rect.y - self.rect.y
        distance = max(1, (dx ** 2 + dy ** 2) ** 0.5)
        self.rect.x += int(self.speed * dx / distance)
        self.rect.y += int(self.speed * dy / distance)
        timenow = pygame.time.get_ticks()
        timefromlastchange = timenow -self.lastchange
        if self.state == "normal" and timefromlastchange >= 4000:
            self.state = "stop"
            self.lastchange = timenow
            self.speed = 0
        elif self.state == "stop" and timefromlastchange >= 2000:
            self.state = "enraged"
            self.lastchange = timenow
            self.speed = 6
        elif self.state == "enraged" and timefromlastchange >= 4000:
            self.state = "normal"
            self.lastchange = timenow
            self.speed = 3


player = Player(SCREEN_WIDTH // 2, SCREEN_HEIGHT // 2)  #starting location

all_sprites = pygame.sprite.Group()
all_sprites.add(player)
enemy1 = enemy(0, 0, player)
all_sprites.add(enemy1)
coin = Coin(random.randrange(0, SCREEN_WIDTH), random.randrange(0, SCREEN_HEIGHT))
all_sprites.add(coin)

running = True
clock = pygame.time.Clock()

spawnCoin = pygame.USEREVENT + 1
pygame.time.set_timer(spawnCoin, 4000)

while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        if event.type == spawnCoin:
            coin = Coin(random.randrange(0, SCREEN_WIDTH), random.randrange(0, SCREEN_HEIGHT))
            all_sprites.add(coin)
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_LEFT:
                player.go_left()
            if event.key == pygame.K_RIGHT:
                player.go_right()
            if event.key == pygame.K_DOWN:
                player.go_down()
            if event.key == pygame.K_UP:
                player.go_up()
        if event.type == pygame.KEYUP:
            if event.key == pygame.K_LEFT and player.change_x < 0:
                player.stopx()
            if event.key == pygame.K_RIGHT and player.change_x > 0:
                player.stopx()
            if event.key == pygame.K_UP and player.change_y < 0:
                player.stopy()
            if event.key == pygame.K_DOWN and player.change_y > 0:
                player.stopy()
    if player.rect.x < 0:
        player.rect.x = 0
    if player.rect.x > SCREEN_WIDTH - player.rect.width:
        player.rect.x = SCREEN_WIDTH - player.rect.width
    if player.rect.y < 0:
        player.rect.y = 0
    if player.rect.y > SCREEN_HEIGHT - player.rect.height:
        player.rect.y = SCREEN_HEIGHT - player.rect.height

    all_sprites.update()

    screen.fill(ORANGE)
    all_sprites.draw(screen)

    pygame.display.flip()

    clock.tick(60)

pygame.quit()
