import pygame, random

fps = 5
score = 0
record = 0

winWidth = 1920
winHeight = 1080
cellSize = 40
cellWidth = winWidth // cellSize
cellHeight = winHeight // cellSize
white = (255, 255, 255)
black = (0, 0, 0)
red = (255, 0, 0)
green = (0, 255, 0)
darkGreen = (0, 155, 0)
darkGray = (40, 40, 40)


def stopGame():
    pygame.quit()


def showStartScreen():
    while True:
        win.fill(black)
        gameName = font.render('SNAKE', True, green)
        gameNameRect = gameName.get_rect()
        gameNameRect.center = (winWidth // 2, winHeight // 2)
        win.blit(gameName, gameNameRect)

        gameName2 = font.render('Press a key to play',
                                True, darkGray)
        gameNameRect2 = gameName2.get_rect()
        gameNameRect2.topleft = (winWidth - 200, winHeight - 30)
        win.blit(gameName2, gameNameRect2)

        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                stopGame()
            elif event.type == pygame.KEYUP:
                return

        pygame.display.update()
        fpsClock.tick(fps)


def drawGrid():
    for x in range(0, winWidth, cellSize):
        pygame.draw.line(win, darkGray, (x, 0),
                         (x, winHeight))
    for y in range(0, winHeight, cellSize):
        pygame.draw.line(win, darkGray, (0, y),
                         (winWidth, y))


def getRandomLoc():
    x = random.randint(0, cellWidth - 1)
    y = random.randint(0, cellHeight - 1)
    return {'x': x, 'y': y}


def drawApple(appleCoord):
    x = appleCoord['x'] * cellSize
    y = appleCoord['y'] * cellSize
    appleRect = pygame.Rect(x, y, cellSize, cellSize)
    pygame.draw.rect(win, red, appleRect)


def drawSnake(snakeCoord):
    for coord in snakeCoord:
        x = coord['x'] * cellSize
        y = coord['y'] * cellSize
        snakerect = pygame.Rect(x, y, cellSize, cellSize)
        pygame.draw.rect(win, darkGreen, snakerect)
        snakerect2 = pygame.Rect(x + 4, y + 4, cellSize - 8, cellSize - 8)
        pygame.draw.rect(win, green, snakerect2)


def drawScore(score, record):
    scoreText = font.render('Score: ' + str(score), True, white)
    scoreRect = scoreText.get_rect()
    scoreRect.topleft = (winWidth - 120, 10)
    win.blit(scoreText, scoreRect)
    recordText = font.render('Record: ' + str(record), True, white)
    recordRect = recordText.get_rect()
    recordRect.topleft = (10, 10)
    win.blit(recordText, recordRect)

    nameText=font.render('Created by Matvey Stupakov', True, white)
    nameRect=nameText.get_rect()
    nameRect.topleft=(10, winHeight-30)
    win.blit(nameText, nameRect)


def runGame():
    global score

    appleCoord = getRandomLoc()
    startx = random.randint(5, cellWidth - 6)
    starty = random.randint(5, cellHeight - 6)
    snakeCoord = [{'x': startx, 'y': starty},
                  {'x': startx - 1, 'y': starty},
                  {'x': startx - 2, 'y': starty}]
    direct = 'right'
    while True:

        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                stopGame()
            elif event.type == pygame.KEYDOWN:
                if event.key == pygame.K_LEFT and direct != 'right':
                    direct = 'left'
                elif event.key == pygame.K_RIGHT and direct != 'left':
                    direct = 'right'
                elif event.key == pygame.K_UP and direct != 'down':
                    direct = 'up'
                elif event.key == pygame.K_DOWN and direct != 'up':
                    direct = 'down'
                elif event.key == pygame.K_ESCAPE:
                    stopGame()

        if direct == 'up':
            new = {'x': snakeCoord[0]['x'], 'y': snakeCoord[0]['y'] - 1}
        elif direct == 'down':
            new = {'x': snakeCoord[0]['x'], 'y': snakeCoord[0]['y'] + 1}
        elif direct == 'right':
            new = {'x': snakeCoord[0]['x'] + 1, 'y': snakeCoord[0]['y']}
        elif direct == 'left':
            new = {'x': snakeCoord[0]['x'] - 1, 'y': snakeCoord[0]['y']}
        snakeCoord.insert(0, new)

        if (snakeCoord[0]['x'] == appleCoord['x'] and snakeCoord[0]['y'] == appleCoord['y']):
            appleCoord = getRandomLoc()
        else:
            del snakeCoord[-1]

        if (snakeCoord[0]['x'] == -1 or snakeCoord[0]['x'] == cellWidth or snakeCoord[0]['y'] == -1 or
                snakeCoord[0]['y'] == cellHeight):
            return
        for coord in snakeCoord[1:]:
            if (coord['x'] == snakeCoord[0]['x'] and coord['y'] == snakeCoord[0]['y']):
                return

        win.fill(black)
        drawGrid()

        drawApple(appleCoord)
        drawSnake(snakeCoord)
        score = len(snakeCoord) - 3
        drawScore(score, record)

        pygame.display.update()
        fpsClock.tick(fps)


pygame.init()
fpsClock = pygame.time.Clock()
win = pygame.display.set_mode((winWidth, winHeight))
pygame.display.set_caption('Змейка спасет мир')
font = pygame.font.Font('freesansbold.ttf', 18)
showStartScreen()

while True:
    try:
        f = open('record.txt', 'r')
        record = int(f.readline())

        f.close()
    except:
        f = open('record.txt', 'w')
        f.write('0')
        f.close()
        record = 0
    runGame()
    if score > record:
        f = open('record.txt', 'w')
        f.write(str(score))
        f.close()
