import pygame #brauchen wir um die pygame Konstrukte nutzen zu können
from random import randint

#initialisiert das Modul pygame
pygame.init()

elemSize = 50
cols = 21          #Columns (engl. für Spalten)
rows = 11          #Rows (engl. für Zeilen)

screenWidth = cols * elemSize
screenHeight = rows * elemSize

screen = pygame.display.set_mode((screenWidth,screenHeight)) 

clock = pygame.time.Clock()
fps = 5

isRunning = True
gameOver = False

points = 0

green = (0,255,0)  # rgb-Wert ... rot-Anteil: 0, grün-Anteil: 255, blau-Anteil: 0
red = (255,0,0)
blue = (0,0,255)
black = (0,0,0)

font = pygame.font.SysFont("Comic Sans MS", 72) #Schriftart + Größe
text = font.render("Game Over", True, blue) #Text, Antialiasing, Farbe

direction = "none"  # none, left, right, up, down

head = pygame.Rect((screenWidth-elemSize)/2, (screenHeight-elemSize)/2, elemSize, elemSize) 
tail = []  # Liste für die Schwanzelemente
food = pygame.Rect(randint(0,cols-1)*elemSize, randint(0,rows-1)*elemSize, elemSize, elemSize)

def moveSnake():
    if len(tail) > 0:
        lastElem = tail.pop() #entfernt das letzte Element und speichert es
        lastElem.left = head.left
        lastElem.top = head.top
        tail.insert(0, lastElem)
    if direction == "right":
        head.left = head.left + head.width
    if direction == "left":
        head.left = head.left - head.width
    if direction == "up":
        head.top = head.top - head.height
    if direction == "down":
        head.top = head.top + head.height

def collidedWithBorder():
    if head.top <= 0 and direction == "up":
        return True
    if head.top >= screenHeight - elemSize and direction == "down":
        return True
    if head.left <= 0 and direction == "left":
        return True
    if head.left >= screenWidth - elemSize and direction == "right":
        return True
    return False

def collidedWithTail():
    for tElem in tail:  # check tail collision
        if tElem.colliderect(head):
            return True

while isRunning:
    screen.fill(black)
    for event in pygame.event.get():
        if event.type == pygame.QUIT: 
            isRunning = False
            gameOver = True
        if event.type == pygame.KEYDOWN and event.key == pygame.K_RIGHT:
            direction = "right"
        if event.type == pygame.KEYDOWN and event.key == pygame.K_LEFT:
            direction = "left"
        if event.type == pygame.KEYDOWN and event.key == pygame.K_UP:
            direction = "up"
        if event.type == pygame.KEYDOWN and event.key == pygame.K_DOWN:
            direction = "down"
    
    if collidedWithBorder():
        isRunning = False
        gameOver = True
    
    clock.tick(fps)
    
    moveSnake()
    
    if collidedWithTail():
        isRunning = False
        gameOver = True

    
    if head.colliderect(food):
        points = points + 1
        pygame.display.set_caption("Punkte: " + str(points))
        food.left = randint(0, cols-1)*elemSize
        food.top = randint(0, rows-1)*elemSize
        tail.insert(0, pygame.Rect(head.left, head.top, elemSize, elemSize))
        fps = fps + 1
    
    
    pygame.draw.rect(screen, red, food)
    pygame.draw.rect(screen, green, head)
    
    for elem in tail:                       # draw tail
        pygame.draw.rect(screen, green, elem)
        
    pygame.display.flip()

screen.fill(black)
while gameOver:
    screen.blit(text, ((screenWidth - text.get_width()) // 2, (screenHeight - text.get_height()) // 2))
    pygame.display.flip()
    for event in pygame.event.get():
        if event.type == pygame.QUIT:   # user drückt auf das "x" rechts oben
            gameOver = False
        if event.type == pygame.KEYDOWN and event.key == pygame.K_SPACE:
            gameOver = False

pygame.quit()
