Pagina index


Jocul "X" si "Zero"

O echipa de programatori a primit sarcina de a dezvolta un program care sa stie sa joace "X" si "Zero". Programul trebuia sa simuleze ambii jucatori, atat pe "X" cat si pe "Zero". Pe ecran trebuia sa apara tabla de joc (de dimensiunea cunoscuta 3x3) si apoi trebuia sa se poata urmari alternativ mutarile fiecarui jucator. Scopul unui asemenea program era cercetarea a diverse strategii de joc, in ideea de a gasi o strategie care sa fie mereu castigatoare.

Toate bune si frumoase pana aici. Echipa de programatori a decis ca, pentru a-si usura munca, sa imparta programul pe parti. Ei s-au hotarat sa creeze trei parti distincte, dupa cum urmeaza:

Pentru ca cele trei parti sa poata fi dezvoltate in paralel, echipa de programatori s-a hotarat sa foloseasca facilitatea de unitati de program ("unit"-uri) oferita de limbajul Turbo Pascal. Cele trei parti urmau sa fie realizate in felul urmator:

ParteaSe realizeaza ca siCodul sursa va fi scris in fisierul Dupa compilare va rezulta fisierul
XUnitX.PASX.TPU
ZeroUnitZERO.PASZERO.TPU
ArbitrulProgramARBITRUL.PASARBITRUL.EXE

Deci partea care implementeaza strategia de joc a lui "X" urma sa fie realizata sub forma unui "unit" Turbo Pascal scris in fisierul sursa "X.PAS". Din compilarea acestui "unit" urma sa rezulte fisierul binar "X.TPU".

Partea care implementeaza strategia de joc a lui "Zero" urma sa fie realizata sub forma unui al doilea "unit" Turbo Pascal, scris in fisierul sursa "ZERO.PAS". Din compilarea fisierului sursa "ZERO.PAS" urma sa rezulte fisierul binar "ZERO.TPU".

Partea care arbitreaza si coordoneaza jocul urma sa fie realizata sub forma unui program Turbo Pascal scris in fisierul sursa "ARBITRUL.PAS". Din compilarea lui urma sa rezulte fisierul binar "ARBITRUL.EXE". Pentru a putea compila fisierul "ARBITRUL.PAS", e nevoie de fisierele "X.TPU" si "ZERO.TPU". Asta deoarece, in mod evident, pentru ca partea ce coordoneaza jocul sa poata functiona, e nevoie si de partile care implementeaza strategiile de joc ale celor doi jucatori.

Diagrama urmatoare ilustreaza ceea ce am zis mai pana acum.

Din nou toate bune si frumoase. Echipa s-a apucat de implementare si a reusit sa implementeze cu succes programul "Arbitrul" si unit-ul "X". Dupa care s-a intamplat nenorocirea. N-1 din cei N membri ai echipei s-au imbolnavit. Singurul programator ramas sanatos a incercat sa implementeze singur unit-ul "Zero". Din pacate nu a reusit sa faca acest lucru cu succes. Unit-ul "Zero" creat de el pierde de fiecare data in fata unit-ului "X".

Aici este momentul in care intrati voi in scena. Ajutati-l pe programatorul ramas sanatos sa implementeze un unit "Zero" care nu piarda in fata unit-ului "X".

Echipa de programatori va pune la dispozitie urmatoarele fisiere:

ARBITRUL.PAS Sursa Turbo Pascal pentru programul "Arbitrul".
X.TPU Unit-ul "X" in forma binara. Din pacate sursa Turbo Pascal pentru unit-ul "X" nu vi se poate pune la dispozitie, pentru ca trebuie sa ramana secreta.
ARBITRUL.EXE Modulul "Arbitrul" in forma binara. Acest fisier a fost obtinut prin compilarea fisierului "ARBITRUL.PAS" impreuna cu fisierul "X.TPU" si cu fisierul "ZERO.TPU".

Urmatoarele fisiere NU va sunt puse la dispozitie:

X.PAS Sursa Turbo Pascal pentru unit-ul "X". Dupa cum am spus, aceasta sursa trebuie sa ramana secreta.
ZERO.PAS Sursa Turbo Pascal pentru unit-ul "Zero". Aceasta sursa a fost scrisa de programatorul ramas sanatos, dar nu are nici un fel de valoare, asa ca nu va este de nici un folos, asa ca nu vi se pune la dispozitie.
ZERO.TPU Unit-ul "Zero" in forma binara. Acest fisier s-ar obtine prin compilarea fisierului "ZERO.PAS", dar cum calitatea lui este foarte slaba (pierde mereu in fata modulului "X"), nu vi se mai pune la dispozitie. Avem incredere ca veti reusi sa scrieti o varianta mult mai performanta a unit-ului "Zero".

Fisierele furnizate de echipa de programatori se gasesc in arhiva x0.zip. Primul lucru pe care ar trebui sa il faceti este sa rulati fisierul executabil "ARBITRUL.EXE" pentru a vedea cum arata programul.

Scrieti o unitate Turbo Pascal (un "unit") numit "Zero". Salvati-l intr-un fisier cu numele "ZERO.PAS" si compilati-l. Va rezulta un fisier cu numele "ZERO.TPU". Copiati fisierul "ZERO.TPU" langa fisierele "ARBITRUL.PAS" si "X.TPU" furnizate de echipa de programatori. Compilati apoi fisierul "ARBITRUL.PAS" si va rezulta un fisier "ARBITRUL.EXE". Rulati fisierul "ARBITRUL.EXE" pentru a vedea daca modulul "Zero" pe care l-ati scris castiga sau pierde in fata modulului "X".

Unitatea ("unit"-ul) "Zero" trebuie sa aiba in partea de "interface" doua proceduri, dupa cum urmeaza:

		procedure SaMuteZero(var linie, col : Byte);
		procedure AMutatX(linie, col : Byte);
		

Procedura "SaMuteZero" [Sa Mute Zero] este apelata de "Arbitrul" atunci cand este randul jucatorului "Zero" la mutare. Procedura primeste ca si parametri doua variabile: "linie" si "col". In aceste doua variabile trebuie sa se scrie linia si coloana unde vrea "Zero" sa plaseze piesa urmatoare. Spre exemplu daca "Zero" vrea sa puna piesa la coordonatele (2,3), atunci variabila "linie" va primi valoarea 2, iar variabila "col" va primi valoarea "3". Observati ca cei doi parametri ai procedurii sunt declarati cu modificatorul "var", special pentru a li se putea atribui valori. urma

Procedura "AMutatX" [A Mutat X] este apelata de "Arbitrul" dupa ce jucatorul "X" a facut o mutare. Procedura are doi parametri "linie" si "col", care reprezinta coordonatele la care a plasat "X" ultima sa piesa.

Prin aceste doua proceduri, unit-ul "Zero" poate sa comunice cu programul "Arbitrul" si sa transmita/primeasca absolut toate informatiile de care este nevoie. Unit-ul "Zero" isi poate exprima dorinta de a plasa piese la coordonatele dorite (prin procedura "SaMuteZero"). Totodata unit-ul "Zero" este informat despre fiecare mutare a adversarului (prin procedura "AMutatX"), deci poate urmari starea tablei de joc la orice moment de timp.

Se stie ca intotdeauna jucatorul "Zero" incepe jocul, deci puteti avea un avantaj major cu acest lucru.

Un alt avantaj este ca programatorul ramas sanatos se afla la dispozitia voastra timp de doua ore in cadrul laboratorului. Asa ca nu ezitati sa il intrebati, orice nelamurire ati avea.