Example #1
0
 def _move_str(self, move):
     to_sq = cshogi.move_to(move)
     move_to = KIFU_TO_SQUARE_NAMES[to_sq]
     if self.prev_move:
         if cshogi.move_to(self.prev_move) == to_sq:
             move_to = "同 "
     if not cshogi.move_is_drop(move):
         from_sq = cshogi.move_from(move)
         move_piece = cshogi.PIECE_JAPANESE_SYMBOLS[cshogi.move_from_piece_type(move)]
         if cshogi.move_is_promotion(move):
             return '{}{}成({})'.format(
                 move_to,
                 move_piece,
                 KIFU_FROM_SQUARE_NAMES[from_sq],
                 )
         else:
             return '{}{}({})'.format(
                 move_to,
                 move_piece,
                 KIFU_FROM_SQUARE_NAMES[from_sq],
                 )
     else:
         move_piece = cshogi.HAND_PIECE_JAPANESE_SYMBOLS[cshogi.move_drop_hand_piece(move)]
         return '{}{}打'.format(
             move_to,
             move_piece
             )
Example #2
0
def move_to_san(move):
    move_to = PGN_SQUARE_NAMES[cshogi.move_to(move)]

    if cshogi.move_is_drop(move):
        return PGN_HAND_PIECES[cshogi.move_drop_hand_piece(
            move)] + '@' + move_to

    move_from = PGN_SQUARE_NAMES[cshogi.move_from(move)]
    promotion = '+' if cshogi.move_is_promotion(move) else ''
    return PGN_PIECE_TYPES[cshogi.move_from_piece_type(
        move)] + move_from + move_to + promotion
def get_move_label(move, color):
    if not move_is_drop(move):
        from_sq = move_from(move)
        to_sq = move_to(move)
        if color == cshogi.WHITE:
            to_sq = 80 - to_sq
            from_sq = 80 - from_sq

        # file: 筋, rank: 段
        from_file, from_rank = divmod(from_sq, 9)
        to_file, to_rank = divmod(to_sq, 9)
        dir_file = to_file - from_file
        dir_rank = to_rank - from_rank
        if dir_rank < 0 and dir_file == 0:
            move_direction = UP
        elif dir_rank == -2 and dir_file == -1:
            move_direction = UP2_RIGHT
        elif dir_rank == -2 and dir_file == 1:
            move_direction = UP2_LEFT
        elif dir_rank < 0 and dir_file < 0:
            move_direction = UP_RIGHT
        elif dir_rank < 0 and dir_file > 0:
            move_direction = UP_LEFT
        elif dir_rank == 0 and dir_file < 0:
            move_direction = RIGHT
        elif dir_rank == 0 and dir_file > 0:
            move_direction = LEFT
        elif dir_rank > 0 and dir_file == 0:
            move_direction = DOWN
        elif dir_rank > 0 and dir_file < 0:
            move_direction = DOWN_RIGHT
        elif dir_rank > 0 and dir_file > 0:
            move_direction = DOWN_LEFT
        else:
            raise RuntimeError

        # promote
        if move_is_promotion(move):
            move_direction = MOVE_DIRECTION_PROMOTED[move_direction]

    else:
        # 持ち駒
        move_direction = len(MOVE_DIRECTION) + move_drop_hand_piece(move) - 1
        to_sq = move_to(move)
        if color == cshogi.WHITE:
            to_sq = 80 - to_sq

    # labelのmaxは27*81-1=2186
    move_label = move_direction * 81 + to_sq
    return move_label
Example #4
0
    def move(self, move, sec=0, sec_sum=0):
        m, s = divmod(math.ceil(sec), 60)
        h_sum, m_sum, s_sum = sec_to_time(sec_sum)

        if cshogi.move_is_drop(move):
            padding = '    '
        elif cshogi.move_is_promotion(move):
            padding = ''
        else:
            padding = '  '
        move_str = self._move_str(move) + padding

        self.kifu.write('{:>4} {}      ({:>2}:{:02}/{:02}:{:02}:{:02})\n'.format(
            self.move_number,
            move_str,
            m, s,
            h_sum, m_sum, s_sum))

        self.move_number += 1
        self.prev_move = move