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))
Fuente del ejercicio: https://automatetheboringstuff.com/2e/chapter5/#calibre_link-204