Advertisement
cmiN

dummy tic tac toe

Jan 18th, 2013
108
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.94 KB | None | 0 0
  1. #include <iostream>
  2. using namespace std;
  3.  
  4.  
  5. /* tabla de X si 0
  6.    0 inseamna ca celula este libera
  7.    1 ocupata de utilizator (X)
  8.    2 ocupata de computer (0) */
  9. int tabla[3][3];
  10.  
  11.  
  12. void show()
  13. {
  14.     /// Functia de afisare a tablei.
  15.     for (int i = 0; i < 3; ++i) {
  16.         for (int j = 0; j < 3; ++j)
  17.             if (tabla[i][j] == 1)
  18.                 cout << "X ";
  19.             else if (tabla[i][j] == 2)
  20.                 cout << "0 ";
  21.             else
  22.                 cout << "- ";
  23.         cout << endl;
  24.     }
  25.     cout << endl;
  26. }
  27.  
  28.  
  29. int verifica()
  30. {
  31.     int gata = 0;
  32.     // daca e vreo linie completa
  33.     for (int i = 0; i < 3; ++i)
  34.         if (tabla[i][0] == tabla[i][1] &&
  35.             tabla[i][1] == tabla[i][2] &&
  36.             tabla[i][0])
  37.                 gata = tabla[i][0];
  38.     // daca e vreo coloana completa
  39.     for (int j = 0; j < 3; ++j)
  40.         if (tabla[0][j] == tabla[1][j] &&
  41.             tabla[1][j] == tabla[2][j] &&
  42.             tabla[0][j])
  43.                 gata = tabla[0][j];
  44.     // daca e vreo diagonala
  45.     if (tabla[0][0] == tabla[1][1] &&
  46.         tabla[1][1] == tabla[2][2] &&
  47.         tabla[0][0])
  48.             gata = tabla[0][0];
  49.     if (tabla[0][2] == tabla[1][1] &&
  50.         tabla[1][1] == tabla[2][0] &&
  51.         tabla[0][2])
  52.             gata = tabla[0][2];
  53.  
  54.     if (gata == 1) {
  55.         cout << "Utilizatorul a castigat" << endl;
  56.         return 1;
  57.     } else if (gata == 2) {
  58.         cout << "Computerul a castigat" << endl;
  59.         return 2;
  60.     }            
  61.  
  62.     // probabil e egalitate
  63.     int liber = 0;
  64.     for (int i = 0; i < 3 && !liber; ++i)
  65.         for (int j = 0; j < 3 && !liber; ++j)
  66.             if (tabla[i][j])
  67.                 continue;
  68.             else
  69.                 liber = 1;
  70.     if (!liber) {
  71.         cout << "Egalitate" << endl;
  72.         return 3;
  73.     }
  74.  
  75.     return 0;    // mai e de jucat
  76. }
  77.  
  78.  
  79. int main()
  80. {
  81.     int gata = 0;
  82.     /* cat timp jocul nu este gata, luam decizii,
  83.        o data utilizatorul, o data calculatorul */
  84.     while (gata == 0) {
  85.         int ok = 0;
  86.         do {
  87.             /* cerem utilizatorului sa puna X pana cand
  88.                alege o linie si o coloana valida */
  89.             int linie, coloana;
  90.             cout << "L C: ";
  91.             cin >> linie >> coloana;
  92.             --linie; --coloana;
  93.             if (linie < 0 || linie > 2 ||    // valori invalida
  94.                 coloana < 0 || coloana > 2 ||     // sau
  95.                 tabla[linie][coloana])    // daca celula e ocupata
  96.                     continue;    // continuam cu interogarea
  97.             // celula nu e ocupata, deci o ocupam cu alegerea utilizatorului
  98.             ok = 1;    // alegere corecta
  99.             tabla[linie][coloana] = 1;
  100.         } while (!ok);
  101.  
  102.         show();    // afisam tabla
  103.         gata = verifica();    // verifica daca nu cumva s-a terminat jocul
  104.         if (gata)
  105.             continue;    // s-a terminat
  106.         // jocul nu e gata, urmeaza ca si computerul sa faca o decizie
  107.         /* pentru fiecare celula se verifica daca exista doi de 1 pe
  108.            aceeasi dreapta si daca da, atunci acolo va pune "0", adica 2 */
  109.         int ales = 0;    // daca a ales unde sa puna 2
  110.         for (int i = 0; i < 3 && !ales; ++i)
  111.             for (int j = 0; j < 3 && !ales; ++j) {
  112.                 if (tabla[i][j])
  113.                     continue;    // celula e ocupata, deci mergem mai departe
  114.                    
  115.                 // verificam posibilii vecini
  116.  
  117.                 // tratam cazurile cand locul liber e la mijloc
  118.                 if (j == 1 && tabla[i][j - 1] == 1 &&
  119.                               tabla[i][j + 1] == 1)
  120.                     // vecinii din stanga si din dreapta
  121.                     ales = 1;
  122.                 // analog
  123.                 if (i == 1 && tabla[i - 1][j] == 1 &&
  124.                               tabla[i + 1][j] == 1)
  125.                     // vecinii de sus si de jos
  126.                     ales = 1;
  127.                 if (i == 1 && j == 1) {    // luam in calcul si diagonalele
  128.                     if (tabla[i - 1][j - 1] == 1 &&
  129.                         tabla[i + 1][j + 1] == 1)
  130.                             ales = 1;
  131.                     else if (tabla[i - 1][j + 1] == 1 &&
  132.                              tabla[i + 1][j - 1] == 1)
  133.                             ales = 1;
  134.                 }
  135.  
  136.                 // acum tratam cazurile cand vecinii pot fi unul dupa altul
  137.                 int dirl[8] = {-1, 1, 0, 0, 1, -1, -1, 1};   // directiile posibile pe linie
  138.                 int dirc[8] = {0, 0, -1, 1, 1, -1, 1, -1};   // si pe coloana
  139.                 for (int d = 0; d < 8 && !ales; ++d) {
  140.                     /* acum aplicam aceeasi directie pentru a afla
  141.                        vecinul celulei curente, dar si pe vecin pentru
  142.                        a afla vecinul vecinului */
  143.                     int i1 = i + dirl[d], j1 = j + dirc[d];
  144.                     int i2 = i1 + dirl[d], j2 = j1 + dirc[d];
  145.                    
  146.                     /* daca nu sunt posibile in acelasi timp ambele
  147.                        directii, atunci nu avem cum sa testam cazul */
  148.                     if (i1 < 0 || i1 > 2 || i2 < 0 || i2 > 2 ||
  149.                         j1 < 0 || j1 > 2 || j2 < 0 || j2 > 2)
  150.                             continue;
  151.                     // vecinii sunt posibili
  152.                     if (tabla[i1][j1] == 1 && tabla[i2][j2] == 1)
  153.                         ales = 1;
  154.                 }
  155.  
  156.                 if (ales)
  157.                     tabla[i][j] = 2;
  158.             }
  159.  
  160.         if (!ales) {
  161.             /* daca nu am gasit o varianta prioritara atunci
  162.                alegem prima celula libera */
  163.             for (int i = 0; i < 3 && !ales; ++i)
  164.                 for (int j = 0; j < 3 && !ales; ++j) {
  165.                     if (tabla[i][j])
  166.                         continue;
  167.                     tabla[i][j] = 2;
  168.                     ales = 1;
  169.                 }  
  170.         }
  171.      
  172.         show();
  173.         gata = verifica();
  174.     }
  175.     return 0;
  176. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement