-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathSnake_game.py
121 lines (100 loc) · 3.36 KB
/
Snake_game.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
import pygame
import sys
import random
# Initialize Pygame
pygame.init()
# Constants
WIDTH, HEIGHT = 640, 480
GRID_SIZE = 20
SNAKE_SIZE = 20
FPS = 15
# Colors
BLACK = (0, 0, 0)
WHITE = (255, 255, 255)
GREEN = (0, 255, 0)
RED = (255, 0, 0)
# Snake class
class Snake:
def __init__(self):
self.length = 1
self.positions = [((WIDTH // 2), (HEIGHT // 2))]
self.direction = random.choice([UP, DOWN, LEFT, RIGHT])
self.color = GREEN
def get_head_position(self):
return self.positions[0]
def update(self):
cur = self.get_head_position()
x, y = self.direction
new = (((cur[0] + (x * GRID_SIZE)) % WIDTH), (cur[1] + (y * GRID_SIZE)) % HEIGHT)
if len(self.positions) > 2 and new in self.positions[2:]:
self.reset()
else:
self.positions.insert(0, new)
if len(self.positions) > self.length:
self.positions.pop()
def reset(self):
self.length = 1
self.positions = [((WIDTH // 2), (HEIGHT // 2))]
self.direction = random.choice([UP, DOWN, LEFT, RIGHT])
def render(self, surface):
for p in self.positions:
pygame.draw.rect(surface, self.color, (p[0], p[1], SNAKE_SIZE, SNAKE_SIZE))
# Food class
class Food:
def __init__(self):
self.position = (0, 0)
self.color = RED
self.randomize_position()
def randomize_position(self):
self.position = (random.randint(0, (WIDTH // GRID_SIZE) - 1) * GRID_SIZE,
random.randint(0, (HEIGHT // GRID_SIZE) - 1) * GRID_SIZE)
def render(self, surface):
pygame.draw.rect(surface, self.color, (self.position[0], self.position[1], SNAKE_SIZE, SNAKE_SIZE))
# Directions
UP = (0, -1)
DOWN = (0, 1)
LEFT = (-1, 0)
RIGHT = (1, 0)
def draw_grid(surface):
for y in range(0, HEIGHT, GRID_SIZE):
for x in range(0, WIDTH, GRID_SIZE):
rect = pygame.Rect(x, y, GRID_SIZE, GRID_SIZE)
pygame.draw.rect(surface, WHITE, rect, 1)
def main():
clock = pygame.time.Clock()
screen = pygame.display.set_mode((WIDTH, HEIGHT), 0, 32)
surface = pygame.Surface(screen.get_size())
surface = surface.convert()
snake = Snake()
food = Food()
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
elif event.type == pygame.KEYDOWN:
if event.key == pygame.K_UP:
if snake.direction != DOWN:
snake.direction = UP
elif event.key == pygame.K_DOWN:
if snake.direction != UP:
snake.direction = DOWN
elif event.key == pygame.K_LEFT:
if snake.direction != RIGHT:
snake.direction = LEFT
elif event.key == pygame.K_RIGHT:
if snake.direction != LEFT:
snake.direction = RIGHT
snake.update()
if snake.get_head_position() == food.position:
snake.length += 1
food.randomize_position()
surface.fill(BLACK)
draw_grid(surface)
snake.render(surface)
food.render(surface)
screen.blit(surface, (0, 0))
pygame.display.update()
clock.tick(FPS)
if __name__ == "__main__":
main()