diff --git a/.DS_Store b/.DS_Store
index fd32037..1ce78f8 100644
Binary files a/.DS_Store and b/.DS_Store differ
diff --git a/Snake/.DS_Store b/Snake/.DS_Store
new file mode 100644
index 0000000..84442ed
Binary files /dev/null and b/Snake/.DS_Store differ
diff --git a/Snake/Assets/BoldPixels.otf b/Snake/Assets/BoldPixels.otf
new file mode 100644
index 0000000..bb30240
Binary files /dev/null and b/Snake/Assets/BoldPixels.otf differ
diff --git a/Snake/Assets/bg_music.mp3 b/Snake/Assets/bg_music.mp3
new file mode 100644
index 0000000..4e4d979
Binary files /dev/null and b/Snake/Assets/bg_music.mp3 differ
diff --git a/Snake/Assets/lose.wav b/Snake/Assets/lose.wav
new file mode 100644
index 0000000..2dad605
Binary files /dev/null and b/Snake/Assets/lose.wav differ
diff --git a/Snake/Assets/powerup.wav b/Snake/Assets/powerup.wav
new file mode 100644
index 0000000..eccb0b9
Binary files /dev/null and b/Snake/Assets/powerup.wav differ
diff --git a/Snake/Classes/__init__.py b/Snake/Classes/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/Snake/Classes/apple.py b/Snake/Classes/apple.py
new file mode 100644
index 0000000..a3b4e29
--- /dev/null
+++ b/Snake/Classes/apple.py
@@ -0,0 +1,30 @@
+import pygame
+import json
+import random
+
+data = json.load(open("data.json"))
+rows = data["rows"]
+cols = data["cols"]
+
+
+class Apple(pygame.sprite.Sprite):
+ def __init__(self, window, size, color):
+ super().__init__()
+ self.window = window
+ self.size = size
+ self.color = color
+ self.position = random.randint(0, rows - 1), random.randint(0, cols - 1)
+
+ def generate_new_position(self):
+ return random.randint(0, rows - 1), random.randint(0, cols - 1)
+
+ def draw(self):
+ pygame.draw.rect(
+ self.window,
+ self.color,
+ pygame.Rect(
+ (self.position[0] * 30, self.position[1] * 30), (self.size, self.size)
+ ),
+ width=7,
+ border_radius=3,
+ )
diff --git a/Snake/Classes/snake.py b/Snake/Classes/snake.py
new file mode 100644
index 0000000..1837c4a
--- /dev/null
+++ b/Snake/Classes/snake.py
@@ -0,0 +1,67 @@
+import pygame
+
+
+class Snake(pygame.sprite.Sprite):
+ def __init__(self, window, size):
+ self.snake_positions = [(0, 0), (1, 0), (2, 0), (3, 0)]
+ self.size = size
+ self.window = window
+ self.moving_direction = "right"
+ self.increase = False
+
+ def move(self):
+ keys = pygame.key.get_pressed()
+ if keys[pygame.K_LEFT] or keys[pygame.K_a]:
+ if self.moving_direction != "right":
+ self.moving_direction = "left"
+ elif keys[pygame.K_RIGHT] or keys[pygame.K_d]:
+ if self.moving_direction != "left":
+ self.moving_direction = "right"
+ elif keys[pygame.K_UP] or keys[pygame.K_w]:
+ if self.moving_direction != "down":
+ self.moving_direction = "up"
+ elif keys[pygame.K_DOWN] or keys[pygame.K_s]:
+ if self.moving_direction != "up":
+ self.moving_direction = "down"
+
+ if not self.increase:
+ self.snake_positions.pop(0)
+
+ last_position = self.snake_positions[-1]
+
+ if self.moving_direction == "left":
+ self.snake_positions.append((last_position[0] - 1, last_position[1]))
+ elif self.moving_direction == "right":
+ self.snake_positions.append((last_position[0] + 1, last_position[1]))
+ elif self.moving_direction == "up":
+ self.snake_positions.append((last_position[0], last_position[1] - 1))
+ elif self.moving_direction == "down":
+ self.snake_positions.append((last_position[0], last_position[1] + 1))
+
+ def draw(self):
+ i = 0
+ color = (0, 209, 0)
+ for snake_position in self.snake_positions:
+ i += 1
+ if i % 2 == 0:
+ color = (0, 178, 0)
+ else:
+ color = (0, 209, 0)
+ pygame.draw.rect(
+ self.window,
+ color,
+ pygame.Rect(
+ (snake_position[0] * self.size, snake_position[1] * self.size),
+ (self.size, self.size),
+ ),
+ )
+
+ def reset(self):
+ self.moving_direction = "right"
+ self.snake_positions = [
+ (0, 0),
+ (1, 0),
+ (2, 0),
+ (3, 0),
+ ]
+ self.increase = False
diff --git a/Snake/Classes/text.py b/Snake/Classes/text.py
new file mode 100644
index 0000000..1ab0c0c
--- /dev/null
+++ b/Snake/Classes/text.py
@@ -0,0 +1,25 @@
+import pygame
+
+
+class Text:
+ def __init__(self, window, text, font_size, color, alpha):
+ self.window = window
+ self.text = text
+ self.font_size = font_size
+ self.color = color
+ self.font = pygame.font.Font("Assets/BoldPixels.otf", self.font_size)
+ self.text_surface = self.font.render(
+ self.text, True, self.color
+ ).convert_alpha()
+ self.text_surface.set_alpha(alpha)
+ self.alpha = alpha
+
+ def draw(self, position):
+ self.window.blit(self.text_surface, position)
+
+ def update_text(self, new_text):
+ self.text = new_text
+ self.text_surface = self.font.render(
+ self.text, True, self.color
+ ).convert_alpha()
+ self.text_surface.set_alpha(self.alpha)
diff --git a/Snake/README.md b/Snake/README.md
new file mode 100644
index 0000000..7b922f9
--- /dev/null
+++ b/Snake/README.md
@@ -0,0 +1,23 @@
+Snake is a game where you need to control a snake to eat apples while avoiding ramming into yourself or the wall.
+
+Controls - WSAD or arrow keys
+
+I made this when I was learning pygame.
+
+## How to play
+
+1. Download this repo
+2. Install pygame
+3. Run main.py
+
+Credits -
+Lose Sound Effect by R0T0R from Pixabay
+
+Power-Up Sound Effect by freesound_community from Pixabay
+
+Font is BoldPixels by Yuki Pixels from 1001 Fonts.
+
+Background Music from #Uppbeat (free for Creators!):
+https://uppbeat.io/t/pecan-pie/boogie
+
+Find the main repository here.
diff --git a/Snake/data.json b/Snake/data.json
new file mode 100644
index 0000000..25bad35
--- /dev/null
+++ b/Snake/data.json
@@ -0,0 +1,4 @@
+{
+ "rows": 20,
+ "cols": 10
+}
diff --git a/Snake/main.py b/Snake/main.py
new file mode 100644
index 0000000..be29516
--- /dev/null
+++ b/Snake/main.py
@@ -0,0 +1,138 @@
+import pygame
+import math
+import json
+
+from Classes.snake import Snake
+from Classes.apple import Apple
+from Classes.text import Text
+
+pygame.init()
+pygame.font.init()
+pygame.mixer.init()
+
+data = json.load(open("data.json"))
+rows = data["rows"]
+cols = data["cols"]
+
+WIDTH, HEIGHT = 30 * rows, 30 * cols
+FPS = 10
+
+window = pygame.display.set_mode((WIDTH, HEIGHT))
+
+pygame.display.set_caption("Snake 🐍")
+
+white = pygame.Color(255, 255, 255)
+green = pygame.Color(0, 255, 0)
+red = pygame.Color(255, 0, 0)
+
+snake = Snake(window, 30)
+apple = Apple(window, 30, red)
+
+lose_text = Text(window, "You lost! :(", 75, red, 255)
+win_text = Text(window, "You won! :D", 75, green, 255)
+
+lose_sound = pygame.mixer.Sound("Assets/lose.wav")
+powerup_sound = pygame.mixer.Sound("Assets/powerup.wav")
+pygame.mixer.music.load("Assets/bg_music.mp3")
+pygame.mixer.music.set_volume(0.3)
+
+
+bg_color = (1, 5, 36)
+
+
+def game():
+ clock = pygame.time.Clock()
+ run = True
+
+ hover_value = 0.0
+ pygame.mixer.music.play(-1)
+
+ score = len(snake.snake_positions)
+ score_text = Text(window, str(score), 75, (255, 0, 0), 128)
+ lose_text_under = Text(window, "Your score is " + str(score), 75, white, 255)
+ while run:
+ clock.tick(FPS)
+ for event in pygame.event.get():
+ if event.type == pygame.QUIT:
+ pygame.quit()
+ quit()
+
+ hover_value += 0.1
+ window.fill((bg_color))
+
+ score_text.update_text(str(score))
+ lose_text_under.update_text("Your score is " + str(score))
+
+ # Handling apple spawning
+ if apple.position in snake.snake_positions:
+ snake.increase = True
+ apple.position = apple.generate_new_position()
+ score += 1
+
+ else:
+ snake.increase = False
+
+ apple.draw()
+
+ if snake.increase:
+ snake.increase = True
+ pygame.mixer.Sound.play(powerup_sound)
+
+ snake.move()
+ snake.draw()
+ score_text.draw(
+ (
+ WIDTH // 2 - score_text.text_surface.get_width() // 2,
+ (HEIGHT // 2 - score_text.text_surface.get_height() // 2)
+ - math.sin(hover_value * 2) * 20,
+ )
+ )
+
+ if (
+ snake.snake_positions[-1] in snake.snake_positions[:-1]
+ or snake.snake_positions[-1][0] < 0
+ or snake.snake_positions[-1][0] > rows - 1
+ or snake.snake_positions[-1][1] < 0
+ or snake.snake_positions[-1][1] > cols - 1
+ ):
+ run = False
+ pygame.mixer.Sound.play(lose_sound)
+ pygame.mixer.music.stop()
+ window.fill((bg_color))
+ lose_text.draw(
+ (
+ WIDTH // 2 - lose_text.text_surface.get_width() // 2,
+ 50,
+ )
+ )
+ lose_text_under.draw(
+ (
+ WIDTH // 2 - lose_text_under.text_surface.get_width() // 2,
+ 125,
+ )
+ )
+ if len(snake.snake_positions) == rows * cols:
+ run = False
+ window.fill((bg_color))
+
+ win_text.draw(
+ (
+ WIDTH // 2 - win_text.text_surface.get_width() // 2,
+ 50,
+ )
+ )
+
+ pygame.display.flip()
+ score_text.text_surface.fill((0, 0, 0, 0))
+
+
+def main(window=window):
+ while True:
+ game()
+ snake.reset()
+ pygame.time.delay(1500)
+ pygame.display.flip()
+
+
+if __name__ == "__main__":
+ main(window)
diff --git a/Snake/requirements.txt b/Snake/requirements.txt
new file mode 100644
index 0000000..231dd17
--- /dev/null
+++ b/Snake/requirements.txt
@@ -0,0 +1 @@
+pygame
\ No newline at end of file