Kółko i krzyżyk - sprawdzanie zwycięstw

0

Napisałem taki o to kod:
//

Zasad gry "Kółko i krzyżyk" chyba nie muszę wyjaśniać :P Proszę nie patrzeć na ten syf i tym podobne, kod jest napisany na szybko, o estetykę zadbam jak będę przerabiał go na OOP, także o optymalizacje itd. Tak wiem, że lepiej byłoby enumem, że jak najmniej globalnych itd, ale jak już mówiłem, kod pisany na szybko, potem będę go systematycznie pomniejszał :)

Generalnie wszystko działa tak jak powinno, ale mam problem z zaimplementowaniem "systemu" zwycięstw, wiadomo na czym to polega. Niby zrobiłem to za pomocą IF'a, za pomocą funkcji spr_wygrana:

bool spr_wygrana()
{
    if (PLANSZA[0][0]==PLANSZA[0][1] && PLANSZA[0][0]==PLANSZA[0][2])
        stangry = win;

    else if (PLANSZA[1][0]==PLANSZA[1][1] && PLANSZA[1][0]==PLANSZA[1][2])
        stangry = win;

    else if (PLANSZA[2][0]==PLANSZA[2][1] && PLANSZA[2][0]==PLANSZA[2][2])
        stangry = win;

    [...]

Ale wiem, że to pójście po linii najmniejszego oporu i tak naprawdę wygląda to beznadziejnie, oraz znacznie zwiększa wielkość mojego kodu. WIEM także, że można to zapisać o wiele prościej, za pomocą pętli FOR - problem w tym, że nie mam pojęcia jak to zrobić.. Nie wiem za bardzo jak się za to zabrać i jak ją ułożyć, zdefiniowałem sobie wyżej tablice typu char, w której są wszystkie możliwe zwycięstwa, ale nie wiem jak to teraz sprawdzić.. Dlatego zwracam się do was o pomoc, najlepiej o poradę, która pomoże mi rozwiązać mój problem. Może i to jest banalne i wyjdę na debila, no ale naprawdę utknąłem ;d

0

Źle zdefiniowałeś tą tablice, powinno być:

struct { char y,x; } WYGRANE[][3] = { { {0,0}, {0,1}, {0,2} }, //gorny poziom
                                 { {1,0}, {1,1}, {1,2} } ,  //srodkowy poziom
                                 { {2,0}, {2,1}, {2,2} },  //dolny poziom
                                 ...

sądzę że teraz już dasz sobie rady.

0

Przecież wyraźnie napisałem, że..

WIEM także, że można to zapisać o wiele prościej, za pomocą pętli FOR - problem w tym, że nie mam pojęcia jak to zrobić.. Nie wiem za bardzo jak się za to zabrać i jak ją ułożyć

No i chyba nie mogę porównywać do siebie obiektu utworzonego za pomocą struct ze zwykłą tablicą typu char? Albo się myle

2

To oczywiste że nie wiedziałaś ponieważ miałeś pomyloną konstrukcje tablicy, teraz po wyprostowaniu powinieneś dać sobie rady.
Jak nie - to może powinieneś zapomnieć o programowaniu.

0

No to mam taką strukturkę

struct { char y,x; } WYGRANE[][3] = { { {0,0}, {0,1}, {0,2} },
                                      { {1,0}, {1,1}, {1,2} },
                                      { {2,0}, {2,1}, {2,2} },
                                      { {0,0}, {1,0}, {2,0} },
                                      { {0,1}, {1,1}, {2,1} },
                                      { {0,2}, {1,2}, {2,2} },
                                      { {0,0}, {1,1}, {2,2} },
                                      { {0,2}, {1,1}, {2,0} };

I naprawdę nie wiem jak mógłbym rozwiązać swój problem..

Muszę przelecieć pętlą po dwóch wymiarach i sprawdzać IF'em?

for (int i=0; i<3; i++)
    {
        for (int j=0; j<3; j++)
        {
             //if....
        }
    }
 

Jak to zbudować?

0

Skoro ciebie przerażają dwa fory z jednym ifem, to może jednak zrezygnuj z informatyki:

for(i=r=0;(r<sizeof(WYGRANE)/sizeof(*WYGRANE))&&(i<3);++r)
  {
   sign=PLANSZA[WYGRANE[r][0].y][WYGRANE[r][0].x];
   if(sign!=FLD_EMPTY) for(i=1;(i<3)&&(PLANSZA[WYGRANE[r][i].y][WYGRANE[r][i].x]==sign);++i) {}
  }
if(i>=3) printf("Wygrana");
0

JA nie wiem człowieku, czy ty się dowartościowujesz tym, że co drugiej osobie na tym forum piszesz "ZREZYGNUJ Z INFORMATYKI", "PROGRAMOWANIE NIE JEST DLA CIEBIE"? Zwłaszcza, że piszesz to osobom, które dopiero co zaczynają przygodę z informatyką.. Czujesz się lepszy z tego powodu czy co? To, że nie idzie ci w życiu nie oznacza, że musisz wylewać swoją frustracje i złość na użytkowników tego forum, to nie jest miłe, a ty wychodzisz w tym momencie na idiotę. Pisze na forum, w odpowiednim do tego dziale dla tzw. "noobków", bo proszę o pomoc, nie jestem nie wiadomo kim z programowania, o czym oczywiście wspomniałem, ale zawsze zjawi się taki (za przeproszeniem:) ) burak, który nie dość, że musi popsuć humor, to jeszcze zniechęca cię do kontynuowania nauki. Napisałem wyraźnie, że chciałbym prosić bardziej doświadczonych użytkowników o radę jak mógłbym napisać tą pętle, żeby pomogła mi rozwiązać mój problem, a przychodzi taki _13th_Dragon, który nie dość, że obrazi to jeszcze da gotowca i zaraz napisze (w sumie już to napisał), że nie umiem programować i powinienem najlepiej zapomnieć, że coś takiego w ogóle istnieje. To nie jest normalne, dlaczego administracja tego forum nie reaguje na takie zachowanie, macie gdzieś swoich użytkowników i tolerujecie takie zachowania? To bardzo fajnie o was świadczy. Naprawdę super, nie zdziwię się jak zaraz przyjdą inni i zmieszają mnie z błotem, za to że poczułem się dotknięty (i to nie pierwszy raz) przez komentarze tego użytkownika..

Idąc twoim durnym tokiem myślenia, jeśli źle pokroję kilka razy chleb powinienem się już za to nie zabierać! Zrezygnować z krojenia chleba! Nigdy nie wracać do tego! Przecież to jest chore, myślałem że poprzez praktykę nabywa się doświadczenia i umiejętności, a ty karzesz od razu rezygnować, co jest z Tobą nie tak?

Jakiego tematu bym nie napisał (zresztą nie tylko JA) to źle, to nie umiem, to się nie nadaję - to po cholere jest ten dział/forum, skoro nie od szukania pomocy?!

No a wracając do tematu to nie przerażają mnie AŻ dwa fory z jednym ifem, zapytałem czy tak to ma wyglądać, i jak mogę to rozwiązać, ale oczywiście już za późno bo muszę natychmiast zrezygnować z informatyki, bo przecież musze być pitolonym robotem i działać, oraz programować bezbłędnie 24/7 najlepiej :) Żenada.

0

tablica WYGRANE to zbiór możliwości wygranych, w forze sprawdzaj czy dana możliwość aktualnie wystąpiła... i twoje dwa fory są złe, bo sprawdzisz tylko 3 możliwości a jest ich więcej

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