Validar Tablero de Ajedrez


Descripción

Podemos representar un tablero de ajedrez usando un diccionario en dónde las claves representen las coordenadas del tablero y los valores la pieza que está en esa posición, por ejemplo el siguiente diccionario

{'1h': 'bking', '6c': 'wqueen', '2g': 'bbishop', '5h': 'bqueen', '3e': 'wking'}

Indicaría que en el cuadro h1 está el rey negro, en el cuadro 6c la reyna blanca, etc.

Escribe una función llamada isValidChessBoard la cual toma como argumento un diccionario y devuelva True o False dependiendo si el diccionario representa un estado válido de un tablero de ajedrez, de acuerdo a las siguientes reglas.

Un tablero válido debe tener exactamente un rey negro (bking) y exactamente un rey blanco (wking). Cada jugador puede tener un máximo de 16 piezas, de ellas máximo 8 peones, y todas las piezas deben estar en un cuadro válido, los cuales van de ‘1a’ a ‘8h’; por ejemplo, una pieza no puede estar en un cuadro como ‘9z’.

Los nombres de las piezas comienzas con ‘w’ para blancas y ‘b’ para negras, y continúan con el nombre de la pieza, ‘pawn’ (peón), ‘knigh’ (caballo), ‘bishop’ (alfil), ‘rook’ (torre), ‘queen’ (reyna) y ‘king’ (rey).

Ejemplo de Ejecución:

board = {'1h': 'bking', '6c': 'wqueen', '2g': 'bbishop', '5h': 'bqueen', '3e': 'wking'}
print(isValidChessBoard(board))
True

Solución

Mostrar solución
MAX_KINGS = 1
MAX_PAWNS = 8
MIN_ROW = 1
MAX_ROW = 8
MIN_COL = 'a'
MAX_COL = 'h'

def defineAllPieces():
  colors = ['w', 'b']
  pieces = ['king', 'queen', 'rook', 'bishop', 'knight', 'pawn']
  all_pieces = []

  for c in colors:
    for p in pieces:
      all_pieces.append(c + p)

  return all_pieces


def isValidChessBoard(board):
  all_pieces = defineAllPieces()

  whitePawns = 0
  blackPawns = 0
  whiteKings = 0
  blackKings = 0

  for square, piece in board.items():
    row = int(square[0])
    col = square[1].lower()

    # Validar cuadro
    if row < MIN_ROW or row > MAX_ROW or col < MIN_COL or col > MAX_COL:
      return False

    # Validar pieza
    if piece.lower() not in all_pieces:
      return False

    # Contar reyes
    if piece == 'wking':
      whiteKings += 1
    elif piece == 'bking':
      blackKings += 1

    # Validar cantidad de reyes
    if whiteKings > MAX_KINGS or blackKings > MAX_KINGS:
      return False

    # Contar peones
    if piece == 'wpawn':
      whitePawns += 1
    elif piece == 'bpawn':
      blackPawns += 1

    # Validar cantidad de peones
    if whitePawns > MAX_PAWNS or blackPawns > MAX_PAWNS:
      return False

  # Si todos los elementos pasan todas las validaciones, el tablero es válido
  return True

# Tablero válido
board = {'1h': 'bking', '6c': 'wqueen', '2g': 'bbishop', '5h': 'bqueen', '3e': 'wking'}
print(isValidChessBoard(board))

# Número de casilla no válido
board = {'9a': 'bking'}
print(isValidChessBoard(board))

# Letra de casilla no válida
board = {'1z': 'wking'}
print(isValidChessBoard(board))

# Color de pieza no válido
board = {'1a': 'rking'}
print(isValidChessBoard(board))

# Nombre de pieza no válido
board = {'1a': 'wqing'}
print(isValidChessBoard(board))

# Exceso de reyes
board = {'1a': 'bking', '2a': 'bking'}
print(isValidChessBoard(board))

# Exceso de peones
board = {'2a': 'wpawn', '2b': 'wpawn', '2c': 'wpawn', '2d': 'wpawn',
         '2e': 'wpawn', '2f': 'wpawn', '2g': 'wpawn', '2h': 'wpawn',
         '1a': 'wpawn'}
print(isValidChessBoard(board))

Probar solución en Google Colab

Fuente del ejercicio: https://automatetheboringstuff.com/2e/chapter5/#calibre_link-204