Mattii4211 utworzono 30 stycznia 2015 utworzono 30 stycznia 2015 #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.
rafalluz komentarz 11 lutego 2015 komentarz 11 lutego 2015 We wczytywaniu porównujesz ze spacją, a na początku masz znaki puste. Zmień ' ' na '\0' 1
Mattii4211 komentarz 11 lutego 2015 Autor komentarz 11 lutego 2015 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 11 lutego 2015 komentarz 11 lutego 2015 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 12 lutego 2015 Autor komentarz 12 lutego 2015 Ale jak usunę spacje to rozwalę cały wygląd gry. (Próbowałem różnych kombinacji i nic).
Mattii4211 komentarz 13 lutego 2015 Autor komentarz 13 lutego 2015 (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.