def move(self, toctm: Tile, tile_to_move: Tile) -> bool: ''' Виконує хід (не бій) шашкою, що знаходиться на toctm (Tile Of Checker To Move) і поміщає її на tile_to_move. Параметри: toctm: клітинка, на якій знаходиться шашка, яка повинна виконувати хід tile_to_move: клітинка, на яку ця шашка має стати Повертає: True: хід виконано None: хід не виконано (нелегітимний) ''' checker_to_move = self.checker_on_tile(toctm)[1] if isinstance(checker_to_move, Queen): if toctm.on_same_diagonal(tile_to_move): diag = tile_to_move.diagonal_unit(toctm) tile_to_check = toctm + diag while (not tile_to_check.equals(tile_to_move) ) and self.checker_on_tile(tile_to_check) == [0]: tile_to_check += diag if tile_to_check.equals(tile_to_move): checker_to_move.tile = tile_to_move self.premove() return True else: pos = False for tile_ in toctm.all_adjacent(self.player_to_move): if tile_.equals(tile_to_move): pos = True break if not pos: return None if self.checker_on_tile(tile_to_move) == [0]: checker_to_move.tile = tile_to_move if checker_to_move.tile.y == PROMOTIONS[self.player_to_move]: checker_to_move = self.promote(checker_to_move) self.premove() return True
def take(self, toctm: Tile, tile_to_move: Tile) -> bool: ''' Виконує бій шашкою, що знаходиться на toctm (Tile Of Checker To Move) і поміщає її на tile_to_move. Параметри: toctm: клітинка, на якій знаходиться шашка, яка повинна виконувати бій tile_to_move: клітинка, на яку ця шашка має стати Повертає: True: бій виконано успішно і можливий ще один бій False: бій виконано успішно і ще один бій неможливий None: бій не виконано (неправильно обрана клітинка, нема кого бити і т.п.) ''' if self.take_possible(): if self.checker_on_tile(tile_to_move) != [0]: return None checker_to_move = self.checker_on_tile(toctm)[1] if isinstance(checker_to_move, Queen): if toctm.on_same_diagonal(tile_to_move): diag = tile_to_move.diagonal_unit(toctm) victim_tile = None test_tile = toctm + diag while not test_tile.equals(tile_to_move): if self.checker_on_tile( test_tile)[0] == self.player_to_move: return None if self.checker_on_tile( test_tile)[0] == -self.player_to_move: if victim_tile != None: return None else: victim_tile = test_tile test_tile += diag if victim_tile == None: return None if not self.queens_take_possible(tile_to_move, victim_tile): tile_to_test = victim_tile + diag while self.checker_on_tile(tile_to_test) == [ 0 ] and tile_to_test.is_valid(): if self.queens_take_possible( tile_to_test, victim_tile): return None tile_to_test += diag checker_to_move.tile = tile_to_move self.board[-self.player_to_move].remove( self.checker_on_tile(victim_tile)[1]) self.possible_attacker = checker_to_move if not self.take_possible(): self.premove() return False return True else: if not self.possible_attacker == None: if not checker_to_move.tile.equals( self.possible_attacker.tile): return None if not toctm.on_same_diagonal(tile_to_move): return None diag = tile_to_move.diagonal_unit(toctm) if not (toctm + diag * 2).equals(tile_to_move): return None if self.checker_on_tile(toctm + diag)[0] == -self.player_to_move: checker_to_move.tile = tile_to_move if checker_to_move.tile.y == PROMOTIONS[ self.player_to_move]: checker_to_move = self.promote(checker_to_move) self.board[-self.player_to_move].remove( self.checker_on_tile(toctm + diag)[1]) self.possible_attacker = checker_to_move if not self.take_possible(): self.premove() return False return True