-
Notifications
You must be signed in to change notification settings - Fork 18
Expand file tree
/
Copy pathSnake_game.py
More file actions
152 lines (119 loc) · 4.12 KB
/
Snake_game.py
File metadata and controls
152 lines (119 loc) · 4.12 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
"""
=====================================
🐍 Snake Game - Python (Tkinter GUI)
=====================================
Author: Revant Singh
Description:
A fun Snake Game built using Tkinter.
Use arrow keys to move the snake and
eat red food to grow longer and increase score.
-------------------------------------
🎮 Controls:
- ⬆️ Up Arrow → Move Up
- ⬇️ Down Arrow → Move Down
- ⬅️ Left Arrow → Move Left
- ➡️ Right Arrow → Move Right
-------------------------------------
Time Complexity: O(1) per frame
Space Complexity: O(n) where n = snake length
"""
import tkinter as tk
import random
# Game settings
GAME_WIDTH = 600
GAME_HEIGHT = 400
SPEED = 100 # milliseconds per move
SPACE_SIZE = 20 # size of each grid block
BODY_PARTS = 3
SNAKE_COLOR = "#00FF00"
FOOD_COLOR = "#FF0000"
BACKGROUND = "#1a1a1a"
class Snake:
def __init__(self):
self.body_size = BODY_PARTS
self.coordinates = []
self.squares = []
for i in range(0, BODY_PARTS):
self.coordinates.append([0, 0])
for x, y in self.coordinates:
square = canvas.create_rectangle(x, y, x + SPACE_SIZE, y + SPACE_SIZE, fill=SNAKE_COLOR, tag="snake")
self.squares.append(square)
class Food:
def __init__(self):
x = random.randint(0, (GAME_WIDTH // SPACE_SIZE) - 1) * SPACE_SIZE
y = random.randint(0, (GAME_HEIGHT // SPACE_SIZE) - 1) * SPACE_SIZE
self.coordinates = [x, y]
canvas.create_oval(x, y, x + SPACE_SIZE, y + SPACE_SIZE, fill=FOOD_COLOR, tag="food")
def next_turn(snake, food):
x, y = snake.coordinates[0]
if direction == "up":
y -= SPACE_SIZE
elif direction == "down":
y += SPACE_SIZE
elif direction == "left":
x -= SPACE_SIZE
elif direction == "right":
x += SPACE_SIZE
snake.coordinates.insert(0, (x, y))
square = canvas.create_rectangle(x, y, x + SPACE_SIZE, y + SPACE_SIZE, fill=SNAKE_COLOR)
snake.squares.insert(0, square)
if x == food.coordinates[0] and y == food.coordinates[1]:
global score
score += 10
label.config(text=f"Score: {score}")
canvas.delete("food")
food = Food()
else:
del snake.coordinates[-1]
canvas.delete(snake.squares[-1])
del snake.squares[-1]
if check_collisions(snake):
game_over()
else:
window.after(SPEED, next_turn, snake, food)
def change_direction(new_direction):
global direction
opposites = {"up": "down", "down": "up", "left": "right", "right": "left"}
if new_direction != opposites.get(direction):
direction = new_direction
def check_collisions(snake):
x, y = snake.coordinates[0]
# Hit wall
if x < 0 or x >= GAME_WIDTH or y < 0 or y >= GAME_HEIGHT:
return True
# Hit itself
for body_part in snake.coordinates[1:]:
if x == body_part[0] and y == body_part[1]:
return True
return False
def game_over():
canvas.delete("all")
canvas.create_text(GAME_WIDTH / 2, GAME_HEIGHT / 2,
text=f"GAME OVER\nScore: {score}",
fill="white", font=("Consolas", 24, "bold"))
# ---------------- Main ---------------- #
window = tk.Tk()
window.title("🐍 Snake Game by Revant")
window.resizable(False, False)
score = 0
direction = "down"
label = tk.Label(window, text=f"Score: {score}", font=("Consolas", 16))
label.pack()
canvas = tk.Canvas(window, bg=BACKGROUND, height=GAME_HEIGHT, width=GAME_WIDTH)
canvas.pack()
window.update()
window_width = window.winfo_width()
window_height = window.winfo_height()
screen_width = window.winfo_screenwidth()
screen_height = window.winfo_screenheight()
x = int((screen_width / 2) - (window_width / 2))
y = int((screen_height / 2) - (window_height / 2))
window.geometry(f"{window_width}x{window_height}+{x}+{y}")
window.bind("<Left>", lambda event: change_direction("left"))
window.bind("<Right>", lambda event: change_direction("right"))
window.bind("<Up>", lambda event: change_direction("up"))
window.bind("<Down>", lambda event: change_direction("down"))
snake = Snake()
food = Food()
next_turn(snake, food)
window.mainloop()