Cześć. Mam mały problem z tym programem (zaczynam programować). Otóż po wybraniu współrzędnych nie wstawia znaku do macierzy tylko za każdym razem zwraca niepoprawny ruch. Nie mam żadnych pomysłów jak sobie z tym poradzić.
#include<stdio.h>
#include<stdlib.h>
char macierz[3][3]; /* macierz kółka i krzyżyka */
char sprawdz(void);
void ustaw_macierz(void);
void wykonaj_ruch_gracza_A(void);
void wykonaj_ruch_gracza_B(void);
void wykonaj_ruch_komputera(void);
void pokaz_macierz(void);
int menu()
{
printf(" Witaj w grze w kółko i krzyżyk.\n");
printf(" Wybierz przeciwnika:\n");
printf(" 1. Dwóch graczy.\n");
printf(" 2. Ty vs komputer.\n");
int n;
scanf("%d", &n);
return n;
}
int main(void)
{
char koniec;
while (1)
switch (menu ()){
ustaw_macierz();
case 1:{
printf("Pierwszy gracz (X) podaje współrzędne, poczym nastepuje zmiana gracza (O).\n");
do {
wykonaj_ruch_gracza_A();
koniec = sprawdz();
if(koniec!= ' ') break; /* wygrana !*/
wykonaj_ruch_gracza_B();
koniec = sprawdz(); /* zobacz czy ktoś wygrał */
if(koniec!= ' ') break; /* wygrana !*/
} while(koniec== ' ');
if(koniec=='X') printf("Wygrałeś!!! Brawo!!!\n");
else printf("Niestety przeciwnik okazał się lepszy!\n");
pokaz_macierz(); /* pokaz X i O */
return 0;
}
case 2:{
printf("Twoim przeciwnikiem będzie komputer.\n");
printf("Sprawdź czy jestś lepszy i uda ci się z nim wygrać.\n");
do {
wykonaj_ruch_gracza_A();
koniec = sprawdz(); /* zobacz czy ktos wygral */
if(koniec!= ' ') break; /* wygrana !*/
wykonaj_ruch_komputera();
koniec = sprawdz(); /* zobacz czy ktos wygral */
} while(koniec== ' ');
if(koniec=='X') printf("Wygrałeś!!! Brawo!!!\n");
else printf("Niestety przeciwnik okazał się lepszy!\n");
pokaz_macierz(); /* pokaz X i O */
return 0; /*koniec programu*/
}
default:
printf(" Wprowadziłeś niepoprawny numer!\n");
break;
}
}
/* Ustaw pola macierzy */
void ustaw_macierz(void)
{
int i, j;
for(i=0; i<3; i++)
for(j=0; j<3; j++) macierz[i][j] = ' ';
}
/* pobierz współrzedne ruchu gracza A. */
void wykonaj_ruch_gracza_A(void)
{
int x, y;
pokaz_macierz();
printf("Podaj pozycje X,Y twojego ruchu(np. 1.1): ");
scanf("%d%*c%d", &x, &y);
x--; y--;
if(macierz[x][y]!= ' '){
printf("Nieprawidłowe dane, podaj je jeszcze raz.\n");
wykonaj_ruch_gracza_A();
}
else macierz[x][y] = 'X';
}
/* pobierz współrzedne ruchu gracza B. */
void wykonaj_ruch_gracza_B(void)
{
int x, y;
pokaz_macierz();
printf("Podaj pozycje X,Y twojego ruchu(np. 1.1): ");
scanf("%d%*c%d", &x, &y);
x--; y--;
if(macierz[x][y]!= ' '){
printf("Nieprawidłowe dane, podaj je jeszcze raz.\n");
wykonaj_ruch_gracza_B();
}
else macierz[x][y] = 'O';
}
/* wykonaj ruch komputera */
void wykonaj_ruch_komputera(void)
{
int i, j;
for(i=0; i<3; i++){
for(j=0; j<3; j++)
if(macierz[i][j]==' ') break;
if(macierz[i][j]==' ') break;
}
if(i*j==9) {
printf("remis\n");
exit(0);
}
else
macierz[i][j] = 'O';
}
/* wyświetl macierz komputera */
void pokaz_macierz(void)
{
int t;
for(t=0; t<3; t++) {
printf(" %c | %c | %c ",macierz[t][0],
macierz[t][1], macierz [t][2]);
if(t!=2) printf("\n***|***|***\n");
}
printf("\n");
}
/* Zobacz czy ktoś wygrał. Funkcja zwraca X jezeli wygrał gracz lub 0 jeżeli wygrał komputer/drugi gracz*/
char sprawdz(void)
{
int i;
for(i=0; i<3; i++) /* sprawdź wiersze */
if(macierz[i][0]==macierz[i][1] &&
macierz[i][0]==macierz[i][2])
return macierz[i][0];
for(i=0; i<3; i++) /* sprawdź kolumny */
if(macierz[0][i]==macierz[1][i] &&
macierz[0][i]==macierz[2][i])
return macierz[0][i];
/* sprawdź skosy */
if(macierz[0][0]==macierz[1][1] &&
macierz[1][1]==macierz[2][2])
return macierz[0][0];
if(macierz[0][2]==macierz[1][1] &&
macierz[1][1]==macierz[2][0])
return macierz[0][2];
return ' ';
}