implement MoveGenerator state machine
This commit is contained in:
parent
3f7de52e8c
commit
a2ac1bcb39
|
@ -8,6 +8,8 @@ def main():
|
||||||
blunder_evaluator = BlunderEvaluator()
|
blunder_evaluator = BlunderEvaluator()
|
||||||
move_generator = MoveGenerator(blunder_evaluator)
|
move_generator = MoveGenerator(blunder_evaluator)
|
||||||
reader = BoardReader(move_generator)
|
reader = BoardReader(move_generator)
|
||||||
|
reader.scan()
|
||||||
|
reader.print()
|
||||||
while True:
|
while True:
|
||||||
reader.scan()
|
reader.scan()
|
||||||
sleep(0.1)
|
sleep(0.1)
|
||||||
|
|
|
@ -1,18 +1,92 @@
|
||||||
from blunderboard.blunderevaluator import BlunderEvaluator
|
from blunderboard.blunderevaluator import BlunderEvaluator
|
||||||
|
|
||||||
|
|
||||||
class MoveGenerator:
|
def coords_to_field(row: int, column: int):
|
||||||
columns = "abcdefgh"
|
columns = "abcdefgh"
|
||||||
|
return "%c%d" % (columns[column], row + 1)
|
||||||
|
|
||||||
|
|
||||||
|
class MoveGenerator:
|
||||||
def __init__(self, blunder_evaluator: BlunderEvaluator):
|
def __init__(self, blunder_evaluator: BlunderEvaluator):
|
||||||
self.blunder_evaluator = blunder_evaluator
|
self.state: State = InitState(blunder_evaluator)
|
||||||
|
|
||||||
def reset(self) -> None:
|
def reset(self) -> None:
|
||||||
print("reset")
|
print("reset")
|
||||||
self.blunder_evaluator.reset()
|
self.state = self.state.reset()
|
||||||
|
|
||||||
def put(self, row: int, column: int) -> None:
|
def put(self, row: int, column: int) -> None:
|
||||||
print("put %c%d" % (self.columns[column], row + 1))
|
print("put %s" % coords_to_field(row, column))
|
||||||
|
self.state = self.state.put(row, column)
|
||||||
|
|
||||||
def take(self, row: int, column: int) -> None:
|
def take(self, row: int, column: int) -> None:
|
||||||
print("take %c%d" % (self.columns[column], row + 1))
|
print("take %s" % coords_to_field(row, column))
|
||||||
|
self.state = self.state.take(row, column)
|
||||||
|
|
||||||
|
|
||||||
|
class State:
|
||||||
|
def __init__(self, blunder_evaluator: BlunderEvaluator):
|
||||||
|
self.blunder_evaluator = blunder_evaluator
|
||||||
|
|
||||||
|
def reset(self) -> "State":
|
||||||
|
self.blunder_evaluator.reset()
|
||||||
|
return InitState(self.blunder_evaluator)
|
||||||
|
|
||||||
|
def put(self, row: int, column: int) -> "State":
|
||||||
|
print("ignored invalid put")
|
||||||
|
return self
|
||||||
|
|
||||||
|
def take(self, row: int, column: int) -> "State":
|
||||||
|
print("ignored invalid take")
|
||||||
|
return self
|
||||||
|
|
||||||
|
|
||||||
|
class InitState(State):
|
||||||
|
def reset(self) -> State:
|
||||||
|
super().reset()
|
||||||
|
return self
|
||||||
|
|
||||||
|
def take(self, row: int, column: int) -> State:
|
||||||
|
return TakeState(self.blunder_evaluator, coords_to_field(row, column))
|
||||||
|
|
||||||
|
|
||||||
|
class TakeState(State):
|
||||||
|
def __init__(self, blunder_evaluator: BlunderEvaluator, from_field: str):
|
||||||
|
super().__init__(blunder_evaluator)
|
||||||
|
self.from_field = from_field
|
||||||
|
|
||||||
|
def put(self, row: int, column: int) -> State:
|
||||||
|
to_field = coords_to_field(row, column)
|
||||||
|
if self.from_field == to_field:
|
||||||
|
print("ignored self-move")
|
||||||
|
return InitState(self.blunder_evaluator)
|
||||||
|
move = self.from_field + to_field
|
||||||
|
print("move %s" % move)
|
||||||
|
self.blunder_evaluator.move(move)
|
||||||
|
return InitState(self.blunder_evaluator)
|
||||||
|
|
||||||
|
def take(self, row: int, column: int) -> State:
|
||||||
|
return TakeTakeState(
|
||||||
|
self.blunder_evaluator, self.from_field, coords_to_field(row, column)
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
class TakeTakeState(State):
|
||||||
|
def __init__(
|
||||||
|
self, blunder_evaluator: BlunderEvaluator, from_field: str, to_field: str
|
||||||
|
):
|
||||||
|
super().__init__(blunder_evaluator)
|
||||||
|
self.from_field = from_field
|
||||||
|
self.to_field = to_field
|
||||||
|
|
||||||
|
def put(self, row: int, column: int) -> State:
|
||||||
|
field = coords_to_field(row, column)
|
||||||
|
if self.to_field == field:
|
||||||
|
move = self.from_field + field
|
||||||
|
elif self.from_field == field:
|
||||||
|
move = self.to_field + field
|
||||||
|
else:
|
||||||
|
print("ignored invalid put")
|
||||||
|
return self
|
||||||
|
print("move %s" % move)
|
||||||
|
self.blunder_evaluator.move(move)
|
||||||
|
return InitState(self.blunder_evaluator)
|
||||||
|
|
Loading…
Reference in a new issue