Add snake control.
This commit is contained in:
parent
b354a7dd90
commit
5f411e2518
@ -1,6 +1,9 @@
|
|||||||
|
import pygame
|
||||||
|
|
||||||
|
|
||||||
class GameObject:
|
class GameObject:
|
||||||
def draw(self, surface):
|
def draw(self, surface: pygame.Surface) -> None:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
def update(self):
|
def update(self, user_input: int) -> None:
|
||||||
pass
|
pass
|
||||||
@ -3,15 +3,28 @@ import pygame
|
|||||||
|
|
||||||
class InputManager:
|
class InputManager:
|
||||||
QUIT = 0
|
QUIT = 0
|
||||||
|
IDLE = 1
|
||||||
|
LEFT = 2
|
||||||
|
RIGHT = 3
|
||||||
|
UP = 4
|
||||||
|
DOWN = 5
|
||||||
|
|
||||||
|
def __init__(self):
|
||||||
|
self.__key_map_dict = {
|
||||||
|
pygame.K_ESCAPE: InputManager.QUIT,
|
||||||
|
pygame.K_LEFT: InputManager.LEFT,
|
||||||
|
pygame.K_RIGHT: InputManager.RIGHT,
|
||||||
|
pygame.K_UP: InputManager.UP,
|
||||||
|
pygame.K_DOWN: InputManager.DOWN
|
||||||
|
}
|
||||||
|
|
||||||
def process_input(self) -> int:
|
def process_input(self) -> int:
|
||||||
last_input = None
|
last_input = InputManager.IDLE
|
||||||
|
|
||||||
for event in pygame.event.get():
|
for event in pygame.event.get():
|
||||||
if event.type == pygame.QUIT:
|
if event.type == pygame.QUIT:
|
||||||
last_input = InputManager.QUIT
|
last_input = InputManager.QUIT
|
||||||
elif event.type == pygame.KEYDOWN:
|
elif event.type == pygame.KEYDOWN:
|
||||||
if event.key == pygame.K_ESCAPE:
|
last_input = self.__key_map_dict.get(event.key, InputManager.IDLE)
|
||||||
last_input = InputManager.QUIT
|
|
||||||
|
|
||||||
return last_input
|
return last_input
|
||||||
|
|||||||
@ -11,9 +11,9 @@ def draw_all(window: Window, game_objs: list[GameObject]) -> None:
|
|||||||
window.draw_object(obj)
|
window.draw_object(obj)
|
||||||
|
|
||||||
|
|
||||||
def update_all(game_objs: list[GameObject]) -> None:
|
def update_all(game_objs: list[GameObject], user_input: int) -> None:
|
||||||
for obj in game_objs:
|
for obj in game_objs:
|
||||||
obj.update()
|
obj.update(user_input)
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
@ -33,7 +33,7 @@ if __name__ == '__main__':
|
|||||||
last_input = input_manager.process_input()
|
last_input = input_manager.process_input()
|
||||||
|
|
||||||
draw_all(window, game_objs)
|
draw_all(window, game_objs)
|
||||||
update_all(game_objs)
|
update_all(game_objs, last_input)
|
||||||
|
|
||||||
clock.tick(framerate)
|
clock.tick(framerate)
|
||||||
pygame.display.flip()
|
pygame.display.flip()
|
||||||
|
|||||||
@ -1,6 +1,7 @@
|
|||||||
import pygame
|
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
|
||||||
|
|
||||||
|
|
||||||
class Snake(GameObject):
|
class Snake(GameObject):
|
||||||
@ -10,18 +11,15 @@ class Snake(GameObject):
|
|||||||
color=color)
|
color=color)
|
||||||
for idx in range(length)]
|
for idx in range(length)]
|
||||||
|
|
||||||
|
self.__state_machine = SnakeStateMachine()
|
||||||
|
|
||||||
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) -> None:
|
def update(self, user_input: int=None) -> None:
|
||||||
head_pos = self.__segments[0].get_position()
|
self.__state_machine.update(user_input)
|
||||||
head_radius = self.__segments[0].get_radius()
|
new_head = self.__state_machine.get_state().get_next_head(self.__segments[0])
|
||||||
head_color = self.__segments[0].get_color()
|
|
||||||
|
|
||||||
new_head = SnakeSegment(center=(head_pos[0]-2*head_radius, head_pos[1]),
|
|
||||||
radius=head_radius,
|
|
||||||
color=head_color)
|
|
||||||
|
|
||||||
self.__segments.insert(0, new_head)
|
self.__segments.insert(0, new_head)
|
||||||
self.__segments.pop()
|
self.__segments.pop()
|
||||||
6
snake/snake_down_movement_state.py
Normal file
6
snake/snake_down_movement_state.py
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
from snake_state import SnakeState
|
||||||
|
|
||||||
|
|
||||||
|
class SnakeDownMovementState(SnakeState):
|
||||||
|
def _get_next_pos(self, old_pos: tuple, radius: float) -> tuple:
|
||||||
|
return (old_pos[0], old_pos[1]+2*radius)
|
||||||
6
snake/snake_left_movement_state.py
Normal file
6
snake/snake_left_movement_state.py
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
from snake_state import SnakeState
|
||||||
|
|
||||||
|
|
||||||
|
class SnakeLeftMovementState(SnakeState):
|
||||||
|
def _get_next_pos(self, old_pos: tuple, radius: float) -> tuple:
|
||||||
|
return (old_pos[0]-2*radius, old_pos[1])
|
||||||
6
snake/snake_right_movement_state.py
Normal file
6
snake/snake_right_movement_state.py
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
from snake_state import SnakeState
|
||||||
|
|
||||||
|
|
||||||
|
class SnakeRightMovementState(SnakeState):
|
||||||
|
def _get_next_pos(self, old_pos: tuple, radius: float) -> tuple:
|
||||||
|
return (old_pos[0]+2*radius, old_pos[1])
|
||||||
11
snake/snake_state.py
Normal file
11
snake/snake_state.py
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
from snake_segment import SnakeSegment
|
||||||
|
|
||||||
|
|
||||||
|
class SnakeState:
|
||||||
|
def _get_next_pos(self, old_pos: tuple, radius:float) -> tuple:
|
||||||
|
pass
|
||||||
|
|
||||||
|
def get_next_head(self, old_head: SnakeSegment) -> SnakeSegment:
|
||||||
|
return SnakeSegment(center=self._get_next_pos(old_head.get_position(), old_head.get_radius()),
|
||||||
|
radius=old_head.get_radius(),
|
||||||
|
color=old_head.get_color())
|
||||||
25
snake/snake_state_machine.py
Normal file
25
snake/snake_state_machine.py
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
from snake_up_movement_state import SnakeUpMovementState
|
||||||
|
from snake_down_movement_state import SnakeDownMovementState
|
||||||
|
from snake_left_movement_state import SnakeLeftMovementState
|
||||||
|
from snake_right_movement_state import SnakeRightMovementState
|
||||||
|
from input_manager import InputManager
|
||||||
|
|
||||||
|
|
||||||
|
class SnakeStateMachine:
|
||||||
|
def __init__(self):
|
||||||
|
self.__state = SnakeLeftMovementState()
|
||||||
|
|
||||||
|
self.__next_state_dict = {
|
||||||
|
InputManager.UP: SnakeUpMovementState(),
|
||||||
|
InputManager.DOWN: SnakeDownMovementState(),
|
||||||
|
InputManager.LEFT: SnakeLeftMovementState(),
|
||||||
|
InputManager.RIGHT: SnakeRightMovementState()
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
def update(self, user_input):
|
||||||
|
self.__state = self.__next_state_dict.get(user_input, self.__state)
|
||||||
|
|
||||||
|
|
||||||
|
def get_state(self):
|
||||||
|
return self.__state
|
||||||
6
snake/snake_up_movement_state.py
Normal file
6
snake/snake_up_movement_state.py
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
from snake_state import SnakeState
|
||||||
|
|
||||||
|
|
||||||
|
class SnakeUpMovementState(SnakeState):
|
||||||
|
def _get_next_pos(self, old_pos: tuple, radius: float) -> tuple:
|
||||||
|
return (old_pos[0], old_pos[1]-2*radius)
|
||||||
Loading…
x
Reference in New Issue
Block a user