ChessBoard  2.01
ChessBoard is a Python implementation of the FIDE laws of chess.
John Eriksson
(wmjoers)
Features:
 The moves of the pieces
 Castling
 En passant
 Check detection
 Checkmate detection
 Stalemate detection
 Draw by the fifty moves rule detection
 Draw by the three repetitions rule detection
 Get valid locations support
 Imoprt and export of ForsythEdwards Notation strings.
 Add text moves in the AN, SAN and LAN standards.
 Export moves in the AN, SAN and LAN standards.
 Undo and Redo.
 Goto a specified move.
Unpack the source and start example with "python ChessClient.py"
Keys:
 Left  Undo last move.
 Right  Redo move.
 F  Print current board as FEN.
 A  Print all moves as Algebraic Notation.
 S  Print all moves as Standard Algebraic Notation.
 L  Print all moves as Long Algebraic Notation.
Changes
 Fixed a bug in resetBoard() and setFEN(). The game_result variable wasn't reset.
 Fixed a bug in addTextMove() that caused a crash sometimes when invalid data was entered.
 Added a new reson, AMBIGUOUS_MOVE, for text moves that could be perfomed by two different pieces.
Links
Releases
ChessBoard 2.0b — 28 Nov, 2006
ChessBoard 2.04 — 28 Jul, 2008
ChessBoard 2.05 — 29 Jul, 2008
Pygame.org account Comments

Ofer Shamai 20130708 13:55:31
Hi,
Thank you very much for your package. It is very helpful!
However, I did find some minor issues.
Ofer
ChessBoard remarks & bugs:
1) IndexError: list index out of range:
import ChessBoard
a = ChessBoard.ChessBoard()
a.setFEN('8/R7/4p1k1/8/5PK1/8/PP5P/8 w   0 1')
a.addTextMove('h2h4')
a.getFEN()
result:
Traceback (most recent call last):
File "C:\Python27\lib\bdb.py", line 400, in run
exec cmd in globals, locals
File "<module1>", line 41, in <module>
a.getFEN()
File "filename", line 930, in getFEN
if turn == "b" and (self._board[y][x1] == 'p' or self._board[y][x+1] == 'p'):
IndexError: list index out of range
(in getFEN:
if not (x == 0 and y == 0):
if turn == "b" and (self._board[y][x1] == 'p' or self._board[y][x+1] == 'p'):
ep = "%s%s" % ( ("abcdefgh")[x], ("87654321")[y+1])
elif turn == "w" and (self._board[y][x1] == 'P' or self._board[y][x+1] == 'P'):
ep = "%s%s" % ( ("abcdefgh")[x], ("87654321")[y1])
x+1 can excced 7
Is x1 safe when moving on the first rank?)
2) Small documentation slip:
In HowToUseChessBoard.txt, instead of:
chessboard.getLastTextMove(format)
Returns the latest move as Algebraic chess notation.
Returns None if no moves has been made.
format can be:
ChessBoard.AN
ChessBoard.SAN (default)
ChessBoard.AN
The valid formats are: AN, SAN, & LAN
3) I added the following functions that might be useful:
def numMoveToalg(self,move):
return ''.join([self.numToalg(square) for square in self.getLastMove()])
def algToNum(self,square):
return ('abcdefgh'.find(square[0]), 8int(square[1]))
def numToalg(self,squareAsNum):
return 'abcdefgh'[squareAsNum[0]] + str(8squareAsNum[1])
def getNormalValidMoves(self,algebraicLocation):
return [self.numToalg(num2) for num2 in self.getValidMoves(self.algToNum(algebraicLocation))]