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