-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmain.py
More file actions
153 lines (126 loc) · 4.99 KB
/
main.py
File metadata and controls
153 lines (126 loc) · 4.99 KB
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
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
import pygame
import random
from typing import Tuple
# Константы
SCREEN_WIDTH = 640
SCREEN_HEIGHT = 480
GRID_SIZE = 20
BOARD_BACKGROUND_COLOR = (0, 0, 0)
UP = (0, -1)
DOWN = (0, 1)
LEFT = (-1, 0)
RIGHT = (1, 0)
class GameObject:
# Базовый класс для игровых объектов
def __init__(self, position: Tuple[int, int],
body_color: Tuple[int, int, int]):
self.position = position
self.body_color = body_color
def draw(self, surface: pygame.Surface):
pass
class Apple(GameObject):
# Класс яблоко
def __init__(self):
super().__init__((0, 0), (255, 0, 0)) # Красный цвет
self.randomize_position()
def randomize_position(self):
self.position = (
random.randint(0, (SCREEN_WIDTH // GRID_SIZE) - 1) * GRID_SIZE,
random.randint(0, (SCREEN_HEIGHT // GRID_SIZE) - 1) * GRID_SIZE,
)
def draw(self, surface: pygame.Surface):
# Отрисовывает яблоко на игровом поле
r = pygame.Rect((self.position[0], self.position[1]),
(GRID_SIZE, GRID_SIZE))
pygame.draw.rect(surface, self.body_color, r)
class Snake(GameObject):
# Класс, представляющий змейки
def __init__(self):
# Инициализация змейки
super().__init__(((SCREEN_WIDTH // 2), (SCREEN_HEIGHT // 2)),
(0, 255, 0))
self.length = 1
self.positions = [self.position]
self.direction = random.choice([UP, DOWN, LEFT, RIGHT])
self.next_direction = None
self.last = None
def update_direction(self):
# Обновление направления движения змейки
if (self.next_direction and self.next_direction !=
tuple(map(lambda x, y: -x, self.direction,
self.next_direction))):
self.direction = self.next_direction
self.next_direction = None
def move(self):
# Перемещение змейки на одну клетку
cur = self.get_head_position()
x, y = self.direction
new = (
((cur[0] + (x * GRID_SIZE)) % SCREEN_WIDTH),
((cur[1] + (y * GRID_SIZE)) % SCREEN_HEIGHT),
)
if len(self.positions) > 2 and new in self.positions[2:]:
self.reset()
else:
self.last = self.positions[-1] # Сохранение последнего сегмента
self.positions.insert(0, new)
if len(self.positions) > self.length:
self.positions.pop()
def draw(self, surface: pygame.Surface):
# Отрисовка змейки на игровом поле
for p in self.positions:
r = pygame.Rect((p[0], p[1]), (GRID_SIZE, GRID_SIZE))
pygame.draw.rect(surface, self.body_color, r)
pygame.draw.rect(surface, (255, 255, 255), r, 1)
if self.last: # Стирание последнего сегмента
r = pygame.Rect(self.last, (GRID_SIZE, GRID_SIZE))
pygame.draw.rect(surface, BOARD_BACKGROUND_COLOR, r)
def get_head_position(self) -> Tuple[int, int]:
# Возврат позиции головы змейки
return self.positions[0]
def reset(self):
# Сбрасывает змейку в начальное состояние
self.length = 1
self.positions = [((SCREEN_WIDTH // 2), (SCREEN_HEIGHT // 2))]
self.direction = random.choice([UP, DOWN, LEFT, RIGHT])
def handle_keys(snake: Snake):
# Обрабатывает нажатия клавиш
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
exit()
elif event.type == pygame.KEYDOWN:
if event.key == pygame.K_UP:
snake.next_direction = UP
elif event.key == pygame.K_DOWN:
snake.next_direction = DOWN
elif event.key == pygame.K_LEFT:
snake.next_direction = LEFT
elif event.key == pygame.K_RIGHT:
snake.next_direction = RIGHT
def main():
# Основной Игрового цикла
pygame.init()
clock = pygame.time.Clock()
screen = (pygame.display.set_mode
((SCREEN_WIDTH, SCREEN_HEIGHT), 0, 32))
surface = pygame.Surface(screen.get_size())
surface = surface.convert()
surface.fill(BOARD_BACKGROUND_COLOR)
snake = Snake()
apple = Apple()
while True:
handle_keys(snake)
snake.update_direction()
snake.move()
if snake.get_head_position() == apple.position:
snake.length += 1
apple.randomize_position()
surface.fill(BOARD_BACKGROUND_COLOR)
snake.draw(surface)
apple.draw(surface)
screen.blit(surface, (0, 0))
pygame.display.update()
clock.tick(10)
if __name__ == "__main__":
main()