-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathgame.py
More file actions
115 lines (91 loc) · 3.58 KB
/
Copy pathgame.py
File metadata and controls
115 lines (91 loc) · 3.58 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
# Game logic
import random
from config import *
class Game:
def __init__(self):
self.high_score = 0
self.paused = False
self.reset()
def reset(self):
# Snake starts with 3 segments
self.snake = [(12, 7), (11, 7), (10, 7)]
self.direction = (1, 0)
self.next_direction = (1, 0)
self.obstacles = []
self.food_eaten = 0
self.level = 1
self.score = 0
self.game_over = False
self.bonus_pos = None
self.bonus_active = False
self.bonus_timer = 0
self.bonus_extra = 0
self.invincible = False
self.invincible_timer = 0
self.food = self.random_pos()
def random_pos(self):
while True:
pos = (random.randint(0, GRID_WIDTH - 1),
random.randint(0, GRID_HEIGHT - 1))
if pos not in self.snake and pos not in self.obstacles:
return pos
def spawn_obstacles(self):
if self.level >= 4:
count = min((self.level - 3) * 2, 8)
self.obstacles = [self.random_pos() for _ in range(count)]
def update(self):
if self.game_over or self.paused:
return
self.direction = self.next_direction
# New head position
new_head = ((self.snake[0][0] + self.direction[0]) % GRID_WIDTH,
(self.snake[0][1] + self.direction[1]) % GRID_HEIGHT)
# Check collisions
if not self.invincible:
if new_head in self.snake[1:] or new_head in self.obstacles:
self.game_over = True
if self.score > self.high_score:
self.high_score = self.score
return
self.snake.insert(0, new_head)
grew = False
# Ate food?
if new_head == self.food:
self.score += 10 * self.level
self.food_eaten += 1
old_level = self.level
self.level = min(MAX_LEVEL, (self.food_eaten // FOODS_PER_LEVEL) + 1)
if self.level > old_level:
self.spawn_obstacles()
self.invincible = True
self.invincible_timer = 20
self.food = self.random_pos()
grew = True
# Spawn bonus every 5 foods
if self.food_eaten % FOODS_PER_LEVEL == 0:
self.bonus_pos = self.random_pos()
self.bonus_active = True
self.bonus_timer = 120
# Ate bonus?
elif self.bonus_active and new_head == self.bonus_pos:
self.score += 50 * self.level + self.bonus_extra
self.bonus_active = False
self.bonus_extra = 0
if not grew:
self.snake.pop()
# Update timers
if self.bonus_active:
self.bonus_timer -= 1
if self.bonus_timer <= 0:
self.bonus_active = False
self.bonus_extra += 50
if self.invincible:
self.invincible_timer -= 1
if self.invincible_timer <= 0:
self.invincible = False
def turn(self, new_dir):
# Prevent 180 degree turns
if new_dir != (-self.direction[0], -self.direction[1]):
self.next_direction = new_dir
def get_fps(self):
return STARTING_FPS + self.level * FPS_PER_LEVEL