Kółko krzyżyk w C

Odpowiedz Nowy wątek
2015-02-10 18:13
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 ' ';
}
Paskudztwo ostateczne - spartanPAGE 2015-02-11 11:24

Pozostało 580 znaków

2015-02-10 18:24
0

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

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

Pozostało 580 znaków

2015-02-10 18:36
0

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

nie, nie jest - twonek 2015-02-10 18:48

Pozostało 580 znaków

2015-02-10 18:53
0

To jaki debugger polecasz pod Ubuntu?

@winerfresh kiedyś podawałeś link do tutoriala gdb, możesz znowu zapodać? - twonek 2015-02-10 18:57
jak mam go zainstalować? wpisane polecenie pkgadd gnu w terminal nic nie daje - Mattii4211 2015-02-10 19:25
Sprawdź czy go nie masz, zazwyczaj idzie razem z gcc. A jak nie to: http://stackoverflow.com/ques[...]-install-gdb-in-linux-machine - twonek 2015-02-10 19:50

Pozostało 580 znaków

2015-02-11 11:21
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?

Pozostało 580 znaków

2015-02-12 08:53
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.

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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