113 lines
4.2 KiB
Python
113 lines
4.2 KiB
Python
import pygame
|
|
import sys
|
|
from enum import Enum, auto
|
|
from snake import Snake, Direction
|
|
from food import Food
|
|
|
|
class GameState(Enum):
|
|
MENU = auto()
|
|
PLAYING = auto()
|
|
GAME_OVER = auto()
|
|
PAUSED = auto()
|
|
|
|
class Game:
|
|
def __init__(self):
|
|
# Initialize display
|
|
self.width = 800
|
|
self.height = 600
|
|
self.screen = pygame.display.set_mode((self.width, self.height))
|
|
pygame.display.set_caption("AI Snake Game")
|
|
|
|
# Initialize clock
|
|
self.clock = pygame.time.Clock()
|
|
self.fps = 60
|
|
|
|
# Game objects
|
|
self.block_size = 20
|
|
self.snake = Snake((self.width // 2, self.height // 2), self.block_size)
|
|
self.food = Food(self.block_size)
|
|
|
|
# Spawn initial food
|
|
self.food.spawn(self.width, self.height, self.snake.body)
|
|
|
|
# Game state
|
|
self.state = GameState.PLAYING # Changed to start in playing state for now
|
|
self.running = True
|
|
self.score = 0
|
|
|
|
def handle_events(self):
|
|
for event in pygame.event.get():
|
|
if event.type == pygame.QUIT:
|
|
self.running = False
|
|
elif event.type == pygame.KEYDOWN:
|
|
if event.key == pygame.K_ESCAPE:
|
|
if self.state == GameState.PLAYING:
|
|
self.state = GameState.PAUSED
|
|
elif self.state == GameState.PAUSED:
|
|
self.state = GameState.PLAYING
|
|
elif self.state == GameState.PLAYING:
|
|
# Handle snake direction
|
|
if event.key == pygame.K_UP:
|
|
self.snake.change_direction(Direction.UP)
|
|
elif event.key == pygame.K_DOWN:
|
|
self.snake.change_direction(Direction.DOWN)
|
|
elif event.key == pygame.K_LEFT:
|
|
self.snake.change_direction(Direction.LEFT)
|
|
elif event.key == pygame.K_RIGHT:
|
|
self.snake.change_direction(Direction.RIGHT)
|
|
|
|
def update(self):
|
|
if self.state == GameState.PLAYING:
|
|
# Move snake
|
|
if self.snake.move(pygame.time.get_ticks()):
|
|
# Check wall collision
|
|
if self.snake.check_collision(self.width, self.height):
|
|
self.state = GameState.GAME_OVER
|
|
return
|
|
|
|
# Check food collision
|
|
if self.food.check_collision(self.snake.body[0]):
|
|
self.snake.grow()
|
|
self.score += 1
|
|
self.food.spawn(self.width, self.height, self.snake.body)
|
|
|
|
def render(self):
|
|
# Clear screen
|
|
self.screen.fill((0, 0, 0)) # Black background
|
|
|
|
if self.state == GameState.PLAYING or self.state == GameState.PAUSED:
|
|
# Draw game objects
|
|
self.snake.draw(self.screen)
|
|
self.food.draw(self.screen)
|
|
|
|
# Draw score
|
|
font = pygame.font.Font(None, 36)
|
|
score_text = font.render(f'Score: {self.score}', True, (255, 255, 255))
|
|
self.screen.blit(score_text, (10, 10))
|
|
|
|
# Draw pause indicator
|
|
if self.state == GameState.PAUSED:
|
|
pause_text = font.render('PAUSED', True, (255, 255, 255))
|
|
text_rect = pause_text.get_rect(center=(self.width//2, self.height//2))
|
|
self.screen.blit(pause_text, text_rect)
|
|
|
|
elif self.state == GameState.GAME_OVER:
|
|
font = pygame.font.Font(None, 74)
|
|
text = font.render('Game Over!', True, (255, 0, 0))
|
|
score_text = font.render(f'Score: {self.score}', True, (255, 255, 255))
|
|
|
|
text_rect = text.get_rect(center=(self.width//2, self.height//2 - 50))
|
|
score_rect = score_text.get_rect(center=(self.width//2, self.height//2 + 50))
|
|
|
|
self.screen.blit(text, text_rect)
|
|
self.screen.blit(score_text, score_rect)
|
|
|
|
# Update display
|
|
pygame.display.flip()
|
|
|
|
def run(self):
|
|
while self.running:
|
|
self.handle_events()
|
|
self.update()
|
|
self.render()
|
|
self.clock.tick(self.fps) |