Tauler d’escacs

El joc d’escacs es juga en un tauler quadrat de 8x8 caselles, identificades mitjançant un parell de coordenades únic: una lletra i un número. Les columnes estan etiquetades de la a fins a la h d’esquerra a dreta. Les files es numeren de 1 a 8 de baix a dalt. Farem servir strings per representar cada casella, per exemple l’alfil blanc en la figura de sota es troba en la casella 'c3', i en les caselles 'a8' i 'g8' hi són les dues torres negres. Cada tipus de peça és identificada per la seva primera lletra (rei = 'R', dama = 'D', torre = 'T', alfil = 'A', cavall = 'C' i peó = 'P'). Les peces blanques es designen amb lletres majúscules ('RDTACP'), mentre que les negres, en minúscules ('rdtacp').

Per representar la distribució de les peces sobre el tauler farem servir un diccionari on la clau és un tipus de peça, i el valor la llista de caselles ocupades per peces d’aquest tipus. Per exemple, la clau/valor 't':['a8','g8'] indica que hi ha dues torres negres i que són a les caselles 'a8' i 'g8'.

Per tant, el següent tauler d’escacs:

es representarà amb el diccionari:

CHESS

{ 'R': ['g1'],                 # el rei blanc és a 'g1'
  'T': ['e7', 'f7'],           # les dues torres blanques
  'A': ['c3'],  'C': ['h5'],   # alfil i cavall blancs
  'P': ['a2', 'b2', 'c2', 'f2', 'g2', 'h2'],   # peons blancs
  'r': ['h8'],                 # el rei negre és a 'h8'
  't': ['a8', 'g8'],           # les dues torres negres
  'a': ['d2'],                 # l'alfil negre
  'p': ['c6', 'd6', 'a7', 'b7', 'h7'] }        # peons negres

Per un altra banda, guardem la llista de les caselles a les quals es pot moure cada peça del tauler. Això ho fem en un altre diccionari on la clau és la casella d’una peça, i el valor la llista de caselles on la peça es pot moure. Per exemple, en 'c3' hi és l’alfil blanc que es pot moure a les caselles de la llista ['d4','e5','f6','g7','h8','d2','b4','a5'], en color verd a la figura. Donat que una d’elles és la casella del rei negre, en 'h8', aquest es troba en situació d’escac. Pel que fa al peó blanc en 'c2', com que no es pot moure enlloc, al diccionari trobarem la clau/valor 'c2':[ ].

Volem dissenyar una funció escac() tal que donat el caràcter d’un dels reis ('R' o 'r'), un diccionari amb la distribució de les peces sobre el tauler i un altre diccionari amb les caselles on es pot moure cada peça com els descrits anteriorment, comprovi si hi ha escac sobre el rei donat. Si és així, retornarà la casella de la peça que fa l’escac, altrament retornarà l’string '**'.

Per implementar aquesta funció, en primer lloc, es demana implementar una funció anomenada fa_escac() tal que donat el caràcter corresponent a una peça d’escacs, un diccionari amb la distribució de les peces sobre el tauler i un altre diccionari amb les peces on es pot moure cada peça retorna un string corresponent a la posició on està la peça donada de manera que fa escac al rei de color contrari, en cas que no pugui fer escac en cap de les posicions possibles, retornarà l’string buit.

Nota

no tractarem casos d’escac fet per dues o més peces alhora.

Desa les funcions al fitxer tauler_d_escacs.py. Per exemple, les funcions han de passar els següents doctests:

>>> dpec1 = { 'R': ['f6'], 'A': ['d6','g6'], 'P': ['g7'],   # tauler amb rei, 2 alfils i un peó blancs, i
...           'r': ['h6'], 't': ['f8'] }                    #        amb rei i una torre negres
>>> dmov1 = { 'd6': ['a3','b4','c5','e7','f8','b8','c7','e5','f4','g3','h2'],  # movs. de l'alfil blanc en d6
...           'g6': ['b1','c2','d3','e4','f5','h7','e8','f7','h5'],            # movs. de l'altre alfil blanc en g6
...           'g7': ['f8', 'g8'],                                              # movs. del peó blanc en g7
...           'f6': ['e5','f5','g5','e6','e7','f7'],                           # movs. del rei blanc en f6
...           'f8': ['a8','b8','c8','d8','e8','g8','h8','f7','f6'],            # movs. de la torre negre en f8
...           'h6': ['g5','h5','g6','g7','h7'] }                               # movs. del rei negre en h6

>>> fa_escac('t', dpec1, dmov1)
'f8'
>>> fa_escac('r', dpec1, dmov1)
''
>>> escac('R', dpec1, dmov1)   # escac al rei blanc des de f8 (on és la torre negre)
'f8'
>>> escac('r', dpec1, dmov1)   # no hi ha escac al rei negre
'**'

Nota

Pots descarregar el fitxer de tests complet tauler_d_escacs.txt

Solució

El fitxer tauler_d_escacs.py conté una solució.