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