x-kom hosting

Język C początki.

Mattii4211
utworzono
utworzono
#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:{
			  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*/
    			}
			}
}			

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

Dopiero zaczynam programować (albo zaczynam próbować  :P ). Na zaliczenie z C mam zrobić jakiś prosty program. Postanowiłem zrobić kółko krzyżyk. Program się kompiluje, jednak nie wiem dlaczego nie mogę wprowadzić współrzędnych. Oto kod:

Jak rozwiązać ten problem (jakaś dodatkowa pętla?). Będę wdzięczny za pomoc.

  • 2 tygodnie później...

Mattii4211
komentarz
komentarz

Zero pomysłów?

rafalluz
komentarz
komentarz

We wczytywaniu porównujesz ze spacją, a na początku masz znaki puste.

 

Zmień ' ' na '\0'

  • Dobra wypowiedź 1
Mattii4211
komentarz
komentarz

Super wielkie dzięki za rozwiązanie problemu. Mam jeszcze jedno pytanko: dlaczego znaki wstawiane są jakby ze spacją co przesuwa znak | o jedno miejsce i nieco psuje wygląd. 

rafalluz
komentarz
komentarz

Pewnie chodzi o to:

 printf(" %c | %c | %c ",macierz[t][0],
macierz[t][1], macierz [t][2]);

Masz spacje pomiędzy | i %c. Jak je usuniesz, to nie będą wyświetlane.

Mattii4211
komentarz
komentarz

Ale jak usunę spacje to rozwalę cały wygląd gry. (Próbowałem różnych kombinacji i nic).

rafalluz
komentarz
komentarz

To nie wiem, o co chodzi, u mnie jest OK.

Mattii4211
komentarz
komentarz (edytowane)
#include<stdio.h>
#include<stdlib.h>
#include<string.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);
char pokaz_macierz();
int menu()
{
  printf("\n	Witaj w grze w kółko i krzyżyk.\n	*******************************\n");
  printf("\n	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;
ustaw_macierz();
	switch (menu ()){
	  	 case 1:{
		  	printf("Pierwszy gracz (X) podaje współrzędne, poczym nastepuje zmiana gracza (O).\n");
			  do {
			    wykonaj_ruch_gracza_A();
			    koniec = sprawdz(); /* zobacz czy ktoś wygrał */
			    if(koniec!= '\0') break; /* wygrana !*/
			    wykonaj_ruch_gracza_B();
			    koniec = sprawdz(); /* zobacz czy ktoś wygrał */
			    if(koniec!= '\0') break; /* wygrana !*/
				  } while(koniec== '\0');
				  if(koniec=='X') printf("Gracz X wygrywa!!! Brawo!!!\nGracz O musi jescze trochę poćwiczyć.\n");
				  else printf("Gracz O wygrywa!!! Brawo!!!\nGracz X musi jescze trochę poćwiczyć.\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 ktoś wygrał */
			     if(koniec!= '\0') break; /* wygrana !*/
			     wykonaj_ruch_komputera();
			     koniec = sprawdz(); /* zobacz czy ktoś wygrał */
  				} while(koniec== '\0');
  				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	*******************************\n\n");
    			menu();
                        main();
    			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] =  '\0';
}

/* 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]!= '\0'){
    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]!= '\0'){
    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]=='\0') break;
    if(macierz[i][j]=='\0') break;
  }
  if(i*j==9)  {
    printf("Remis\n");
    exit(0);
  }
  else
    macierz[i][j] = 'O';
}

/* wyświetl macierz komputera */
char pokaz_macierz()
{
  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");
return 0;
}

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

Teraz kod wygląda tak. W dalszym ciągu po wprowadzeniu znaku dodaje jakby dodatkową spację. Nie mam pojęcia jak to naprawić, chodzi o ten fragment:

char pokaz_macierz()
{
  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");
return 0;
}

Wielkie dzięki za pomoc!

Wciąż szukasz rozwiązania problemu? Napisz teraz na forum!

Możesz zadać pytanie bez konieczności rejestracji - wystarczy, że wypełnisz formularz.

×
×
  • Dodaj nową pozycję...

Powiadomienie o plikach cookie

Strona wykorzystuje pliki cookies w celu prawidłowego świadczenia usług i wygody użytkowników. Warunki przechowywania i dostępu do plików cookies możesz zmienić w ustawieniach przeglądarki.