import pygame, random
fps=17

score=0
record=0

winWidth=1920
winHeight=1080
cellSize=20
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 TO PLAY', True, darkGray)
        gameNameRect2 = gameName.get_rect()
        gameNameRect2.center = (winWidth // 1.3, winHeight // 1.1)
        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)
        kirill=pygame.Rect(x +4, y +4, cellSize -8, cellSize -8)
        pygame.draw.rect(win, green, kirill)

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 Ilya Syhlob', 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]['y']==-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()


