akow1990 Temat założony przez niniejszego użytkownika |
[C++] Kółko i krzyżyk - » 2015-06-02 18:42:41 Witam, piszę aktualnie grę kółko-krzyżyk. Kod się kompiluje, jednak nie zmienia gracza, tzn. zamiast naprzemiennej kolejności gracza "kółka" i gracza "krzyżyka" cały czas jest kolej gracza "krzyżyka". Kod: klasa: class Gra { char ** tablica; int rozmiar, ile; int w, k; char kto; public: Gra( int, int ); ~Gra(); void ruch( int, int ); bool czy_kolko(); bool czy_w_linii(); };
main: do { cout << endl << endl << "Ruch gracza "; if( plansza.czy_kolko() == true ) cout << "kolko"; else cout << "krzyzyk"; cout << endl; cin >> w >> k; plansza.ruch( w, k ); plansza.czy_w_linii(); plansza.wyswietl_tablice(); } while( plansza.czy_w_linii() == false );
Metody: bool Gra::czy_kolko() { bool kolko; if(( this->kto ) == 'x' ) kolko = false; if(( this->kto ) == 'o' ) kolko = true; return kolko; }
void Gra::ruch( int wiersz, int kolumna ) { this->w = wiersz; this->k = kolumna; if( tablica[ wiersz ][ kolumna ] == ' ' ) { if( czy_kolko() == false ) { tablica[ wiersz ][ kolumna ] = 'x'; this->kto = 'o'; } if( czy_kolko() == true ) { tablica[ wiersz ][ kolumna ] = 'o'; this->kto = 'x'; } } else cout << endl << "Niewlasciwy ruch!" << endl; }
Z góry dziękuję za pomoc. |
|
notabigthreat |
» 2015-06-02 18:53:04 Witaj na forum. W trzecim fragmencie błąd, wywołujesz dwa razy czy_kolko() , a pomiędzy tym zmieniasz wartość kto . |
|
akow1990 Temat założony przez niniejszego użytkownika |
» 2015-06-02 19:12:54 Oczywiście, else załatwia sprawę:) Wielkie dzięki Teraz z kolei chodzi o metodę sprawdzającą czy nastąpiła wygrana. Z założenia użytkownik sam decyduje, ile znaków ułożonych w rzędzie wygrywa (rozmiar planszy również jest definiowany przez użytkownika), np.jeśli użytkownik chce, aby wystarczyło ułożyć 3 znaki, po ich ułożeniu powinno zostać zwrócone true i pętla w main powinna się zakończyć. Tak się jednak nie dzieje, po wprowadzeniu tych trzech znaków pętla działa dalej. Kod: bool Gra::czy_w_linii() { bool w_linii = false; char znak = this->kto; int poziom = 0, pion = 0, przek = 0, przek_2 = 0; for( int i = 0; i < rozmiar; ++i ) { if( tablica[ w ][ i ] == znak ) ++poziom; if( tablica[ i ][ k ] == znak ) ++pion; if( tablica[ i ][ i ] == znak ) ++przek; if( tablica[ i ][ rozmiar - 1 - i ] == znak ) ++przek_2; } if(( poziom == ile ) ||( pion == ile ) ||( przek == ile ) ||( przek_2 == ile ) ) { w_linii = true; } return w_linii; }
|
|
notabigthreat |
» 2015-06-02 19:30:16 Nie mam pojęcia co ma to robić, ale powiem, że pewnie by zadziałało, gdybyś sprawdzał osobno:
kolumny wiersze przekątne \ przekątne /
Kilku pierwszych i ostatnich przekątnych można nie sprawdzać, bo i tak nie mają szans. |
|
akow1990 Temat założony przez niniejszego użytkownika |
» 2015-06-02 19:42:51 Ta funkcja ma sprawdzać, czy dany znak wystąpił tyle razy, ile wystarczy,żeby wygrać ( zmienna ile). Po kolei zliczam, ile powtórzeń danego znaku występuje kolejno w poziomie (wiersze ), pionie (kolumny ) przekątnej / i przekątnej \. Jeśli chociaż jedna z tych liczb jest równa ile, wtedy wystąpiła wygrana. Zliczam w wierszu/kolumnie, do którego wstawiam znak. Fakt, zliczam tylko główne przekątne, mój błąd, którym zajmę się później. |
|
notabigthreat |
» 2015-06-02 19:55:50 |
|
akow1990 Temat założony przez niniejszego użytkownika |
» 2015-06-02 20:09:16 Pobieram je od użytkownika w mainie, używam w metodzie ruch( int, int ) . |
|
notabigthreat |
» 2015-06-02 20:23:32 Czyli, że kod sprawdza tylko ostatni wiersz, ostatnią kolumnę i dwie przekątne? |
|
« 1 » 2 |