Bare bones SNAKE game This is the bare bones of a SNAKE game that I'm working on, the code runs as is, I've taken great care to keep my code clean and readable. I would appreciate feedback on my code. I plan on creating some graphics to greatly improve the presentation and a menu and high scores.

import sys
import random
import pygame

pygame.init()


class Snake:

    RED = (200, 0, 0)
    BLUE = (0, 0, 190)
    BLACK = (0, 0, 0)
    GREEN = (0, 230, 0)

    score = 0
    xpos = 80
    ypos = 16
    direction = (1, 0)
    snake_tail = [[16, 16], [32, 16], [48, 16], [64, 16], [80, 16]]

    keys = {"GO": pygame.KEYDOWN, "UP": pygame.K_UP, "DOWN": pygame.K_DOWN,
            "LEFT": pygame.K_LEFT, "RIGHT": pygame.K_RIGHT
            }

    fps = pygame.time.Clock()

    def __init__(self, width, height):

        self.width = width
        self.height = height
        self.food_x = random.randint(1, width - 1) * 16
        self.food_y = random.randint(1, height - 1) * 16
        self.screen = pygame.display.set_mode((width * 16, height * 16))

    def main_loop(self):

        while True:

            for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    pygame.quit()
                    sys.exit()

                if event.type == self.keys["GO"] and event.key == self.keys["RIGHT"]:
                    self.direction = (1, 0)
                if event.type == self.keys["GO"] and event.key == self.keys["LEFT"]:
                    self.direction = (-1, 0)
                if event.type == self.keys["GO"] and event.key == self.keys["UP"]:
                    self.direction = (0, -1)
                if event.type == self.keys["GO"] and event.key == self.keys["DOWN"]:
                    self.direction = (0, 1)

            self.move_snake()
            self.fps.tick(12)

    def move_snake(self):

        self.xpos += self.direction[0] * 16
        self.ypos += self.direction[1] * 16
        self.snake_tail.append([self.xpos, self.ypos])
        segment = self.snake_tail.pop(0)

        pygame.draw.circle(self.screen, self.BLACK, (segment[0], segment[1]), 8)

        for segments in self.snake_tail:
            pygame.draw.circle(self.screen, self.BLUE, (segments[0], segments[1]), 8)

        pygame.draw.circle(self.screen, self.GREEN, (self.food_x, self.food_y), 8)
        pygame.draw.circle(self.screen, self.RED, (segments[0], segments[1]), 8)
        pygame.display.update()

        self.kill_snake()

    def kill_snake(self):

        if self.snake_tail[-1] in self.snake_tail[:-1]:
            pygame.quit()
            sys.exit()
        if self.xpos &lt;= 0 or self.xpos &gt;= self.width * 16 or self.ypos &lt;= 0 or self.ypos &gt;= self.height * 16:
            pygame.quit()
            sys.exit()

        self.feed_snake()

    def feed_snake(self):

        if self.xpos == self.food_x and self.ypos == self.food_y:
            self.score += 1
            pygame.display.set_caption(str(self.score))
            self.snake_tail.insert(0, [self.xpos, self.ypos])
            self.food_x = (random.randint(1, self.width - 1)) * 16
            self.food_y = (random.randint(1, self.height - 1)) * 16

Snake(25, 25).main_loop()
There are two main issues with your code.

Comments

Explain your code and what you are trying to do. If you keep developing this game, after some time you will have problems to understand what you are doing.

Especially explain the move_snake(), kill_snake() and feed_snake() functions, but also the usage of the variables.

Constants

Rename all constants, like keys to KEYS.

Access all constants with e.g. Snake.KEYS because they are constants, no class variables that are different for every instance.

To improve readability, you can change the indention for KEYS like this:

KEYS = {"GO": pygame.KEYDOWN,
        "UP": pygame.K_UP, 
        "DOWN": pygame.K_DOWN, 
        "LEFT": pygame.K_LEFT, 
        "RIGHT": pygame.K_RIGHT }