Add snake collision with wall.

This commit is contained in:
paulusja 2026-04-23 16:33:28 +02:00
parent a7735e2084
commit 0e72331f45
5 changed files with 47 additions and 17 deletions

View File

@ -5,5 +5,9 @@ class GameObject:
def draw(self, surface: pygame.Surface) -> None: def draw(self, surface: pygame.Surface) -> None:
pass pass
def update(self, user_input: int) -> None: def update(self, user_input: int, game_objs: list['GameObject']) -> None:
pass pass
def get_bounding_boxes(self) -> list[pygame.rect.Rect]:
return []

View File

@ -15,7 +15,7 @@ def draw_all(window: Window, game_objs: list[GameObject]) -> None:
def update_all(game_objs: list[GameObject], user_input: int) -> None: def update_all(game_objs: list[GameObject], user_input: int) -> None:
for obj in game_objs: for obj in game_objs:
obj.update(user_input) obj.update(user_input, game_objs)
def create_game_objects(window): def create_game_objects(window):

View File

@ -2,6 +2,7 @@ import pygame
from game_object import GameObject from game_object import GameObject
from snake_segment import SnakeSegment from snake_segment import SnakeSegment
from snake_state_machine import SnakeStateMachine from snake_state_machine import SnakeStateMachine
from wall import Wall
class Snake(GameObject): class Snake(GameObject):
@ -12,14 +13,32 @@ class Snake(GameObject):
for idx in range(length)] for idx in range(length)]
self.__state_machine = SnakeStateMachine() self.__state_machine = SnakeStateMachine()
self.__is_dead = False
def __collides_with_wall(self, obj: GameObject):
return isinstance(obj, Wall) and self.get_bounding_boxes()[0].collidelist(obj.get_bounding_boxes()) > -1
def __update_on_collision(self, game_objs: list[GameObject]) -> None:
for obj in game_objs:
if self.__collides_with_wall(obj):
self.__is_dead = True
def draw(self, surface: pygame.Surface) -> None: def draw(self, surface: pygame.Surface) -> None:
for segment in self.__segments: for segment in self.__segments:
segment.draw(surface) segment.draw(surface)
def update(self, user_input: int=None) -> None: def update(self, user_input: int, game_objs: list[GameObject]) -> None:
self.__state_machine.update(user_input) if not self.__is_dead:
new_head = self.__state_machine.get_state().get_next_head(self.__segments[0]) self.__update_on_collision(game_objs)
self.__segments.insert(0, new_head) self.__state_machine.update(user_input)
self.__segments.pop() new_head = self.__state_machine.get_state().get_next_head(self.__segments[0])
self.__segments.insert(0, new_head)
self.__segments.pop()
def get_bounding_boxes(self) -> list[pygame.rect.Rect]:
return [seg.get_bounding_boxes()[0] for seg in self.__segments]

View File

@ -1,24 +1,28 @@
import pygame import pygame
from game_object import GameObject from game_object import GameObject
class SnakeSegment(GameObject): class SnakeSegment(GameObject):
def __init__(self, center: tuple|list, radius: float|int, color: tuple) -> None: def __init__(self, center: tuple|list, radius: float|int, color: tuple) -> None:
self.__center = center self.__bounding_box = pygame.rect.Rect(0, 0, radius*2, radius*2)
self.__radius = radius self.__bounding_box.center = center
self.__color = color self.__color = color
def draw(self, surface: pygame.Surface) -> None: def draw(self, surface: pygame.Surface) -> None:
pygame.draw.circle(surface=surface, pygame.draw.circle(surface=surface,
color=self.__color, color=self.__color,
center=self.__center, center=self.__bounding_box.center,
radius=self.__radius) radius=self.__bounding_box.width*0.5)
def get_position(self) -> tuple: def get_position(self) -> tuple:
return self.__center return self.__bounding_box.center
def get_radius(self) -> int|float: def get_radius(self) -> int|float:
return self.__radius return self.__bounding_box.width*0.5
def get_color(self) -> tuple: def get_color(self) -> tuple:
return self.__color return self.__color
def get_bounding_boxes(self) -> list[pygame.rect.Rect]:
return [self.__bounding_box]

View File

@ -18,4 +18,7 @@ class Wall(GameObject):
def draw(self, surface): def draw(self, surface):
for wall in self.__walls: for wall in self.__walls:
pygame.draw.rect(surface, self.__color, wall) pygame.draw.rect(surface, self.__color, wall)
def get_bounding_boxes(self):
return self.__walls