diff --git a/snake.py b/snake.py index 14fd8c9..fd1f187 100644 --- a/snake.py +++ b/snake.py @@ -1,7 +1,6 @@ import math import random import pygame -import random import tkinter as tk from tkinter import messagebox @@ -15,82 +14,80 @@ class cube(): rows = 20 w = 500 - def __init__(self, start, dirnx=1, dirny=0, color=(255,0,0)): + + def __init__(self, start, dirnx=1, dirny=0, color=(255, 0, 0)): self.pos = start self.dirnx = dirnx - self.dirny = dirny # "L", "R", "U", "D" + self.dirny = dirny # "L", "R", "U", "D" self.color = color def move(self, dirnx, dirny): self.dirnx = dirnx self.dirny = dirny - self.pos = (self.pos[0] + self.dirnx, self.pos[1] + self.dirny) - + self.pos = (self.pos[0] + self.dirnx, self.pos[1] + self.dirny) def draw(self, surface, eyes=False): dis = self.w // self.rows i = self.pos[0] j = self.pos[1] - - pygame.draw.rect(surface, self.color, (i*dis+1,j*dis+1,dis-2,dis-2)) + + pygame.draw.rect(surface, self.color, (i * dis + 1, j * dis + 1, dis - 2, dis - 2)) if eyes: - centre = dis//2 + centre = dis // 2 radius = 3 - circleMiddle = (i*dis+centre-radius,j*dis+8) - circleMiddle2 = (i*dis + dis -radius*2, j*dis+8) - pygame.draw.circle(surface, (0,0,0), circleMiddle, radius) - pygame.draw.circle(surface, (0,0,0), circleMiddle2, radius) - + circleMiddle = (i * dis + centre - radius, j * dis + 8) + circleMiddle2 = (i * dis + dis - radius * 2, j * dis + 8) + pygame.draw.circle(surface, (0, 0, 0), circleMiddle, radius) + pygame.draw.circle(surface, (0, 0, 0), circleMiddle2, radius) class snake(): body = [] turns = {} - + def __init__(self, color, pos): - #pos is given as coordinates on the grid ex (1,5) + # pos is given as coordinates on the grid ex (1,5) self.color = color self.head = cube(pos) self.body.append(self.head) self.dirnx = 0 self.dirny = 1 - + def move(self): for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.quit() keys = pygame.key.get_pressed() - for key in keys: - if keys[pygame.K_LEFT]: - self.dirnx = -1 - self.dirny = 0 - self.turns[self.head.pos[:]] = [self.dirnx,self.dirny] - elif keys[pygame.K_RIGHT]: - self.dirnx = 1 - self.dirny = 0 - self.turns[self.head.pos[:]] = [self.dirnx,self.dirny] - elif keys[pygame.K_UP]: - self.dirny = -1 - self.dirnx = 0 - self.turns[self.head.pos[:]] = [self.dirnx,self.dirny] - elif keys[pygame.K_DOWN]: - self.dirny = 1 - self.dirnx = 0 - self.turns[self.head.pos[:]] = [self.dirnx,self.dirny] - + + if keys[pygame.K_LEFT]: + self.dirnx = -1 + self.dirny = 0 + self.turns[self.head.pos[:]] = [self.dirnx, self.dirny] + elif keys[pygame.K_RIGHT]: + self.dirnx = 1 + self.dirny = 0 + self.turns[self.head.pos[:]] = [self.dirnx, self.dirny] + elif keys[pygame.K_UP]: + self.dirny = -1 + self.dirnx = 0 + self.turns[self.head.pos[:]] = [self.dirnx, self.dirny] + elif keys[pygame.K_DOWN]: + self.dirny = 1 + self.dirnx = 0 + self.turns[self.head.pos[:]] = [self.dirnx, self.dirny] + for i, c in enumerate(self.body): p = c.pos[:] if p in self.turns: turn = self.turns[p] c.move(turn[0], turn[1]) - if i == len(self.body)-1: + if i == len(self.body) - 1: self.turns.pop(p) else: - c.move(c.dirnx,c.dirny) - - - def reset(self,pos): + c.move(c.dirnx, c.dirny) + + def reset(self, pos): self.head = cube(pos) self.body = [] self.body.append(self.head) @@ -103,29 +100,28 @@ def addCube(self): dx, dy = tail.dirnx, tail.dirny if dx == 1 and dy == 0: - self.body.append(cube((tail.pos[0]-1,tail.pos[1]))) + self.body.append(cube((tail.pos[0] - 1, tail.pos[1]))) elif dx == -1 and dy == 0: - self.body.append(cube((tail.pos[0]+1,tail.pos[1]))) + self.body.append(cube((tail.pos[0] + 1, tail.pos[1]))) elif dx == 0 and dy == 1: - self.body.append(cube((tail.pos[0],tail.pos[1]-1))) + self.body.append(cube((tail.pos[0], tail.pos[1] - 1))) elif dx == 0 and dy == -1: - self.body.append(cube((tail.pos[0],tail.pos[1]+1))) + self.body.append(cube((tail.pos[0], tail.pos[1] + 1))) self.body[-1].dirnx = dx self.body[-1].dirny = dy - + def draw(self, surface): - for i,c in enumerate(self.body): + for i, c in enumerate(self.body): if i == 0: c.draw(surface, True) else: c.draw(surface) - def redrawWindow(): global win - win.fill((0,0,0)) + win.fill((0, 0, 0)) drawGrid(width, rows, win) s.draw(win) snack.draw(win) @@ -133,7 +129,6 @@ def redrawWindow(): pass - def drawGrid(w, rows, surface): sizeBtwn = w // rows @@ -141,58 +136,59 @@ def drawGrid(w, rows, surface): y = 0 for l in range(rows): x = x + sizeBtwn - y = y +sizeBtwn + y = y + sizeBtwn - pygame.draw.line(surface, (255,255,255), (x, 0),(x,w)) - pygame.draw.line(surface, (255,255,255), (0, y),(w,y)) - + pygame.draw.line(surface, (255, 255, 255), (x, 0), (x, w)) + pygame.draw.line(surface, (255, 255, 255), (0, y), (w, y)) def randomSnack(rows, item): positions = item.body while True: - x = random.randrange(1,rows-1) - y = random.randrange(1,rows-1) - if len(list(filter(lambda z:z.pos == (x,y), positions))) > 0: - continue + x = random.randrange(1, rows - 1) + y = random.randrange(1, rows - 1) + if len(list(filter(lambda z: z.pos == (x, y), positions))) > 0: + continue else: - break + break - return (x,y) + return (x, y) def main(): global s, snack, win - win = pygame.display.set_mode((width,height)) - s = snake((255,0,0), (10,10)) + win = pygame.display.set_mode((width, height)) + s = snake((255, 0, 0), (10, 10)) s.addCube() - snack = cube(randomSnack(rows,s), color=(0,255,0)) + snack = cube(randomSnack(rows, s), color=(0, 255, 0)) flag = True clock = pygame.time.Clock() - + while flag: - pygame.time.delay(50) - clock.tick(10) - s.move() - headPos = s.head.pos - if headPos[0] >= 20 or headPos[0] < 0 or headPos[1] >= 20 or headPos[1] < 0: - print("Score:", len(s.body)) - s.reset((10, 10)) - - if s.body[0].pos == snack.pos: - s.addCube() - snack = cube(randomSnack(rows,s), color=(0,255,0)) - - for x in range(len(s.body)): - if s.body[x].pos in list(map(lambda z:z.pos,s.body[x+1:])): + try: + pygame.time.delay(50) + clock.tick(10) + s.move() + headPos = s.head.pos + if headPos[0] >= 20 or headPos[0] < 0 or headPos[1] >= 20 or headPos[1] < 0: print("Score:", len(s.body)) - s.reset((10,10)) - break - - redrawWindow() + s.reset((10, 10)) -main() - + if s.body[0].pos == snack.pos: + s.addCube() + snack = cube(randomSnack(rows, s), color=(0, 255, 0)) - + for x in range(len(s.body)): + if s.body[x].pos in list(map(lambda z: z.pos, s.body[x + 1:])): + print("Score:", len(s.body)) + s.reset((10, 10)) + break + + redrawWindow() + except Exception as e: + print(f"An error occurred during the game: {e}") + flag = False # End the game if an error occurs + + +main()