Skip to content

Instantly share code, notes, and snippets.

@StanislavPetrovV
Last active November 7, 2023 10:38
Show Gist options
  • Select an option

  • Save StanislavPetrovV/bb36787efbc30cd0921f0cbaa05244f1 to your computer and use it in GitHub Desktop.

Select an option

Save StanislavPetrovV/bb36787efbc30cd0921f0cbaa05244f1 to your computer and use it in GitHub Desktop.
import pygame as pg
import sys
from random import randrange
vec2 = pg.math.Vector2
class Snake:
def __init__(self, game):
self.game = game
self.size = game.TILE_SIZE
self.rect = pg.rect.Rect([0, 0, game.TILE_SIZE - 2, game.TILE_SIZE - 2])
self.range = self.size // 2, self.game.WINDOW_SIZE - self.size // 2, self.size)
self.rect.center = self.get_random_position()
self.direction = vec2(0, 0)
self.step_delay = 100 # milliseconds
self.time = 0
self.length = 1
self.segments = []
self.directions = {pg.K_w: 1, pg.K_s: 1, pg.K_a: 1, pg.K_d: 1}
def control(self, event):
if event.type == pg.KEYDOWN:
if event.key == pg.K_w and self.directions[pg.K_w]:
self.direction = vec2(0, -self.size)
self.directions = {pg.K_w: 1, pg.K_s: 0, pg.K_a: 1, pg.K_d: 1}
if event.key == pg.K_s and self.directions[pg.K_s]:
self.direction = vec2(0, self.size)
self.directions = {pg.K_w: 0, pg.K_s: 1, pg.K_a: 1, pg.K_d: 1}
if event.key == pg.K_a and self.directions[pg.K_a]:
self.direction = vec2(-self.size, 0)
self.directions = {pg.K_w: 1, pg.K_s: 1, pg.K_a: 1, pg.K_d: 0}
if event.key == pg.K_d and self.directions[pg.K_d]:
self.direction = vec2(self.size, 0)
self.directions = {pg.K_w: 1, pg.K_s: 1, pg.K_a: 0, pg.K_d: 1}
def delta_time(self):
time_now = pg.time.get_ticks()
if time_now - self.time > self.step_delay:
self.time = time_now
return True
return False
def get_random_position(self):
return [randrange(*self.range), randrange(*self.range)]
def check_borders(self):
if self.rect.left < 0 or self.rect.right > self.game.WINDOW_SIZE:
self.game.new_game()
if self.rect.top < 0 or self.rect.bottom > self.game.WINDOW_SIZE:
self.game.new_game()
def check_food(self):
if self.rect.center == self.game.food.rect.center:
self.game.food.rect.center = self.get_random_position()
self.length += 1
def check_selfeating(self):
if len(self.segments) != len(set(segment.center for segment in self.segments)):
self.game.new_game()
def move(self):
if self.delta_time():
self.rect.move_ip(self.direction)
self.segments.append(self.rect.copy())
self.segments = self.segments[-self.length:]
def update(self):
self.check_selfeating()
self.check_borders()
self.check_food()
self.move()
def draw(self):
[pg.draw.rect(self.game.screen, 'green', segment) for segment in self.segments]
class Food:
def __init__(self, game):
self.game = game
self.size = game.TILE_SIZE
self.rect = pg.rect.Rect([0, 0, game.TILE_SIZE - 2, game.TILE_SIZE - 2])
self.rect.center = self.game.snake.get_random_position()
def draw(self):
pg.draw.rect(self.game.screen, 'red', self.rect)
class Game:
def __init__(self):
pg.init()
self.WINDOW_SIZE = 1000
self.TILE_SIZE = 50
self.screen = pg.display.set_mode([self.WINDOW_SIZE] * 2)
self.clock = pg.time.Clock()
self.new_game()
def draw_grid(self):
[pg.draw.line(self.screen, [50] * 3, (x, 0), (x, self.WINDOW_SIZE))
for x in range(0, self.WINDOW_SIZE, self.TILE_SIZE)]
[pg.draw.line(self.screen, [50] * 3, (0, y), (self.WINDOW_SIZE, y))
for y in range(0, self.WINDOW_SIZE, self.TILE_SIZE)]
def new_game(self):
self.snake = Snake(self)
self.food = Food(self)
def update(self):
self.snake.update()
pg.display.flip()
self.clock.tick(60)
def draw(self):
self.screen.fill('black')
self.draw_grid()
self.food.draw()
self.snake.draw()
def check_event(self):
for event in pg.event.get():
if event.type == pg.QUIT:
pg.quit()
sys.exit()
# snake control
self.snake.control(event)
def run(self):
while True:
self.check_event()
self.update()
self.draw()
if __name__ == '__main__':
game = Game()
game.run()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment