feat(game): add rotation direction

style: change docstrings
This commit is contained in:
Kristofers Solo 2024-01-04 17:41:43 +02:00
parent b4157ef8b0
commit 1ead412528
5 changed files with 43 additions and 14 deletions

View File

@ -1,6 +1,6 @@
import numpy as np import numpy as np
import pygame import pygame
from utils import CONFIG, Size from utils import CONFIG, Rotation, Size
class Block(pygame.sprite.Sprite): class Block(pygame.sprite.Sprite):
@ -60,17 +60,18 @@ class Block(pygame.sprite.Sprite):
""" """
return y >= CONFIG.game.rows or (y >= 0 and field[y, int(self.pos.x)]) return y >= CONFIG.game.rows or (y >= 0 and field[y, int(self.pos.x)])
def rotate(self, pivot: pygame.Vector2) -> pygame.Vector2: def rotate(self, pivot: pygame.Vector2, rotation: Rotation) -> pygame.Vector2:
""" """
Rotates the block around a given pivot point. Rotates the block around a given pivot point.
Args: Args:
pivot: The pivot point for rotation. pivot: The pivot point for rotation.
rotation: The rotation direction.
Returns: Returns:
The new position of the block after rotation. The new position of the block after rotation.
""" """
return pivot + (self.pos - pivot).rotate(90) return pivot + (self.pos - pivot).rotate(rotation.value)
def _initialize_image(self, color: str) -> None: def _initialize_image(self, color: str) -> None:
""" """

View File

@ -2,7 +2,7 @@ from typing import Callable, Optional
import numpy as np import numpy as np
import pygame import pygame
from utils import CONFIG, Direction, Field, Figure from utils import CONFIG, Direction, Field, Figure, Rotation
from .block import Block from .block import Block
from .log import log from .log import log
@ -287,9 +287,14 @@ class Game:
self.surface.fill(CONFIG.colors.bg_float) self.surface.fill(CONFIG.colors.bg_float)
def _handle_movement_keys(self, keys: list[bool]) -> None: def _handle_movement_keys(self, keys: list[bool]) -> None:
"""Handle movement keys [K_LEFT, K_RIGHT, K_a, K_d, K_h, K_l].""" """
left_keys = keys[pygame.K_LEFT] or keys[pygame.K_a] or keys[pygame.K_h] Handle movement keys.
right_keys = keys[pygame.K_RIGHT] or keys[pygame.K_d] or keys[pygame.K_l]
Move right [K_d, K_l].
Move left [K_a, K_h].
"""
right_keys = keys[pygame.K_d] or keys[pygame.K_l]
left_keys = keys[pygame.K_a] or keys[pygame.K_h]
if not self.timers.horizontal.active: if not self.timers.horizontal.active:
if left_keys: if left_keys:
@ -300,18 +305,32 @@ class Game:
self.timers.horizontal.activate() self.timers.horizontal.activate()
def _handle_rotation_keys(self, keys: list[bool]) -> None: def _handle_rotation_keys(self, keys: list[bool]) -> None:
"""Handle rotation keys [K_r, K_UP, K_w, K_k].""" """
rotate_keys = ( Handle rotation keys.
Rotation clockwise [K_RIGHT, K_UP, K_r, K_w, K_k].
Rotation counter-clockwise [K_LEFT, K_e, K_i].
"""
clockwise_keys = (
keys[pygame.K_r] keys[pygame.K_r]
or keys[pygame.K_UP] or keys[pygame.K_UP]
or keys[pygame.K_w] or keys[pygame.K_w]
or keys[pygame.K_k] or keys[pygame.K_k]
or keys[pygame.K_RIGHT]
)
counter_clockwise_keys = (
keys[pygame.K_e] or keys[pygame.K_i] or keys[pygame.K_LEFT]
) )
if not self.timers.rotation.active: if not self.timers.rotation.active:
if rotate_keys: if clockwise_keys:
self.tetromino.rotate() self.tetromino.rotate()
self.timers.rotation.activate() self.timers.rotation.activate()
if counter_clockwise_keys:
self.tetromino.rotate(Rotation.COUNTER_CLOCKWISE)
self.timers.rotation.activate()
def _handle_down_key(self, keys: list[bool]) -> None: def _handle_down_key(self, keys: list[bool]) -> None:
"""Handle the down key [K_DOWN, K_s, K_j].""" """Handle the down key [K_DOWN, K_s, K_j]."""
down_keys = keys[pygame.K_DOWN] or keys[pygame.K_s] or keys[pygame.K_j] down_keys = keys[pygame.K_DOWN] or keys[pygame.K_s] or keys[pygame.K_j]

View File

@ -2,7 +2,7 @@ from typing import Callable, Optional
import numpy as np import numpy as np
import pygame import pygame
from utils import CONFIG, Direction, Figure, Size from utils import CONFIG, Direction, Figure, Rotation, Size
from .block import Block from .block import Block
from .log import log from .log import log
@ -66,11 +66,14 @@ class Tetromino:
for block in self.blocks: for block in self.blocks:
block.pos.x += direction.value block.pos.x += direction.value
def rotate(self) -> None: def rotate(self, rotation: Rotation = Rotation.CLOCKWISE) -> None:
""" """
Rotates the Tetromino clockwise. Rotates the Tetromino clockwise.
Does not rotate if the Tetromino is an O-shaped (square) figure. Does not rotate if the Tetromino is an O-shaped (square) figure.
Args:
rotation: Rotation to perform (CLOCKWISE or COUNTER_CLOCKWISE).
""" """
if self.figure == Figure.O: if self.figure == Figure.O:
return return
@ -78,7 +81,7 @@ class Tetromino:
pivot: pygame.Vector2 = self.blocks[0].pos pivot: pygame.Vector2 = self.blocks[0].pos
new_positions: list[pygame.Vector2] = [ new_positions: list[pygame.Vector2] = [
block.rotate(pivot) for block in self.blocks block.rotate(pivot, rotation) for block in self.blocks
] ]
if self._are_new_positions_valid(new_positions): if self._are_new_positions_valid(new_positions):

View File

@ -1,5 +1,5 @@
from .config import CONFIG from .config import CONFIG
from .enum import Direction, Field from .enum import Direction, Field, Rotation
from .figure import Figure, FigureConfig from .figure import Figure, FigureConfig
from .log import log from .log import log
from .path import BASE_PATH from .path import BASE_PATH
@ -14,4 +14,5 @@ __all__ = [
"FigureConfig", "FigureConfig",
"Direction", "Direction",
"Field", "Field",
"Rotation",
] ]

View File

@ -8,6 +8,11 @@ class Direction(Enum):
UP = -1 UP = -1
class Rotation(Enum):
CLOCKWISE = 90
COUNTER_CLOCKWISE = -90
class Field(Enum): class Field(Enum):
EMPTY = None EMPTY = None
FILLED = "Block" FILLED = "Block"