112 lines
3.8 KiB
Python
112 lines
3.8 KiB
Python
# Generated by AI
|
|
import pygame
|
|
import random
|
|
import sys
|
|
|
|
# Initialize pygame
|
|
pygame.init()
|
|
|
|
# Constants for the game
|
|
SCREEN_WIDTH, SCREEN_HEIGHT = 640, 480
|
|
CELL_SIZE = 20
|
|
GRID_WIDTH, GRID_HEIGHT = SCREEN_WIDTH // CELL_SIZE, SCREEN_HEIGHT // CELL_SIZE
|
|
FPS = 10 # Game speed
|
|
|
|
# Colors
|
|
BLACK = (0, 0, 0)
|
|
WHITE = (255, 255, 255)
|
|
GREEN = (0, 255, 0)
|
|
RED = (255, 0, 0)
|
|
|
|
# Directions
|
|
UP = (0, -1)
|
|
DOWN = (0, 1)
|
|
LEFT = (-1, 0)
|
|
RIGHT = (1, 0)
|
|
|
|
class SnakeGame:
|
|
def __init__(self):
|
|
self.screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT))
|
|
pygame.display.set_caption('Snake Game')
|
|
self.clock = pygame.time.Clock()
|
|
|
|
self.snake = [(GRID_WIDTH // 2, GRID_HEIGHT // 2)]
|
|
self.snake_direction = RIGHT
|
|
self.grow = False # Flag for growing the snake
|
|
self.place_food()
|
|
|
|
def place_food(self):
|
|
"""Place the food at a random position on the grid."""
|
|
self.food = (random.randint(0, GRID_WIDTH - 1), random.randint(0, GRID_HEIGHT - 1))
|
|
while self.food in self.snake: # Ensure food is not placed on the snake
|
|
self.food = (random.randint(0, GRID_WIDTH - 1), random.randint(0, GRID_HEIGHT - 1))
|
|
|
|
def move_snake(self):
|
|
"""Move the snake one cell in the current direction."""
|
|
head_x, head_y = self.snake[0]
|
|
new_head = (head_x + self.snake_direction[0], head_y + self.snake_direction[1])
|
|
if self.grow:
|
|
self.snake.insert(0, new_head) # Grow the snake
|
|
else:
|
|
self.snake.insert(0, new_head) # Move the head
|
|
self.snake.pop() # Remove the tail
|
|
self.grow = False
|
|
|
|
# Detect collisions with the walls
|
|
if not (0 <= new_head[0] < GRID_WIDTH) or not (0 <= new_head[1] < GRID_HEIGHT):
|
|
self.game_over()
|
|
|
|
# Detect collisions with the snake itself
|
|
if new_head in self.snake[1:]:
|
|
self.game_over()
|
|
|
|
def check_food_collision(self):
|
|
"""Check if the snake has eaten the food."""
|
|
if self.snake[0] == self.food:
|
|
self.place_food()
|
|
self.grow = True
|
|
|
|
def draw(self):
|
|
"""Draw the game state to the screen."""
|
|
self.screen.fill(BLACK)
|
|
for segment in self.snake:
|
|
pygame.draw.rect(self.screen, GREEN, (segment[0] * CELL_SIZE, segment[1] * CELL_SIZE, CELL_SIZE, CELL_SIZE))
|
|
pygame.draw.rect(self.screen, RED, (self.food[0] * CELL_SIZE, self.food[1] * CELL_SIZE, CELL_SIZE, CELL_SIZE))
|
|
pygame.display.flip()
|
|
|
|
def game_over(self):
|
|
"""Handle the game over scenario."""
|
|
self.screen.fill(BLACK)
|
|
font = pygame.font.SysFont(None, 72)
|
|
text = font.render("Game Over", True, WHITE)
|
|
text_rect = text.get_rect(center=(SCREEN_WIDTH // 2, SCREEN_HEIGHT // 2))
|
|
self.screen.blit(text, text_rect)
|
|
pygame.display.flip()
|
|
pygame.time.wait(2000)
|
|
pygame.quit()
|
|
sys.exit()
|
|
|
|
def run(self):
|
|
"""Main game loop."""
|
|
while True:
|
|
for event in pygame.event.get():
|
|
if event.type == pygame.QUIT:
|
|
self.game_over()
|
|
elif event.type == pygame.KEYDOWN:
|
|
if event.key == pygame.K_UP and self.snake_direction != DOWN:
|
|
self.snake_direction = UP
|
|
elif event.key == pygame.K_DOWN and self.snake_direction != UP:
|
|
self.snake_direction = DOWN
|
|
elif event.key == pygame.K_LEFT and self.snake_direction != RIGHT:
|
|
self.snake_direction = LEFT
|
|
elif event.key == pygame.K_RIGHT and self.snake_direction != LEFT:
|
|
self.snake_direction = RIGHT
|
|
|
|
self.move_snake()
|
|
self.check_food_collision()
|
|
self.draw()
|
|
self.clock.tick(FPS)
|
|
|
|
if __name__ == '__main__':
|
|
game = SnakeGame()
|
|
game.run()
|