Funkcja sprawdzająca wynik (remis)

0

Witam. Mam następujący problem. W swojej konsolowej grze Kółko i krzyżyk warunkiem petli do...while jest bool czyKoniec(). Otoz mam opracowane, co sie stanie jesli wygra gracz X lub O. Jednakze nie wiem, jak zrobić, aby kiedy nie będą zapełnione 3 dane miejsca krzyżykiem lub kółkiem w taki sposób, aby wygrać - czyli tutaj chodzi o remis. Oto (myśle) potrzebny kod:

bool czyKoniec()
{
    if((tablica[0][0] == 'X' && tablica[0][1] == 'X' && tablica[0][2] == 'X')//poziomo gora
        || (tablica[1][0] == 'X' && tablica[1][1] == 'X' && tablica[1][2] == 'X')//poziomo srodek
        || (tablica[2][0] == 'X' && tablica[2][1] == 'X' && tablica[2][2] == 'X')//poziomo dol
        || (tablica[0][0] == 'X' && tablica[1][0] == 'X' && tablica[2][0] == 'X')//pionowo lewo
        || (tablica[0][1] == 'X' && tablica[1][1] == 'X' && tablica[2][1] == 'X')//pionowo srodek
        || (tablica[0][2] == 'X' && tablica[1][2] == 'X' && tablica[2][2] == 'X')//pionowo prawo
        || (tablica[0][0] == 'X' && tablica[1][1] == 'X' && tablica[2][2] == 'X')// ukosy
        || (tablica[0][2] == 'X' && tablica[1][1] == 'X' && tablica[2][0] == 'X')// ukosy
       // --------------------------------------------------------------------------------------
        || (tablica[0][0] == 'O' && tablica[0][1] == 'O' && tablica[0][2] == 'O')//poziomo gora
        || (tablica[1][0] == 'O' && tablica[1][1] == 'O' && tablica[1][2] == 'O')//poziomo srodek
        || (tablica[2][0] == 'O' && tablica[2][1] == 'O' && tablica[2][2] == 'O')//poziomo dol
        || (tablica[0][0] == 'O' && tablica[1][0] == 'O' && tablica[2][0] == 'O')//pionowo lewo
        || (tablica[0][1] == 'O' && tablica[1][1] == 'O' && tablica[2][1] == 'O')//pionowo srodek
        || (tablica[0][2] == 'O' && tablica[1][2] == 'O' && tablica[2][2] == 'O')//pionowo prawo
        || (tablica[0][0] == 'O' && tablica[1][1] == 'O' && tablica[2][2] == 'O')// ukosy
        || (tablica[0][2] == 'O' && tablica[1][1] == 'O' && tablica[2][0] == 'O')){

        return false;
    }

//-- tutaj jakis jeszcze else if na remis ?

    return true;
}// -----------------------------------------------------------

Czy teraz, aby umieścić możliwość sprawdzenia remisu muszę walnąć jakiegoś else if'a ? Jeśli tak, to jak to ma wyglądać ?

0

Dziwna ta funkcja czyKoniec(), jak są trzy 'X' w rzędzie to gra się nie kończy?
Możesz pozwolić grać w sytuacji gdy są jeszcze wolne pola, ale nikt już nie może wygrać. Dodaj po prostu warunek, że gra się kończy gdy wszystkie pola są wypełnione.

1

@Borek23 czy słyszałeś o czymś takim jak pętle?

0
_13th_Dragon napisał(a):

@Borek23 czy słyszałeś o czymś takim jak pętle?

i funkcje bo ten warunek co tutaj wlepiłeś jest tak naprawdę zdublowany. Zamiast rozpatrywać w jednym warunku czy masz trójkę kółek lub krzyżyków rozpatrz to ogólniej. Sprawdź czy masz w ogóle jakąś trójkę znaków, a potem podstaw odpowiednio kółeczko i krzyżyk.

0
bogdans napisał(a):

Dziwna ta funkcja czyKoniec(), jak są trzy 'X' w rzędzie to gra się nie kończy?

Oczywiście, że się kończy - przecież tam są warunki do każdej kombinacji.

_13th_Dragon napisał(a):

@Borek23 czy słyszałeś o czymś takim jak pętle?

Hmm, prawdopodobnie użycie pętli jest bardziej efektowne, lecz wydaje mi się, iż dla mnie byłoby to za dużo roboty ( poza tym nie wiem jak miałoby to wyglądać :P ).

kik napisał(a):
_13th_Dragon napisał(a):

@Borek23 czy słyszałeś o czymś takim jak pętle?

i funkcje bo ten warunek co tutaj wlepiłeś jest tak naprawdę zdublowany. Zamiast rozpatrywać w jednym warunku czy masz trójkę kółek lub krzyżyków rozpatrz to ogólniej. Sprawdź czy masz w ogóle jakąś trójkę znaków, a potem podstaw odpowiednio kółeczko i krzyżyk.

Masz na myśli, to iż jeżeli są dopiero trzy kółka lub trzy krzyżyki w całej tablicy to dopiero ma sprawdzać, czy ta trójka układa wymagany odpowiedni ciąg ?

fasadin napisał(a):

http://www.cs.put.poznan.pl/arybarczyk/Kurs%20C++.pdf
od 138 strony

Dzięki, na pewno skorzystam i pewnie tamtymi sposobami będę się kierował ;].

0
Borek23 napisał(a):

Masz na myśli, to iż jeżeli są dopiero trzy kółka lub trzy krzyżyki w całej tablicy to dopiero ma sprawdzać, czy ta trójka układa wymagany odpowiedni ciąg

nie, mam na myśli takie coś:

bool sprawdz(znak) {
    sprawdzenie wszystkich kombinacji wystąpienia trójek znak
}

wywołanie sprawdz(kolko) oraz sprawdz(krzyzyk) - już masz 2x mniej warunków i przy okazji osobno rozpatrzone dla kółka i dla krzyżyka, a nie w jednym warunku or'ami zsumowane. Zwróć uwagę, że w twoim kodzie z pierwszego postu masz w zasadzie dwa razy wypisany ten sam kod, różniący się tylko 'X' lub 'O'. Należy unikać zbędnych powtórzeń kodu i klepania w stylu kopiegopasta. Moja sugestia jest czymś w rodzaju "wyciągnięcia wspólnego czynnika przed nawias", czyli wyodrębnienie powtarzającego się kodu w funkcje i potem jej dwukrotne wywołanie. Plus takiego zastosowania? Gdy będziesz chciał zmienić zasady gry (np na plansze 5x5) to dokonujesz w tym miejscu 2x mniej zmian, a co za tym idzie masz dużo mniejszą szansę na pomyłkę, a do tego należy dążyć.

0

Teraz rozumiem co masz na myśli - po prostu dostosowuje warunki do argumentu - racja to jest jedna z tych rzeczy, które muszę poprawić. na razie zagłębiam się w powyższym kursie w celu znalezienia odpowiedzi na moje pytanie.

0
Borek23 napisał(a):

Masz na myśli, to iż jeżeli są dopiero trzy kółka lub trzy krzyżyki w całej tablicy to dopiero ma sprawdzać, czy ta trójka układa wymagany odpowiedni ciąg ?
On coś innego miał na myśli ale zauważ że jeżeli postawiłem kółko w [0][1] to ma sens sprawdzić tyko kółka i to tylko:

[0][0] [0][1] [0][2]
       [1][1]
       [2][1]

Nigdzie indziej trójka nie może powstać.

Sprawdzasz: trójkę w [0..2][X], trójkę w [Y][0..2], główną przekątną jeżeli X==Y, drugą przekątną jeżeli X==2-Y;
Max 4 sprawdzenia, a ty robisz 16 !

0

Okej, tutaj także teraz rozumiem o co chodzi i rzeczywiście jest to o wiele wydajniejszy sposób. Dzięki za takie "drobne" uwagi - przydadzą się.

1 użytkowników online, w tym zalogowanych: 0, gości: 1