AI-Snake-Game/src/game.py

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)