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 <= 0 or self.xpos >= self.width * 16 or self.ypos <= 0 or self.ypos >= 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()