Pętla - sprawdzanie w warcabach

0

Witam,
Tak od kilku dni kombinuję o co może tutaj chodzić. Najpierw opiszę całą sytuację. Przy użyciu Allegro jest tworzone gra w warcaby angielskie - 8 na 8. Ruchy zarówno gracza pierwszego jak i drugiego działają (ograniczam się obecnie do gry człowiek vs człowiek) - to samo dotyczy damek (króli). Problem pojawia się w przypadku sprawdzania, czy w danym ruchu wymagane jest bicie - bo w tej wersji warcabów zbicie przeciwnika jest wymagane - a w przypadku wielu możliwości można wybrać dowolnie ofiarę.
Sprawdzanie, czy bicie jest wymagane jest wykonywane po poprzednim ruchu i wynik zapisywany do zmiennej globalnej (lepiej unikać zmiennych globalnych, ale to projekt w C, samodzielnie wolałbym ruszyć tutaj z programowaniem obiektowym).
A proces sprawdzania wygląda tak:
Dwie pętle, które przejdą przez wszystkie pola planszy (0..7, 0..7). W każdym obiegu pętli jest sprawdzany, który gracz ma teraz ruch, potem czy jest w danym polu pionek / dama. A potem w zależności od tego możliwe ruchy. Zresztą - dodam na końcu kod.
Ciekawe jest to, że problem jest tylko w niektórych sytuacjach - przez większą część gry cały "system" wykrywania bicia jest sprawy. Prawidłowo sprawdza czy jest bicie, jeśli jest - blokuje inne ruchy. Ale czasami jest niestety inaczej.

int CheckPawn(int x, int y)
{
    char beat = 0;
    if (player == 1)
    {
        if (planszaENG[x][y] == 1)
        {
            if ((x-2 >= 0) && (y-2 >= 0))
            {
                //w gore i w lewo
                if (((planszaENG[x-1][y-1] == 2) || (planszaENG[x-1][y-1] == 4)) && (planszaENG[x-2][y-2] == 0))
                    return 1;
            }
            if ((x-2 >= 0) && (y+2 <= 7))
            {
                //w gore i w prawo
                if (((planszaENG[x-1][y+1] == 2) || (planszaENG[x-1][y+1] == 4)) && (planszaENG[x-2][y+2] == 0))
                    return 1;
            }
        }
        else if (planszaENG[x][y] == 3)
        {
            if ((x-2 >= 0) && (y-2 >= 0))
            {
                if (((planszaENG[x-1][y-1] == 2) || (planszaENG[x-1][y-1] == 4)) && (planszaENG[x-2][y-2] == 0))
                    return 1;
            }
            else if ((x-2 >= 0) && (y+2 <= 7))
            {
                if (((planszaENG[x-1][y+1] == 2) || (planszaENG[x-1][y+1] == 4)) && (planszaENG[x-2][y+2] == 0))
                    return 1;
            }
            else if ((x+2 <= 7) && (y-2 >= 0))
            {
                if (((planszaENG[x+1][y-1] == 2) || (planszaENG[x+1][y-1] == 4)) && (planszaENG[x+2][y-2] == 0))
                    return 1;
            }
            else if ((x+2 <= 7) && (y+2 <= 7))
            {
                if (((planszaENG[x+1][y+1] == 2) || (planszaENG[x+1][y+1] == 4)) && (planszaENG[x+2][y+2] == 0))
                    return 1;
            }
        }
    }
    else if (player == 2)
    {
        if (planszaENG[x][y] == 2)
        {
            if ((x+2 <= 7) && (y-2 >= 0) )
            {
                if (((planszaENG[x+1][y-1] == 1) || (planszaENG[x+1][y-1] == 3)) && (planszaENG[x+2][y-2] == 0))
                    return 1;
            }
            else if ((x+2 <= 7) && (y+2 <= 7))
            {
                if (((planszaENG[x+1][y+1] == 1) || (planszaENG[x+1][y+1] == 3)) && (planszaENG[x+2][y+2] == 0))
                    return 1;
            }
        }
        else if (planszaENG[x][y] == 4)
        {
            if ((x-2 >= 0) && (y-2 >= 0))
            {
                if (((planszaENG[x-1][y-1] == 1) || (planszaENG[x-1][y-1] == 3)) && (planszaENG[x-2][y-2] == 0))
                    return 1;
            }
            else if ((x-2 >= 0) && (y+2 <= 7))
            {
                if (((planszaENG[x-1][y+1] == 1) || (planszaENG[x-1][y+1] == 3)) && (planszaENG[x-2][y+2] == 0))
                    return 1;
            }
            else if ((x+2 <= 7) && (y-2 >= 0))
            {
                if (((planszaENG[x+1][y-1] == 1) || (planszaENG[x+1][y-1] == 3)) && (planszaENG[x+2][y-2] == 0))
                    return 1;
            }
            else if ((x+2 <= 7) && (y+2 <= 7))
            {
                if (((planszaENG[x+1][y+1] == 1) || (planszaENG[x+1][y+1] == 3)) && (planszaENG[x+2][y+2] == 0))
                    return 1;
            }
        }
    }
    return 0;
}

int RequiredBeat()
{
    int x,y;
    int beat = 0;
        int licznik = 0;

    for(x=0; x<8; x++)
    {
        for(y=0; y<8; y++)
        {
            licznik = licznik+1;
            if (CheckPawn(x,y) != 0 )
                return 1;
        }
    }
    printf("Licznik: %d\n",licznik);
    //printf("\n");
    return 0;
}

planszaENG[x][y] - to moja tablica, przechowująca stan planszy. Gdzie : "x" to wiersz, a "y" to kolumna.
Jeśli w danym polu tabeli jest "1" - jest tam pionek gracza pierwszego. "2" - pionek gracza drugiego. "3" - dama gracza pierwszego i "4" - dama gracza drugiego.
Jest tutaj trochę niepotrzebnych pętli - takich jak licznik, beat i inne tego typu - ale to dodawałem aby przetestować czy pętla przechodzi przez wszystkie pola itp.

Warunki typu

if ((x-2 >= 0) && (y-2 >= 0)) 

mają za zadanie sprawdzić, czy ruch taki jest fizycznie możliwy - bez tego warunku sprawdzałoby pola w całkiem innych kolumnach czy wierszach.

Proszę o pomoc, bo sam nad tym siedzę dosyć długo i nie mogę znaleźć błędu tutaj. A błąd jest pewnie jakiś taki "głupi"...

Przy okazji jeszcze - zauważyłem, że w "lewej" części planszy działa to poprawnie - tzn. y od 0 do 3 włącznie. Gdy y >= 4 oraz ruch jest w prawo (y+1) to nie działa wtedy to.

0

Odpal debuger i powodzenia. Wątpię zeby ktoś tego spaghetti chciał tykać. Następnym razem napisz ten kod jak człowiek.

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