Skip to main content


ChessBoard is a Python implementation of the FIDE laws of chess.

John Eriksson
ChessBoard is a Python implementation of the FIDE laws of chess. The main goal is to implement all applicable rules in a simple, straightforward way. The intention is not to be fast but to be easy to understand and to be complete. Many other implementation has known problems with castling, stalemate or other more or less special rules.


  • 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 Forsyth-Edwards 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"


  • 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.


Home Page


ChessBoard 2.01 — 5 Dec, 2006

ChessBoard 2.0b — 28 Nov, 2006

ChessBoard 1.0 — 3 Aug, 2006

ChessBoard 2.02 — 3 Jan, 2007

ChessBoard 1.1 — 8 Aug, 2006

ChessBoard 2.03 — 7 Aug, 2007

ChessBoard 2.04 — 28 Jul, 2008

ChessBoard 2.05 — 29 Jul, 2008 account Comments

  • Ofer Shamai 2013-07-08 13:55:31


    Thank you very much for your package. It is very helpful!

    However, I did find some minor issues.


    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')




    Traceback (most recent call last):

    File "C:\Python27\lib\", line 400, in run

    exec cmd in globals, locals

    File "<module1>", line 41, in <module>


    File "file-name", line 930, in getFEN

    if turn == "b" and (self._board[y][x-1] == '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][x-1] == 'p' or self._board[y][x+1] == 'p'):

    ep = "%s%s" % ( ("abcdefgh")[x], ("87654321")[y+1])

    elif turn == "w" and (self._board[y][x-1] == 'P' or self._board[y][x+1] == 'P'):

    ep = "%s%s" % ( ("abcdefgh")[x], ("87654321")[y-1])

    x+1 can excced 7

    Is x-1 safe when moving on the first rank?)

    2) Small documentation slip:

    In HowToUseChessBoard.txt, instead of:


    Returns the latest move as Algebraic chess notation.

    Returns None if no moves has been made.

    format can be:


    ChessBoard.SAN (default)


    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]), 8-int(square[1]))

    def numToalg(self,squareAsNum):

    return 'abcdefgh'[squareAsNum[0]] + str(8-squareAsNum[1])

    def getNormalValidMoves(self,algebraicLocation):

    return [self.numToalg(num2) for num2 in self.getValidMoves(self.algToNum(algebraicLocation))]