Considerăm poziția finală a jocului de șah în care pe tablă au rămas regina albă, regele alb și regele negru.
Vom identifica regina albă prin litera Q, regele alb prin K și regele negru prin k. Tabla de șah este formată din 64 de pătrățele dispuse într-o matrice cu opt linii și opt coloane. Coloanele matricei sunt identificate prin primele opt litere ale alfabetului (a - h), iar liniile prin primele opt numere naturale strict pozitive (1 - 8). Poziția unei piese este dată de litera corespunzătoare coloanei și numărul corespunzător liniei. De exemplu, în figura 1 regina albă se află în poziția a2, regele alb în poziția b3, iar regele negru în poziția g4. ![]() Figura 1 Definim aria de acțiune a reginei albe ca fiind totalitatea pătrățelelor de pe aceeași linie, coloană sau diagonală în care nu se află piese albe și între un astfel de pătrățel și regină nu se află nici o altă piesă. Pătrățelul în care se află regina nu face parte din aria sa de acțiune. În figura 2 este ilustrată aria de acțiune a reginei albe la un moment dat. ![]() Figura 2 Definim aria de acțiune a unui rege ca fiind totalitatea pătrățelelor alăturate (pe linie, coloană sau diagonală) care nu sunt ocupate de piese de aceeași culoare. În figura 3 este ilustrată aria de acțiune a regelui alb într-o anumită situație. ![]() Figura 3 Jucătorii vor muta alternativ; considerăm că, la început jucătorul cu piesele albe este la mutare. La un moment dat jucătorul, cu piesele albe poate muta fie regele, fie regina. Regele alb poate fi mutat în oricare dintre pătrățelele din aria sa de acțiune dacă pătrățelul respectiv nu se află în aria de acțiune a regelui negru. Regina albă poate fi mutată în oricare dintre pătrățelele din aria sa de acțiune, chiar dacă intră în aria de acțiune a regelui negru. Regele negru poate fi mutat în oricare dintre pătrățelele din aria sa de acțiune dacă, după mutare, nu ajunge în aria de acțiune a reginei albe sau a regelui alb. Dacă o piesă ajunge în poziția ocupată de o altă piesă, atunci această a doua piesă este capturată și eliminată de pe tablă. Se observă că, datorită regulilor anterioare, cei doi regi nu pot ajunge în poziții alăturate și singura piesă care poate fi capturată este regina albă. Trebuie observat faptul că regele negru nu poate ajunge lângă regele alb prin capturarea reginei deoarece, chiar dacă momentan poziția respectivă nu este în aria de acțiune a regelui alb (respectând definiția anterioară), după mutare această poziție intră în aria de acțiune datorită eliminării reginei. De exemplu, în situația din figura 4 regina nu poate fi capturată. ![]() Figura 4 Se știe că într-o situație finală de acest tip jucătorul alb nu poate pierde; mai mult, el are șanse foarte mari de câștig. Jucătorul negru pierde partida dacă se află în aria de acțiune a reginei albe și nu poate muta în nici unul dintre pătrățelele din aria sa de acțiune. Această situație se numește mat. Partida se termină la egalitate dacă regina albă este capturată sau se ajunge în situația de pat. Această situație apare atunci când regele negru nu se află în aria de acțiune a reginei albe, dar nu poate efectua nici o mutare validă. O astfel de situație este ilustrată în figura 5. ![]() Figura 5 Veți juca cu piesele albe (regele și regina) și va trebui să câștigați partida folosind un număr limitat de mutări. Mutările adversarului (regele negru) vor fi efectuate de o bibliotecă externă.
Pentru a putea folosi biblioteca va trebui să includeți în programul dumneavoastră istrucțiunea uses chess; pentru limbajul Pascal și #include "chess.h" pentru limbajul C/C++. În continuare sunt prezentate sintaxele funcțiilor și procedurilor incluse în biblioteci:
procedure Init; void Init() - trebuie apelată la începutul jocului și este folosită de către bibliotecă pentru inițializarea tablei; - întrerupe execuția programului dacă este apelată a doua oară. function MovesLeft:Integer; int MovesLeft() - returnează un număr întreg care reprezintă numărul de mutări pe care le mai aveți la dispoziție pentru a câștiga. function GetWhiteQueenPosition:string; char* GetWhiteQueenPosition() - returnează un șir care conține două caractere, primul fiind o literă care reprezintă coloana pe care se află regina albă în acel moment, iar al doilea un număr care reprezintă linia. function GetWhiteKingPosition:string; char* GetWhiteKingPosition() - returnează poziția curentă a regelui alb. function GetBlackKingPosition:string; char* GetBlackKingPosition() - returnează poziția curentă a regelui negru. procedure MoveWhiteQueen(position:string); void MoveWhiteQueen(char* position) - mută regina albă în poziția indicată de șirul position; - întrerupe execuția programului dacă:
void MoveWhiteKing(char* position) - mută regele alb în poziția indicată de șirul position; - întrerupe execuția programului dacă este verificată una dintre condițiile prezentate pentru subpragoramul anterior. procedure MoveBlackKing; void MoveWhiteKing() indică bibliotecii că se așteaptă mutarea regelui negru; - întrerupe execuția programului dacă este a doua mutare consecutivă a regelui negru sau prin mutare poate fi capturată regina albă; - noua poziție a regelui negru trebuie determinată printr-un apel al funcției GetBlackKingPosition. Toate funcțiile și procedurile (excepție: Init) întrerup execuția programului dacă sunt apelate înaintea inițializării tablei. Programul vostru nu va citi datele din nici un fișier de intrare și nu va scrie date în nici un fișier de ieșire.
În figura 6 este ilustrată poziția inițială:
Subprogram apelat Valoare returnată
![]() Figura 6 Init - MovesLeft 12 GetWhiteQueenPosition f2 GetWhiteKingPosition b5 GetBlackKingPosition b7 MoveWhiteQueen(c5) - MoveBlackKing - GetBlackKingPosition a7 MoveWhiteQueen(c7) - MoveBlackKing - GetBlackKingPosition a8 MoveWhiteQueen(d7) - MoveBlackKing - GetBlackKingPosition b8 MoveWhiteKing(b6) - MoveBlackKing - GetBlackKingPosition a8 MoveWhiteQueen(b7) - |