Compaq Computer Romania

Se consideră o tablă de dimensiuni 3 x 3 care este inițial goală. Pe rând, jucătorii mută, marcând una din căsuțele libere cu un semn propriu. Prin convenție semnul primului jucător este "X", iar semnul celui de-al doilea este "0". Jucătorul care obține primul trei semne proprii pe aceeași linie, coloană sau diagonală este declarat câștigător. Dacă toate căsuțele au fost marcate și nici un jucător nu a câștigat atunci se declară remiză.
    Presupunând că primul jucător este reprezentat de calculator, se cere să se programeze o strategie pentru al doilea jucător. Calculatorul va realiza întotdeauna operații deterministe pentru a efectua o mutare.
    Pentru fiecare partidă câștigată veți primi 0.002 puncte. Pentru fiecare remiză veți primi 0.001 puncte. Pentru o partidă pierdută nu veți primi nici un punct.
    Va trebui ca, într-un interval de o secundă, să jucați cât mai multe partide. Timpul consumat de calculator pentru a determina pozițiile vă permite (în cazul în care veți folosi un algoritm eficient) să jucați cel puțin 100000 de partide.
    Cele nouă căsuțe ale tablei vor fi numerotate astfel:

    Programatorii în Pascal vor avea la dispoziție un unit numit TICTAC.PAS, care va conține două proceduri și o funcție.
    La începutul jocului va trebui, obligatoriu, să fie apelată procedura InitGame, care nu are nici un parametru și este folosită pentru inițializarea jocului.
    Pentru a efectua o mutare veți apela procedura MyMove. Aceasta are un singur parametru care indică poziția în care veți amplasa un "0".
    Pentru a afla mutarea efectuată de adversar veți apela funcția YourMove. Aceasta nu are nici un parametru și returnează poziția în care calculatorul a amplasat un "X". În cazul în care jocul se încheie, funcția va returna valoarea -1.
    Programatorii în C/C++ vor avea la dispoziție un header numit TICTAC.H, care va conține trei funcții.
    La începutul jocului va trebui, obligatoriu, să fie apelată funcția InitGame, care nu are nici un parametru și este folosită pentru inițializarea jocului.
    Pentru a efectua o mutare veți apela funcția MyMove. Aceasta are un singur parametru care indică poziția în care veți amplasa un "0".
    Pentru a afla mutarea efectuată de adversar veți apela funcția YourMove. Aceasta nu are nici un parametru și returnează poziția în care calculatorul a amplasat un "X". În cazul în care jocul se încheie, funcția va returna valoarea -1.
    Desfășurarea unui joc este următoarea: la început se va inițializa jocul, după care se va cere efectuarea unei mutări de către adversar. Apoi, alternativ, se vor efectua mutări și se vor cere mutările adversarului până în momentul în care funcția YourMove va returna valoarea -1. Chiar dacă mutarea voastră este câștigătoare, va trebui să mai apelați o dată funcția YourMove care va returna, obligatoriu, valoarea -1. Următorul joc va începe după o nouă inițializare.
    Funcția YourMove va întrerupe execuția programului în momentul în care va expira timpul alocat partidelor.
    În cazul în care nu veți respecta secvența de mutări, veți pierde jocul respectiv. Această sitiuație poate apărea dacă:
· se efectuează două mutări consecutive;
· se cere efectuarea a două mutări consecutive;
· se efectuează sau se cer mutări fără a se inițializa jocul;
· se inițializează jocul înaintea terminării unui joc (înainte ca funcția YourMove să returneze valoarea -1);
· nu se cere efectuarea primei mutări de către advesar;
· orice altă situație în care nu se respectă regulile jocului.
    Puteți descarca o variantă a unit-ului sau a header-ului. Calculatorul va folosi o strategie aleatoare, deci acestea nu vor fi folosite în timpul evaluării.
    Programul vostru nu va trebui să citească date din nici un fișier și nu va trebui să scrie date în nici un fișier.