Как правильно печатать битборды в Python - PullRequest
0 голосов
/ 12 февраля 2019

Я хочу запрограммировать шахматный движок с использованием битбордов.Поскольку я не очень знаком с битбордами, я сначала пытаюсь понять, как их использовать.Я написал небольшую функцию, которая должна печатать на доске.Вот где я наткнулся на проблему.Кажется, моя функция правильно распечатывает ранги, но неправильно распечатывает файлы.

def print_bitboard(bitboard):
    board = str(bin(bitboard)).zfill(64)
    for i in range(8):
    print(board[8*i+0] + " " + board[8*i+1] + " " + board[8*i+2] + " " + 
          board[8*i+3] + " " + board[8*i+4] + " " + board[8*i+5] + " " + 
          board[8*i+6] + " " + board[8*i+7])


bitboard1 = 
int("0000000000000000000000000000000000000000000000001111111100000000", 2)  
# 2nd rank
bitboard2 = 
int("1000000010000000100000001000000010000000100000001000000010000000", 2)  
# file A

print_bitboard(bitboard1)
print("")
print_bitboard(bitboard2)

Результат:

0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 b
1 1 1 1 1 1 1 1 
0 0 0 0 0 0 0 0

0 b 1 0 0 0 0 0     ----> wrong, should be: 1 0 0 0 0 0 0 0
0 0 1 0 0 0 0 0                             1 0 0 0 0 0 0 0
0 0 1 0 0 0 0 0                             1 0 0 0 0 0 0 0
0 0 1 0 0 0 0 0                             1 0 0 0 0 0 0 0
0 0 1 0 0 0 0 0                             1 0 0 0 0 0 0 0
0 0 1 0 0 0 0 0                             1 0 0 0 0 0 0 0
0 0 1 0 0 0 0 0                             1 0 0 0 0 0 0 0
0 0 1 0 0 0 0 0                             1 0 0 0 0 0 0 0

Ответы [ 2 ]

0 голосов
/ 13 февраля 2019

Вы можете использовать wrap для разделения строки на список подстрок и join для объединения созданных списков:

from textwrap import wrap

                                       # |                           |
def print_bitboard(board):             # v split for spaces          v split for newlines
    print('\n'.join([' '.join(wrap(line, 1)) for line in wrap(board, 8)]))

bitboard1 = '0000000000000000000000000000000000000000000000001111111100000000'
print_bitboard(bitboard1)

# 0 0 0 0 0 0 0 0
# 0 0 0 0 0 0 0 0
# 0 0 0 0 0 0 0 0
# 0 0 0 0 0 0 0 0
# 0 0 0 0 0 0 0 0
# 0 0 0 0 0 0 0 0
# 1 1 1 1 1 1 1 1
# 0 0 0 0 0 0 0 0

bitboard2 = '1000000010000000100000001000000010000000100000001000000010000000'
print_bitboard(bitboard2)

# 1 0 0 0 0 0 0 0
# 1 0 0 0 0 0 0 0
# 1 0 0 0 0 0 0 0
# 1 0 0 0 0 0 0 0
# 1 0 0 0 0 0 0 0
# 1 0 0 0 0 0 0 0
# 1 0 0 0 0 0 0 0
# 1 0 0 0 0 0 0 0
0 голосов
/ 12 февраля 2019

Функция bin всегда возвращает допустимое представление Python двоичного литерала, начинающегося с 0b.Если вы не хотите этого, вы можете использовать метод str.format вместо:

board = '{:064b}'.format(bitboard)
...