Kółko krzyżyk w C

0

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 ' ';
}



0

Nie mam żadnych pomysłów jak sobie z tym poradzić.

Korzystać z debuggera i przelecieć po programie krok po kroku.

0

Nie wiem czy to istotne ale przy kompilacji nie wyświetla żadnych błędów.

0

To jaki debugger polecasz pod Ubuntu?

0

Nie mam zielonego pojęcia jak posługiwać się tym debuggerem. Czy nie chciało by się komuś odpalić go na kompie i powiedzie mi co powinienem zmienić w kodzie aby program działał poprawnie?

2

Już na samym początku masz błąd:

int main(void)
{
char koniec;
    while (1)//<--- co to ma być?
    switch (menu ()){
      ustaw_macierz();//<--- nie tu!
          case 1:{
              //...
                  return 0;
                  }
           case 2:{ 
              /...
                  return 0; /*koniec programu*/
                }
                //...
            }
} 

Funkcja ustaw_macierz() nigdy nie zostanie wywołana!
Teraz macirz mnasz zainicjalizowaną samymi '\0' a nie jakimiś śmieciami, tylko dlatego, że jest to tablica globalna.
Czas zaglądnąć do funkcji ruch_gracza_A():

  //...
  if(macierz[x][y]!= ' '){//<--- widzisz?
    printf("Nieprawidłowe dane, podaj je jeszcze raz.\n");
    wykonaj_ruch_gracza_A();
  }
  else macierz[x][y] = 'X';
} 

Proponuję zmienić na:

int main(void)
{
char koniec;
    ustaw_macierz();//<---
    switch (menu ()){
          case 1:{
              //...
                  return 0;
                  }
           case 2:{ 
              /...
                  return 0; /*koniec programu*/
                }
                //...
            }
} 

Teraz powinno działać, o ile w innym miejscu (wszystkiego nie przeglądałem) nie ma nie ma tego typu błędów.

1 użytkowników online, w tym zalogowanych: 0, gości: 1