import pygame, random
fps=5
score=0
record=0
winWidth=640
winHeight=480
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)
DarkMagenta=(139, 0, 139)
MediumOrchid=(186, 85, 211)
DeepSkyBlue=(0, 191, 255)
Violet=(238, 130, 238)
Plum=(216, 191, 216)
Crimson=(220, 20, 60)
Orchid=(218, 112, 214)

def stopGame():
    pygame.quit()

def showStartScreen():
    while True:
        win.fill(black)
        gameName=font.render('SNAKE',True,DarkMagenta)
        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,Orchid,(x,0),
                         (x,winHeight))
    for y in range(0,winHeight,cellSize):
        pygame.draw.line(win,Orchid,(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,Crimson,appleRect)

def drawSnake(snakeCoord):
    for coord in snakeCoord:
        x=coord['x']*cellSize
        y=coord['y']*cellSize
        maxim=pygame.Rect(x,y,cellSize,cellSize)
        pygame.draw.rect(win,DarkMagenta,maxim)
        kirill=pygame.Rect(x+4,y+4,cellSize-8,cellSize-8)
        pygame.draw.rect(win,MediumOrchid
        ,kirill)


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

    nameText=font.render('create by Гундилович Богдан',True,DeepSkyBlue)
    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()





