Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[C++] Kółko i krzyżyk -

Ostatnio zmodyfikowano 2015-06-02 21:32
Autor Wiadomość
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:

C/C++
class Gra {
    char ** tablica;
    int rozmiar, ile; //ile - ilosc w rzedzie, ktora wygrywa
    int w, k; //wiersz,kolumna
    char kto;
public:
    Gra( int, int );
    ~Gra();
    void ruch( int, int );
    bool czy_kolko();
    bool czy_w_linii();
   
};

main:
C/C++
do {
    cout << endl << endl << "Ruch gracza  ";
    if( plansza.czy_kolko() == true ) cout << "kolko";
    else cout << "krzyzyk";
   
    cout << endl;
    cin >> w >> k; //wiersz,kolumna
    plansza.ruch( w, k );
    plansza.czy_w_linii();
    plansza.wyswietl_tablice();
} while( plansza.czy_w_linii() == false );


Metody:

C/C++
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.
P-133089
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
.
P-133090
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:

C/C++
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;
}
P-133091
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.
P-133092
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.
P-133093
notabigthreat
» 2015-06-02 19:55:50
A skąd się wzięły
w
 i
k
?
P-133095
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 )
.
P-133097
notabigthreat
» 2015-06-02 20:23:32
Czyli, że kod sprawdza tylko ostatni wiersz, ostatnią kolumnę i dwie przekątne?
P-133099
« 1 » 2
  Strona 1 z 2 Następna strona