I'm playing around with some python chess code, its for fun.
However i have difficulty in using the board.attackers function.
I'm not sure what it accepts
This code below makes use of the chess lib described here:
http://python-chess.readthedocs.io/en/latest/core.html
in the docs example code exists where they put in chess.F3 though i need some conversion from move to chess.xx i guess?.
def staticAnalysis(board, move, my_color):
score = random.random()
board.push(move)
for (piece, value) in [(chess.PAWN, 1),
(chess.BISHOP, 4),
(chess.KING, 0),
(chess.QUEEN, 10),
(chess.KNIGHT, 5),
(chess.ROOK, 3)]:
score += len(board.pieces(piece, my_color)) * value
score -= len(board.pieces(piece, not my_color)) * value
score += 100 if board.is_checkmate() else 0
score += 10 if board.is_capture(move) else 0
# to get proposed destination of the move, removes piece, thus Ph1 becomes h1
square = str(move)[-2:]
# but its not accepted ?.. what can be used to do achieve this ?.
myAttackers = board.attackers(not my_color, square)
score +=len(attackers)*-2
return score
For us to have a better idea, you should define your functions and variables. A bit of googling found the docs here: https://python-chess.readthedocs.io/en/latest/
Based on this snippet in the docs attackers = board.attackers(chess.WHITE, chess.F3)
, it looks like you need to pass the color and square not as a string but as the chess.
function.
Ok its more simple then i thought..
print(chess.B2)
#equals
print ((ord("B")-ord("A"))+(2-1)*8)
There are built-in methods that take care of converting between a square's str
name and int
value already:
>>> chess.square_name(21)
'f3'
>>> chess.parse_square('f3')
21
However, your solution using ord()
is technically more efficient as it runs in O(1) whereas chess.parse_square
calls SQUARES.index(...)
and runs in O(n). But no need to reinvent the wheel here.
For more context, chess.Square
is simply an alias for a Python int
. Here is the actual source code where it's defined:
Square = int
SQUARES = [
A1, B1, C1, D1, E1, F1, G1, H1,
A2, B2, C2, D2, E2, F2, G2, H2,
A3, B3, C3, D3, E3, F3, G3, H3,
A4, B4, C4, D4, E4, F4, G4, H4,
A5, B5, C5, D5, E5, F5, G5, H5,
A6, B6, C6, D6, E6, F6, G6, H6,
A7, B7, C7, D7, E7, F7, G7, H7,
A8, B8, C8, D8, E8, F8, G8, H8,
] = range(64)
This is shorthand for chess.A1
= 0
, chess.B1
= 1
, ... , chess.H8
= 63
.
In your code, you are providing attackers()
with a string (because you define square = str(move)[-2:]
), not a chess.Square
(an int
), which is causing your error.
You can replace the line where you define square
with this, so its type is actually chess.Square
(here I know the type of move
is chess.Move
since you use board.push(move)
earlier):
square = move.to_square # a ``chess.Square``
On a side note, I noticed your piece values look a bit off. Maybe you wanted them like this:
[(chess.PAWN, 1),
(chess.BISHOP, 3),
(chess.KING, 0),
(chess.QUEEN, 9),
(chess.KNIGHT, 3),
(chess.ROOK, 5)]
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.