Strategická: Pár komentářů
This commit is contained in:
parent
601fa275bc
commit
fd8c8ed082
1 changed files with 27 additions and 10 deletions
|
@ -17,9 +17,13 @@ class Direction(enum.Enum):
|
||||||
STAY = None
|
STAY = None
|
||||||
|
|
||||||
def combine(self, other) -> Direction:
|
def combine(self, other) -> Direction:
|
||||||
return Direction((self.value + other.value)%4)
|
"""Rotate by another direction."""
|
||||||
|
|
||||||
|
return Direction((self.value + other.value) % 4)
|
||||||
|
|
||||||
def invert(self) -> Direction:
|
def invert(self) -> Direction:
|
||||||
|
"""Get the opposite direction."""
|
||||||
|
|
||||||
if self == Direction.STAY:
|
if self == Direction.STAY:
|
||||||
return self
|
return self
|
||||||
return self.combine(Direction.DOWN)
|
return self.combine(Direction.DOWN)
|
||||||
|
@ -29,7 +33,7 @@ class Direction(enum.Enum):
|
||||||
|
|
||||||
|
|
||||||
class Team:
|
class Team:
|
||||||
home: 'Field'
|
home: Field
|
||||||
|
|
||||||
def __init__(self, id: int, is_me: bool) -> None:
|
def __init__(self, id: int, is_me: bool) -> None:
|
||||||
self.id: int = id
|
self.id: int = id
|
||||||
|
@ -74,6 +78,8 @@ class Field:
|
||||||
return hash((self.i, self.j))
|
return hash((self.i, self.j))
|
||||||
|
|
||||||
def get_neighbour_field(self, action: Direction) -> Field:
|
def get_neighbour_field(self, action: Direction) -> Field:
|
||||||
|
"""Get the next field in the given direction."""
|
||||||
|
|
||||||
if action == Direction.UP:
|
if action == Direction.UP:
|
||||||
neighbour_i = self.i - 1
|
neighbour_i = self.i - 1
|
||||||
neighbour_j = self.j
|
neighbour_j = self.j
|
||||||
|
@ -95,7 +101,7 @@ class Field:
|
||||||
return state.world[neighbour_i][neighbour_j]
|
return state.world[neighbour_i][neighbour_j]
|
||||||
|
|
||||||
def is_accessible(self, team: Team) -> bool:
|
def is_accessible(self, team: Team) -> bool:
|
||||||
"""If this field is accessible for the given team."""
|
"""Jestli daný tým může vstoupit na políčko."""
|
||||||
|
|
||||||
if self.hill:
|
if self.hill:
|
||||||
return False
|
return False
|
||||||
|
@ -104,11 +110,16 @@ class Field:
|
||||||
return False
|
return False
|
||||||
return True
|
return True
|
||||||
|
|
||||||
# Celý stav hry včetně parsování a vypisování
|
|
||||||
|
|
||||||
class State:
|
class State:
|
||||||
|
"""The entire game state.
|
||||||
|
|
||||||
|
Also contains methods for parsing and actions submission.
|
||||||
|
"""
|
||||||
|
|
||||||
def __init__(self, state: dict) -> None:
|
def __init__(self, state: dict) -> None:
|
||||||
self.teams = [Team(i, i==state["team_id"]) for i in range(state["teams_count"])]
|
self.teams = [Team(i, i == state["team_id"])
|
||||||
|
for i in range(state["teams_count"])]
|
||||||
self.world = self._parse_world(state["state"]["world"])
|
self.world = self._parse_world(state["state"]["world"])
|
||||||
self.my_team: Team = self.teams[state["team_id"]]
|
self.my_team: Team = self.teams[state["team_id"]]
|
||||||
self.round_number: int = state["round"]
|
self.round_number: int = state["round"]
|
||||||
|
@ -150,8 +161,9 @@ class State:
|
||||||
fields.append(fields_row)
|
fields.append(fields_row)
|
||||||
return fields
|
return fields
|
||||||
|
|
||||||
|
|
||||||
def build_turn(self) -> dict:
|
def build_turn(self) -> dict:
|
||||||
|
"""Build a dictionary with member actions."""
|
||||||
|
|
||||||
for team in self.teams:
|
for team in self.teams:
|
||||||
if not team.is_me:
|
if not team.is_me:
|
||||||
for member in team.members:
|
for member in team.members:
|
||||||
|
@ -164,10 +176,12 @@ class State:
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
state: State
|
state: State
|
||||||
|
|
||||||
# Algoritmy
|
# Algoritmy
|
||||||
|
|
||||||
|
|
||||||
def find_fields(predicate: Callable[[Field], bool]) -> List[Field]:
|
def find_fields(predicate: Callable[[Field], bool]) -> List[Field]:
|
||||||
"""Find all fields that satisfy the given predicate."""
|
"""Find all fields that satisfy the given predicate."""
|
||||||
|
|
||||||
|
@ -203,18 +217,21 @@ def pathfind(member: Member, goal: Field) -> Direction:
|
||||||
explored.add(neighbour)
|
explored.add(neighbour)
|
||||||
return Direction.STAY
|
return Direction.STAY
|
||||||
|
|
||||||
# main (zde doplňte kód)
|
|
||||||
|
# Strategie
|
||||||
|
|
||||||
|
|
||||||
def main() -> None:
|
def main() -> None:
|
||||||
global state
|
global state
|
||||||
state = State(json.loads(sys.stdin.read()))
|
state = State(json.loads(sys.stdin.read()))
|
||||||
|
|
||||||
# TODO: set actions for all yours members
|
# TODO: zde doplňte svou herní strategii
|
||||||
# example: all members go up
|
# příklad: všechny vojáky posílám nahoru
|
||||||
for member in state.teams[1].members:
|
for member in state.teams[state.my_team].members:
|
||||||
member.action = Direction.UP
|
member.action = Direction.UP
|
||||||
|
|
||||||
print(json.dumps(state.build_turn()))
|
print(json.dumps(state.build_turn()))
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
main()
|
main()
|
||||||
|
|
Loading…
Reference in a new issue