39 lines
1.3 KiB
Python
39 lines
1.3 KiB
Python
from __future__ import annotations
|
|
|
|
from typing import Tuple
|
|
|
|
from catan.data import Resource
|
|
from catan.game import Game
|
|
|
|
|
|
def find_initial_spot(game: Game) -> Tuple[int, int]:
|
|
board = game.board
|
|
for corner_id in sorted(board.corners, key=board.corner_label):
|
|
if not board.can_place_settlement(corner_id, True):
|
|
continue
|
|
edges = sorted(board.corners[corner_id].edges, key=board.edge_label)
|
|
for edge_id in edges:
|
|
if board.edges[edge_id].owner:
|
|
continue
|
|
return board.corner_label(corner_id), board.edge_label(edge_id)
|
|
raise RuntimeError("No available initial placement")
|
|
|
|
|
|
def find_connected_edge(game: Game) -> int:
|
|
player = game.current_player
|
|
board = game.board
|
|
for edge_id, edge in board.edges.items():
|
|
if edge.owner:
|
|
continue
|
|
if game._road_connection_valid(player, edge): # noqa: SLF001 - test helper
|
|
return board.edge_label(edge_id)
|
|
raise RuntimeError("No valid edge to extend road network")
|
|
|
|
|
|
def grant_resources(game: Game, player_name: str, amount: int = 5) -> None:
|
|
player = game.player_by_name(player_name)
|
|
for resource in Resource:
|
|
if resource == Resource.DESERT:
|
|
continue
|
|
player.resources[resource] = amount
|