from typing import Final

RED: Final[int]
YELLOW: Final[int]
TOTAL_INPUT_PLANES: Final[int]

class Board:
    def __init__(self, width: int, height: int) -> None: ...
    @staticmethod
    def standard() -> Board: ...
    def width(self) -> int: ...
    def height(self) -> int: ...
    def get_piece(self, col: int, row: int) -> int | None: ...
    def set_piece(self, col: int, row: int, piece: int | None) -> None: ...
    def clear(self) -> None: ...
    def is_board_full(self) -> bool: ...
    def is_column_full(self, col: int) -> bool: ...
    def column_height(self, col: int) -> int: ...
    def __str__(self) -> str: ...
    def __repr__(self) -> str: ...

class Game:
    def __init__(self, width: int, height: int) -> None: ...
    @staticmethod
    def standard() -> Game: ...
    def width(self) -> int: ...
    def height(self) -> int: ...
    def get_piece(self, col: int, row: int) -> int | None: ...
    def set_piece(self, col: int, row: int, piece: int | None) -> None: ...
    def turn(self) -> int: ...
    def is_over(self) -> bool: ...
    def legal_action_indices(self) -> list[int]: ...
    def apply_action(self, action: int) -> bool: ...
    def action_size(self) -> int: ...
    def board_shape(self) -> tuple[int, int]: ...
    def input_plane_count(self) -> int: ...
    def reward_absolute(self) -> float: ...
    def reward_from_perspective(self, perspective: int) -> float: ...
    def name(self) -> str: ...
    def outcome(self) -> GameOutcome | None: ...
    def legal_moves(self) -> list[Move]: ...
    def is_legal_move(self, move_: Move) -> bool: ...
    def make_move(self, move_: Move) -> bool: ...
    def unmake_move(self) -> bool: ...
    def board(self) -> Board: ...
    def clone(self) -> Game: ...
    def __hash__(self) -> int: ...
    def encode_game_planes(self) -> list[list[list[float]]]: ...
    def encode_board_planes(self) -> list[list[list[float]]]: ...
    def decode_action(self, action: int) -> Move | None: ...
    def __str__(self) -> str: ...
    def __repr__(self) -> str: ...

class Move:
    def __init__(self, col: int, row: int) -> None: ...
    def col(self) -> int: ...
    def row(self) -> int: ...
    def encode(self) -> int: ...
    @staticmethod
    def decode(data: int, game: Game) -> Move: ...
    def __str__(self) -> str: ...
    def __repr__(self) -> str: ...
    def __eq__(self, other: Move) -> bool: ...
    def __hash__(self) -> int: ...

class GameOutcome:
    def winner(self) -> int | None: ...
    def encode_winner_absolute(self) -> float: ...
    def encode_winner_from_perspective(self, perspective: int) -> float: ...
    def is_draw(self) -> bool: ...
    def name(self) -> str: ...
    def __str__(self) -> str: ...
    def __repr__(self) -> str: ...
    def __eq__(self, other: GameOutcome) -> bool: ...
