matiko101 Temat założony przez niniejszego użytkownika |
Kółko i krzyżyk- program przestał działać / sprawdzanie remisu » 2013-11-23 18:50:01 Witam, Napisałem grę z banalnymi zasady, ale nie do końca sobie z nią radzę. Oto kod: #include<iostream> #include<windows.h> #include<cstdio> #include<conio.h> #include<cstdlib> using namespace std; void intro() { cout << " * WITAJ *\n "; Sleep( 800 ); cout << " ** W **\n "; Sleep( 800 ); cout << " *** GRZE ***\n"; Sleep( 800 ); cout << " **** KOLKO ****\n "; Sleep( 800 ); cout << " ***** i **** \n"; Sleep( 800 ); cout << " ****** KRZYZYK ******"; Sleep( 800 ); Sleep( 1000 ); system( "cls" ); } int w( char tab[] ) { int x = 0, y = ' '; while( x <= 10 ) { x++; tab[ x ] = y; } } int plansza( char tab[] ) { system( "cls" ); for( int i = 1; i <= 9; i++ ) { cout << "" << tab[ i ] << ""; if( i % 3 != 0 ) { cout << " |"; } else { if( i != 9 ) cout << "\n---+---+---\n"; else { cout << endl; } } } cout << endl; } int wygranaO( char tab[] ) { char znak = 'O'; if(( tab[ 1 ] == znak ) &&( tab[ 2 ] == znak ) &&( tab[ 3 ] == znak ) ||( tab[ 4 ] == znak ) &&( tab[ 5 ] == znak ) &&( tab[ 6 ] == znak ) ||( tab[ 7 ] == znak ) &&( tab[ 8 ] == znak ) &&( tab[ 9 ] == znak ) ||( tab[ 1 ] == znak ) &&( tab[ 4 ] == znak ) &&( tab[ 7 ] == znak ) ||( tab[ 2 ] == znak ) &&( tab[ 5 ] == znak ) &&( tab[ 8 ] == znak ) ||( tab[ 3 ] == znak ) &&( tab[ 6 ] == znak ) &&( tab[ 9 ] == znak ) ||( tab[ 1 ] == znak ) &&( tab[ 5 ] == znak ) &&( tab[ 9 ] == znak ) ||( tab[ 3 ] == znak ) &&( tab[ 5 ] == znak ) &&( tab[ 7 ] == znak ) ) { cout << " ________________________________________\n"; cout << " | Wygral " << znak << " GRATULACJE !!! |\n"; cout << " ========================================\n"; } }
bool wygranaX( char tab[] ) { char znak = 'X'; if(( tab[ 1 ] == znak ) &&( tab[ 2 ] == znak ) &&( tab[ 3 ] == znak ) ||( tab[ 4 ] == znak ) &&( tab[ 5 ] == znak ) &&( tab[ 6 ] == znak ) ||( tab[ 7 ] == znak ) &&( tab[ 8 ] == znak ) &&( tab[ 9 ] == znak ) ||( tab[ 1 ] == znak ) &&( tab[ 4 ] == znak ) &&( tab[ 7 ] == znak ) ||( tab[ 2 ] == znak ) &&( tab[ 5 ] == znak ) &&( tab[ 8 ] == znak ) ||( tab[ 3 ] == znak ) &&( tab[ 6 ] == znak ) &&( tab[ 9 ] == znak ) ||( tab[ 1 ] == znak ) &&( tab[ 5 ] == znak ) &&( tab[ 9 ] == znak ) ||( tab[ 3 ] == znak ) &&( tab[ 5 ] == znak ) &&( tab[ 7 ] == znak ) ) { cout << " ________________________________________\n"; cout << " | Wygral " << znak << " GRATULACJE !!! |\n"; cout << " ========================================\n"; return true; } else { return false; } }
int ruch( char tab[], string gracz1, string gracz2 ) { char znak = ' '; string remis; int los; int cyfra = 1; w( tab ); plansza( tab ); while(( !wygranaX( tab ) ) ||( wygranaO( tab ) ) ) { cout << "Ruch gracza " << gracz1 << ": "; cin >> cyfra; if( tab[ cyfra ] == ' ' ) { tab[ cyfra ] = 'X'; plansza( tab ); znak = 'X'; if( wygranaX( tab ) == true ) { cout << "\n\n \n Koniec gry !"; return 0; } } else if(( tab[ cyfra ] == 'X' ) ||( tab[ cyfra ] == 'O' ) ) { cout << "\n Nie oszukuj chciales postawic znak na zajete pole ! \n\n"; } cout << "Ruch gracza " << gracz2 << ": "; cin >> cyfra; if(( tab[ cyfra ] == ' ' ) ) { tab[ cyfra ] = 'O'; plansza( tab ); znak = 'O'; if( wygranaO( tab ) == true ) { cout << "\n\n \n Koniec gry !"; return 0; } } else if(( tab[ cyfra ] == 'X' ) ||( tab[ cyfra ] == 'O' ) ) { cout << "\n Nie oszukuj chciales postawic znak na zajete pole ! \n\n"; } else if(( cyfra > 9 ) ||( cyfra < 1 ) ) cout << "Nie oszukuj chciales postawic na pole ktorego nie ma\n\n"; } }
int main() { string imie1, imie2; int wybor = 0; char tab[ 9 ]; cout << "\n *********************************** "; cout << "\n ****** [Enter] START ******"; cout << "\n **** [Spacja] ZASADY ****"; cout << "\n *** [Esc] KONIEC ***"; cout << "\n ** ** "; cout << "\n ************************ \n\n\n"; wybor = getch(); switch( wybor ) { case 13: system( "cls" ); { cout << "Podaj imie gracza X\n"; cin >> imie1; system( "cls" ); cout << "Podaj imie gracza O\n"; cin >> imie2; ruch( tab, imie1, imie2 ); return 0; break; } case 32: system( "cls" ); break; case 27: system( "cls" ); return 0; break; } return 0; }
Wiem, że mogłem funkcje wygranaX i wygranaO o wiele krócej, ale chciałem na razie aby działało. Mam 2 pytania: (nie oczekuje rozwiązania tylko podpowiedzi co mam źle) 1. Dlaczego program nie odpowiada po skończeniu rundy ? 2. W jaki sposób zrobić remis ? Próbowałem gdy nie ma wolnego miejsca na planszy, ale chyba to źle robię: for( int x = 2; x <= 10; x++ ) { if( tab[ x ] != ' ' ) { plansza( tab ); cout << "REMIS !"; return 0; } }
Umieściłem to na początku pętli while, ale nie działa tak jak powinno. |
|
leon_w |
» 2013-11-23 19:52:08 Jeżeli chodzi o remis, to możesz zdefiniować dodatkową zmienną i dodawać do jej wartości 1 przy każdym ruchu gracza, dalej if(zmienna==9).... |
|
matiko101 Temat założony przez niniejszego użytkownika |
» 2013-11-23 19:54:09 Z tym wyłączaniem już sobie poradziłem, ale ten remi zrobiłem tak jak mówisz. Tylko, że gdy ta zmienna wynosiła np. 5 i postawiłem na tym polu znak to wykrywało remis :( . Może coś źle zrobiłem |
|
leon_w |
» 2013-11-23 20:20:47 To musi być osobna zmienna, np int remis=0, +1 przy ruchu każdego z graczy a warunek kończący remisem wstaw po lub w ruchu pierwszego gracza, bo to on wykonuje 9 ruch. |
|
matiko101 Temat założony przez niniejszego użytkownika |
» 2013-11-25 19:39:33 Udało mi się ;) I mam pytanie co w tym kodzie jet niepotrzebne (zbędne) i czy możną go jakimś sposobem skrócić. Wydaje mi się,że powtarzanie akcji "Nie ma takie pola" lub "chciałeś postawić znak na zajęte pole " powinno być tylko raz, ale nie mam pomysłu jak pętle skonstruować, by działało w taki sam sposób jak teraz. Oczywiście jeśli zrobienie tego nie spowodowało by całej przebudowy mojego programu. #include<iostream> #include<windows.h> #include<cstdio> #include<conio.h> #include<cstdlib> using namespace std; void intro() { system( "color 04" ); cout << " * WITAJ *\n "; Sleep( 500 ); cout << " ** W **\n "; Sleep( 500 ); cout << " *** GRZE ***\n"; Sleep( 500 ); cout << " **** KOLKO ****\n "; Sleep( 500 ); cout << " ***** i **** \n"; Sleep( 500 ); cout << " ****** KRZYZYK ******"; Sleep( 500 ); Sleep( 800 ); system( "cls" ); }
int zasady() { char wybor3; cout << "Pola zaznaczasz za pomoca cyfr od 1 do 9 :\n"; cout << "[1][2][3]\n[4][5][6]\n[7][8][9]\n"; cout << "Dwoch graczy gra na zmiane i ten ktory jako pierwsz umiesci swoje 3 znaki obok siebie poziomo/pionowo/na ukos ten wygrywa ! ;"; cout << "\n\n\n\n\n Jesli chcesz powrocic do menu kliknij [t] a jesli nie dowolny przycisk\n"; wybor3 = getch(); if( wybor3 == 't' ) return 0; else exit( 0 ); } int w( char tab[] ) { int x = 0, y = ' '; while( x <= 10 ) { x++; tab[ x ] = y; } return 0; } int plansza( char tab[] ) { system( "cls" ); for( int i = 1; i <= 9; i++ ) { cout << "" << tab[ i ] << ""; if( i % 3 != 0 ) { cout << " |"; } else { if( i != 9 ) cout << "\n---+---+---\n"; else { cout << endl; } } } cout << endl; return 0; }
bool wygrana( char tab[], char znak ) { if(( tab[ 1 ] == znak ) &&( tab[ 2 ] == znak ) &&( tab[ 3 ] == znak ) ||( tab[ 4 ] == znak ) &&( tab[ 5 ] == znak ) &&( tab[ 6 ] == znak ) ||( tab[ 7 ] == znak ) &&( tab[ 8 ] == znak ) &&( tab[ 9 ] == znak ) ||( tab[ 1 ] == znak ) &&( tab[ 4 ] == znak ) &&( tab[ 7 ] == znak ) ||( tab[ 2 ] == znak ) &&( tab[ 5 ] == znak ) &&( tab[ 8 ] == znak ) ||( tab[ 3 ] == znak ) &&( tab[ 6 ] == znak ) &&( tab[ 9 ] == znak ) ||( tab[ 1 ] == znak ) &&( tab[ 5 ] == znak ) &&( tab[ 9 ] == znak ) ||( tab[ 3 ] == znak ) &&( tab[ 5 ] == znak ) &&( tab[ 7 ] == znak ) ) { cout << " ________________________________________\n"; cout << " | Wygral " << znak << " GRATULACJE !!! |\n"; cout << " ========================================\n"; return true; } else { return false; } }
int ruch( char tab[], string gracz1, string gracz2 ) { int x = 0; char znak; int cyfra = 1; int remis = 1; w( tab ); plansza( tab ); while(( !wygrana( tab, 'X' ) ) ||( !wygrana( tab, 'O' ) ) ) { x++; system( "color 0C" ); cout << "Ruch gracza " << gracz1 << ": "; cin >> cyfra; if( tab[ cyfra ] == ' ' ) { tab[ cyfra ] = 'X'; znak = 'X'; plansza( tab ); if( wygrana( tab, znak ) == true ) { cout << "\n\n \n Koniec gry !\n\n\n"; return 0; } else if( x == 9 ) { cout << "\n\nREMIS !\n\n"; return 0; } } else if(( tab[ cyfra ] == 'X' ) ||( tab[ cyfra ] == 'O' ) ) { cout << "\n Nie oszukuj chciales postawic znak na zajete pole ! \n\n"; } else if(( cyfra > 9 ) ||( cyfra < 1 ) ) cout << "Nie oszukuj chciales postawic na pole ktorego nie ma\n\n"; x++; system( "color 02" ); cout << "Ruch gracza " << gracz2 << ": "; cin >> cyfra; if(( tab[ cyfra ] == ' ' ) ) { tab[ cyfra ] = 'O'; znak == 'O'; plansza( tab ); if( wygrana( tab, znak ) == true ) { cout << "\n\n \n Koniec gry !\n\n\n"; return 0; } } else if(( tab[ cyfra ] == 'X' ) ||( tab[ cyfra ] == 'O' ) ) { cout << "\n Nie oszukuj chciales postawic znak na zajete pole ! \n\n"; } else if(( cyfra > 9 ) ||( cyfra < 1 ) ) cout << "Nie oszukuj chciales postawic na pole ktorego nie ma\n\n"; } }
int main() { string imie1, imie2; int wybor = 0; char wybor2 = 't'; char tab[ 10 ]; do { system( "cls" ); system( "color 04" ); cout << "\n *********************************** "; cout << "\n ****** [Enter] START ******"; cout << "\n **** [Spacja] ZASADY ****"; cout << "\n *** [Esc] KONIEC ***"; cout << "\n ** ** "; cout << "\n ************************ \n\n\n"; wybor = getch(); switch( wybor ) { case 13: system( "cls" ); { cout << "Podaj imie gracza X\n"; cin >> imie1; system( "cls" ); cout << "Podaj imie gracza O\n"; cin >> imie2; do { ruch( tab, imie1, imie2 ); cout << "Jesli chcesz zagrac jeszcze raz napisz [t] a jesli nie dowolny przycisk\n"; cin >> wybor2; } while( wybor2 == 't' ); break; } case 32: system( "cls" ); zasady(); break; case 27: system( "cls" ); return 0; break; } } while( wybor != 13 ); return 0; }
|
|
leon_w |
» 2013-11-25 20:05:55 Ja bym tu dodał drugą tablice, z wpisanymi cyframi. Będzie bardziej widoczne która cyfra gdzie wstawi znak. No i trzeba by pomyśleć coś, żeby przy podaniu niewłaściwego lub zajętego pola, nie przechodziła kolej na następnego gracza. No i te kolory :/ masakra :P |
|
matiko101 Temat założony przez niniejszego użytkownika |
» 2013-11-25 20:32:21 odnośnie kolorów to je usunę. Myślę, że dobrym rozwiązaniem byłoby wstawić ruch gracza w pętlę której wykonywała by się dopóki nie zostaną spełnione te warunki: - Odpowiednie pole od 1 do 9 - Pole nie jest zajęte Tylko nie byłoby tych napisów że pole jest zajęte itd. i wydaje mi się że będzie to lepsze niż aktualna wersja. Jak myślisz? Nie do końca rozumiem tej drugiej tablicy na cyfry.
Sorry, za błędy ale pisze na telefonie |
|
leon_w |
» 2013-11-25 20:41:13 Jeszcze poprawa wygraną dla kółka, bo nie działa (wcześniej działała). Co do ruchu to tak jak piszesz. w pętli dać samo wprowadzanie cyfry, można dodać ifa, jeśli zajęty coś wypisuje, i jeśli poza układem też coś wpisuje. Z tą dodatkową tablicą, to chodzi mi o to, że na jednej (np lewej) odbywa się gra, a na drugiej (prawej) jest wyświetlana stale tablica, gdzie zamiast 'O' i 'X' wstawione są cyfry od 1 do 9. Wizualnie widać gdzie dana cyfra wstawi znak. Jeszcze jak gra się zakończy to nie można wyjść z programu. I przydało by się zabezpieczyć przed wstawieniem liter, bo się wykrzacza wtedy. |
|
« 1 » 2 |