Monday, November 23, 2015

Limbajul C. Matrice "X si 0". "X si 0" la consola pentru 2 jucatori


1.
 Codul urmator atribuie elementelor unei matrice bi dimensionale 3 x 3 valori de tip char (pentru o afisare corespunzatoare, trebuie introduse caractere alfanumerice, nu white-spaces) preluate de la tastatura sub forma unui sir.


Initial toate elementele matricii au valoarea '\0', neafisabila. Se pot introduce oricate caractere, oricum vor fi incarcate doar primele 9. Daca sunt introduse mai putin de 9 caractere, fie numarul acestora n, sirul de n caractere se va termina cu 'z' pe post de validator.

Codul si printscreen-ul:


#include <stdio.h>

void PrintMat(char p[][3]);

int main()
{
            char tab[3][3] = {'\0'}, c;
            int i = 0, j = 0;
            puts("Input nine characters (or less & end with zed).");
            while((c = getchar()) != 'z')
            {
                        if(i >= 3) break;
                        if(i < 3 && j < 3)
                        {
                          tab[i][j] = c;
                          if(j != 2) j++;
                          else {i++; j = 0;}
                        }
            }
            PrintMat(tab);
            return 0;
           
}

void PrintMat(char p[][3])
{
            int i, j;
            printf("    0   1   2  ");
            printf("\n  -------------\n");
            for(i = 0; i < 3; i++)
            {
        printf("%d ", i);
                        for(j = 0; j < 3; j++) printf("| %c ", p[i][j]);
                        if(j == 3) printf("|\n  -------------\n");
            }
}






2. Codul urmator, ceva mai complex, da posibilitatea ca doi jucatori sa 'bifeze' x si 0 pe o tabla virtuala, introducand coordonatele carteziene (i,j). Coltul stanga-sus al tablei corespunde pozitiei i = 0, j = 0 iar cel din dreapta jos are coordonatele i = 2, j = 2.

Programul este divizat in functii care afiseaza tabla de joc dupa fiecare mutare, verifica daca s-a completat o linie, o coloana sau o diagonala cu elemente avand aceeasi valoare (fie 'x', fie '0') etc.

Jocul se opreste in doua situatii: s-a epuizat numarul maxim de 'mutari' insumate ale ambilor jucatori (==9) fara a exista un castigator sau exista un castigator la a n-a mutare, n <= 9.

In ambele cazuri se afiseaza mesaje corespunzatoare.

Codul si printscreen-ul cu cele trei situatii - castiga x, castiga 0 sau joc indecis:

// Tic-tac-toe v2 Two players

void DisplayMat(char p[][3]);

int CheckWinner(char tab[][3]);

int main()
{
            char tab[3][3] = {'\0'};
            int k = 0, win = 0, i, j, check;
            DisplayMat(tab);
            while(k <= 8)
            {
                if(!(k%2))
                {
                    err:puts("Jucatorul cu x la mutare. Dati coordonatele separate de virgula:");
                    scanf("%d, %d", &i, &j);
                    _flushall();
                    if(tab[i][j] != '\0') {puts("\nPozitia e deja ocupata!"); goto err;}
                    tab[i][j] = 'x';
                    DisplayMat(tab);
                    if(k >= 4)
                    {
                        if((win = CheckWinner(tab))) break;
                     }
              }
              else
              {
                    erro:puts("Jucatorul cu 0 la mutare. Dati coordonatele separate de virgula:");
                    scanf("%d, %d", &i, &j);
                    _flushall();
                    if(tab[i][j] != '\0') {puts("\nPozitia e deja ocupata!"); goto erro;}
                    tab[i][j] = '0';
                    DisplayMat(tab);
                    if(k >= 5)
                    {
                         if((win = CheckWinner(tab))) break;
                    }
              }
                k++;
            }
            if(win)
            {
                if(win == 1) printf("\nJucatorul cu x a castigat.");
                else printf("\nJucatorul cu 0 a castigat.");
            }
                                    else printf("\nPartida indecisa, nu exista castigator.");
            return 0;

}

void DisplayMat(char p[][3])
{
            int i, j;
            printf("    0   1   2  ");
            printf("\n  -------------\n");
            for(i = 0; i < 3; i++)
            {
        printf("%d ", i);
                        for(j = 0; j < 3; j++) printf("| %c ", p[i][j]);
                        if(j == 3) printf("|\n  -------------\n");
            }
}

int CheckWinner(char tab[][3])
{
   int m;
   for(m = 0; m < 3; m++)
   {
         if(tab[m][0] == tab[m][1] && tab[m][1]== tab[m][2])
         {
            if(tab[m][0] == 'x') return 1;
            if(tab[m][0] == '0') return 2;
         }
   }
   for(m = 0; m < 3; m++)
   {
         if(tab[0][m] == tab[1][m] && tab[1][m]== tab[2][m])
         {
             if(tab[m][0] == 'x') return 1;
             if(tab[m][0] == '0') return 2;
         }
   }
   if((tab[0][0] == tab[1][1] && tab[1][1] == tab[2][2]) || (tab[0][2] == tab[1][1] && tab[1][1] == tab[2][0]))
   {
        if(tab[m][0] == 'x') return 1;
        if(tab[m][0] == '0') return 2;
   }
   return 0;
}








No comments:

Post a Comment