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: |
{ '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ó.
