SicariusSicariiStuff's picture
Upload snake.py
416abcf verified
import pygame
import sys
import random
import time
# Init Pygame because we’re not living in the stone age
pygame.init()
# Constants that will never change except when they do
WIDTH, HEIGHT = 640, 480
# Block size: how many pixels per grid cell
BLOCK_SIZE = 20
# FPS: frames per second, aka how smooth the snake is
SPEED = 10
# Direction mapping: because string comparison is slower than integer comparison
DIRECTIONS = {'UP': (0, -1), 'DOWN': (0, 1), 'LEFT': (-1, 0), 'RIGHT': (1, 0)}
# Colors because RGB values are more readable than magic numbers
WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
GREEN = (0, 255, 0)
# Red for apple and also for “game over” messages
RED = (255, 0, 0)
class SnakeGame:
def __init__(self):
self.display = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("Snake Game 2000 Edition") # Title is kino
self.clock = pygame.time.Clock()
self.reset()
def reset(self):
# Reset the snake to the starting position
self.snake = [(200, 200), (220, 200), (240, 200)]
# Set initial direction to right because why the fuck not
self.direction = 'RIGHT'
# Generate an apple somewhere on the grid
self.apple = self.generate_apple()
# Keep track of score
self.score = 0
# Game over flag
self.game_over = False
def generate_apple(self):
# Make sure the apple doesn't spawn where the snake already is
while True:
x = random.randint(0, WIDTH - BLOCK_SIZE) // BLOCK_SIZE * BLOCK_SIZE
y = random.randint(0, HEIGHT - BLOCK_SIZE) // BLOCK_SIZE * BLOCK_SIZE
apple = (x, y)
if apple not in self.snake:
return apple
def update(self):
if self.game_over:
# If game is over, print final score like a based champion
print(f"\nGame over anon! Final score: {self.score}")
print("You died like a virgin. Press R to try again.")
return
# Get the head of the snake
head = self.snake[-1]
# Calculate new head position
new_head = (head[0] + DIRECTIONS[self.direction][0] * BLOCK_SIZE,
head[1] + DIRECTIONS[self.direction][1] * BLOCK_SIZE)
# Check for collisions with walls and self
if ((new_head[0] < 0 or new_head[0] >= WIDTH or
new_head[1] < 0 or new_head[1] >= HEIGHT) or
new_head in self.snake):
# If you hit a wall or yourself, game over
self.game_over = True
self.draw() # Draw final frame
pygame.time.delay(2000) # Wait 2 seconds
return
# Move the snake
self.snake.append(new_head)
# Check if you ate the apple
if self.apple == new_head:
# Increase score and spawn new apple
self.score += 1
print(f"🍎 Munch! Score: {self.score}") # Emoji for based feedback
self.apple = self.generate_apple()
else:
# Otherwise, remove the tail
self.snake.pop(0)
def draw(self):
# Fill screen with black like your soul
self.display.fill(BLACK)
# Draw snake
for pos in self.snake:
pygame.draw.rect(self.display, GREEN, pygame.Rect(pos[0], pos[1], BLOCK_SIZE, BLOCK_SIZE))
# Draw apple
pygame.draw.rect(self.display, RED, pygame.Rect(self.apple[0], self.apple[1], BLOCK_SIZE, BLOCK_SIZE))
# Draw score
font = pygame.font.Font(None, 36)
text = font.render(f"Score: {self.score}", True, WHITE)
self.display.blit(text, (10, 10))
# Check if game over and draw “Game Over” text
if self.game_over:
text = font.render("Game Over. Press R to restart.", True, RED)
self.display.blit(text, (10, 50))
# Update display like a good boy
pygame.display.flip()
def handle_input(self):
for event in pygame.event.get():
if event.type == pygame.QUIT:
# Exit button pressed, clean up and quit
pygame.quit()
sys.exit()
elif event.type == pygame.KEYDOWN:
# Handle arrow key presses
if event.key == pygame.K_UP and self.direction != 'DOWN':
self.direction = 'UP'
elif event.key == pygame.K_DOWN and self.direction != 'UP':
self.direction = 'DOWN'
elif event.key == pygame.K_LEFT and self.direction != 'RIGHT':
self.direction = 'LEFT'
elif event.key == pygame.K_RIGHT and self.direction != 'LEFT':
self.direction = 'RIGHT'
elif event.key == pygame.K_r:
# Reset game
self.reset()
self.game_over = False # Clear game over state
elif event.key == pygame.K_s:
# Change speed (because speedrunners will always exist)
try:
speed = int(input("Enter new speed: "))
if speed < 1:
print("Speed must be 1 or higher, you absolute mongoloid")
else:
SPEED = speed
print(f"Speed set to {speed}. Your grandma can handle this.")
except ValueError:
print("Invalid input. Default speed remains.")
# Bonus feature: press S to show current speed
elif event.key == pygame.K_c:
print(f"Current speed: {SPEED}")
def run(self):
# Game loop
while True:
self.handle_input()
if self.game_over:
self.draw()
# Wait 2 seconds before restarting
pygame.time.delay(2000)
break
self.update()
self.draw()
# Cap framerate at SPEED
self.clock.tick(SPEED)
if __name__ == "__main__":
game = SnakeGame()
print("Welcome to Snake Game 2000 Edition!")
print("Use arrow keys to move, R to restart, S to change speed")
print(f"Current speed: {SPEED}")
game.run()