Gra kółko i krzyżyk - Sprawdzenie, czy jest wygrana

0
char SprawdzStan(plansza * X)//nie działa poprawnie, nie dla wszystkich
{
    int x, y, j;
    znak z;

    if(X->iteracja % 2 == 0)
        if(X->zn == Kolko)
            z = Kolko;
        else
            z = Krzyzyk;
    else
        if(X->zn == Kolko)
            z = Krzyzyk;
        else
            z = Kolko;
    for(y = 0; y < X->rozm; y++)// poziom --
        for(x = 0; x < X->rozm - X->ile + 1; x++)
            if(X->tab[x][y] == z)
                for(j = 0; (j < X->ile) && (X->tab[x + j][y] == z); j++)
                    if(j == X->ile - 1)
                    {
                        printf("x: %d y: %d j: %d znaki: %c %c %c i znak: %c\n", x, y, j, X->tab[x][x], X->tab[x+1][y], X->tab[x+2][y], z);
                        return X->tab[x][y];
                    }
    for(x = 0; x < X->rozm; x++)//pion ogólnie
        for(y = 0; y < X->rozm - X->ile + 1; y++)
            if(X->tab[x][y] == z)
            {
                for(j = 0; (j < X->ile) && (X->tab[x][y + j] == z); j++)// pion |
                    if(j == X->ile - 1)
                    {
                        printf("x: %d y: %d j: %d znaki: %c %c %c i znak: %c\n", x, y, j, X->tab[x][x], X->tab[x][y+1], X->tab[x][y+2], z);
                        return X->tab[x][y];
                    }
                if(x < X->rozm - X->ile + 1)// ukos \
                    for(j = 0; (X->tab[x + j][y + j] == z) && (j < X->ile); j++)
                        if(j == X->ile - 1)
                        {
                            printf("x: %d y: %d j: %d znaki: %c %c %c i znak: %c\n", x, y, j, X->tab[x][x], X->tab[x+1][y+1], X->tab[x+2][y+2], z);
                            printf("Warunek l: %d p: %d lp: %d\n", (j < X->ile), (X->tab[x + j][y + j] == z), (j < X->ile) && (X->tab[x + j][y + j] == z));
                            return X->tab[x][y];
                        }

                if(x >= X->ile - 1)// ukos /
                    for(j = 0; (j < X->ile) && (X->tab[x - j][y + j] == z); j++)
                        if(j == X->ile - 1)
                        {
                            printf("x: %d y: %d j: %d znaki: %c %c %c i znak: %c\n", x, y, j, X->tab[x][x], X->tab[x-1][y+1], X->tab[x-2][y+2], z);
                            return X->tab[x][y];
                        }
    }
    printf("Sprawdzenie w %d iteracji\n", X->iteracja);
    return 0;
} 

Nawet wstawiłem sobie te różne w printf. Co najdziwniejsze, w printf warunki pokazują odpowiednio: 1, 0, 0, czyli pętla for nie powinna dopuścić do tego, chyba, że operatory mi się coś pomyliły. Jak na razie działam na tablicy 3x3 i nie będę opisywał poszczególnych przypadków, lecz nie działa tak, jak powinno. Stosowałem debugger i stąd się dowiedziałem, że dla sytuacji, gdy podaję dla 1x1, potem ruch komputera, potem 1x2, ruch komputera i funkcja zwraca jakiś znak, co nie powinno się zdarzyć. Jak wypełnię w pionie 3 pola, to też nie kończy. Piszę, bo nie wiem dlaczego tak wariuje, wypisuję sobie te warunki jeszcze w printf, a for to przepuszcza. Wytłumaczy mi to ktoś?

Tablica standardowo jest wypełniona zerami, daję znak, jak jest ruch danego gracza.

1
  1. Naucz się używać debuggera
  2. Zmień ten kod tak żebyś mógł ustalić dowolne wymiary planszy oraz to ile jednakowych symboli powoduje wygraną. Czemu? Bo wtedy moze napiszesz to jak czlowiek.
1

Może wpisz "kólko krzyżyk" w wyszukiwarce tego forum. Było tego multum.

0

Różne rozmiary są zrobione, choć jak na razie tylko kwadratowe plansze, ale zmiana na prostokątne to już nie problem, ile potrzeba w linii także, lecz nie wiem, dlaczego te warunki się tak zachowują.

Umiem już ustawiać Brake Point'y dla debuggera ;']

3
  1. Nie sprawdzaj całej planszy
  2. Zacznij od miejsca gdzie wstawiono ostatni znak
  3. Policz ile takich samych znaków jest w lewo, policz ile takich samych znaków jest w prawo, dodaj te dwie liczby, powiększ o sam znak w środku i sprawdź czy to nie osiągnęło ile
  4. Jak wyżej ale w pionie
  5. Jak wyżej ale w głównej przekątnej
  6. Jak wyżej ale w dodatkowej przekątnej

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