• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Warcaby w języku c

Aruba Cloud - Virtual Private Server VPS
0 głosów
89 wizyt
pytanie zadane 13 stycznia w C i C++ przez adam234345 Początkujący (400 p.)

Hej piszę gre warcaby w języku c, napisałem kilka funkcji, ale niestety coś nie działa, szukałem chwile i nie moge znaleźć błędu, główny problemem jest to że cały czas wyskakuje niepoprawny ruch, a wczęsniej jak pokazywało poprawny ruch to plansza się nie aktualizowała, z góry bardzo dziękuje za pomoc 

#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<time.h>
#include<string.h>



void stworzenieplanszy(char plansza[8][8])

{
    char planszapocz[8][8] =
    {
        {' ','o',' ','o',' ','o',' ','o'},
        {'o',' ','o',' ','o',' ','o',' '},
        {' ','o',' ','o',' ','o',' ','o'},
        {' ',' ',' ',' ',' ',' ',' ',' '},
        {' ',' ',' ',' ',' ',' ',' ',' '},
        {'x',' ','x',' ','x',' ','x',' '},
        {' ','x',' ','x',' ','x',' ','x'},
        {'x',' ','x',' ','x',' ','x',' '}
    };
        //przekazywanie wartosci
    for (int i = 0; i < 8; i++) {
        for (int j = 0; j < 8; j++) {
            plansza[i][j] = planszapocz[i][j];
        }
    }
}

void wyswietlenieplanszy(char plansza[8][8])
{
    printf("  a b c d e f g h\n"); // oznaczenie kolumny
    for (int i = 0; i < 8; i++) {
        printf("%d ", i + 1);  // oznaczenie wiersze
        for (int j = 0; j < 8; j++) {
            printf("%c ", plansza[i][j]);
        }
        printf("\n");
    }
}



void poczatek()
{
    printf("tekst 1\n");
    printf("tekst 2\n");
    printf("tekst 3\n");
    printf("\n\n\n");


}


int czymapionki(char gracz, char graczdamka, char plansza[8][8])
{
        for (int i = 0; i < 8; i++)
            {
            for (int j = 0; j < 8; j++)
            {
                if (plansza[i][j] == gracz || plansza[i][j] == graczdamka)
                    {
                    return 1;  // sa jeszcze pionki
                    }
            }
        }
        return 2;  // nie ma pionkow
    }



void zamianaliter(const char *coord, int *x, int *y)
{
    *x = coord[0] - 'a';  // Z literki 'a'-'h' na indeks 0-7
    *y = 8 - (coord[1] - '0');  // Z cyfry '1'-'8' na indeks 7-0
}




int czypoprawnyruch(char plansza[8][8], int poczx, int poczy, int konx, int kony, char gracz)
{
    //  czy ruch jest po przekatnej
    if (konx - poczx != 1 || kony - poczy != 1)
        {
        return 0; // Ruch nie jest po przekatnej o 1
        }

    //  czy docelowe pole jest puste
    if (plansza[konx][kony] != ' ')
        {
        return 0; //docelowe pole nie jest puste
        }

    // czy koñcowe pole nie jest zajete przez pionek gracza
    if (plansza[konx][kony] == gracz)
        {
        return 0; // Na koñcowym polu jest juz pionek gracza
        }

    if (konx >= poczx || kony != poczy + 1)
        {
        return 0; // Ruch nie jest w góre planszy lub nie jest po przekatnej
        }

    // Ruch jest poprawny
    return 1;
}




int czymoznazbic(char plansza[8][8], int poczx, int poczy, int konx, int kony, char gracz, char komputer)
{
    // Sprawdzamy, czy ruch jest o dwa pola po przekatnej
    if (abs(konx - poczx) != 2 || (kony - poczy) != 2)
    {
        return 0; // Ruch musi byc o dwa pola
    }

    // Sprawdzamy, czy pole koñcowe jest puste
    if (plansza[konx][kony] != ' ') {
        return 0; // Koñcowe pole nie jest puste
    }

    // Sprawdzamy, czy na polu poprednim znajduje sie pionek przeciwnika
    int srodx = (poczx + konx) / 2;
    int srody = (poczy + kony) / 2;

    if (plansza[srodx][srody] != komputer) {
        return 0; // Jezeli na srodku nie ma pionka przeciwnika, nie mozna wykonac bicia
    }

    // Bicie jest mozliwe
    return 1;
}



void wykonanieruchu(char plansza[8][8], int poczx, int poczy, int konx, int kony) {
    char temp = plansza[poczx][poczy]; // Zapamietujemy pionek, który wykonuje ruch
    plansza[poczx][poczy] = ' '; // Usuwamy pionek ze starej pozycji
    plansza[konx][kony] = temp; // Ustawiamy pionek na nowej pozycji
}


void wykonaniebicia(char plansza[8][8], int poczx, int poczy, int konx, int kony)
{
    char temp = plansza[poczx][poczy]; // Zapamietujemy pionek, który wykonuje ruch
    int srodx = (poczx + konx) / 2;
    int srody = (poczy + kony) / 2;

    plansza[poczx][poczy] = ' '; // Usuwamy pionek ze starej pozycji
    plansza[srodx][srody] = ' '; // Usuwamy zbitego pionka przeciwnika
    plansza[konx][kony] = temp; // Ustawiamy pionek na nowej pozycji
}








void ruchgracza(char plansza[8][8], char gracz, char komputer)
{
    char poczkord[3], konkord[3]; // Tablica na wspolrzedne w formacie np. "a2"
    int poczx, poczy, konx, kony;

    // Prosba o wprowadzenie wspolrzêdnych
    printf("WprowadŸ wspó³rzêdne pocz¹tkowe (np. a2): ");
    scanf("%s", poczkord);
    printf("WprowadŸ wspó³rzêdne koñcowe (np. a4): ");
    scanf("%s", konkord);

    // Zamiana wspólrzêdnych startowych i koncowych
    zamianaliter(poczkord, &poczx, &poczy);
    zamianaliter(konkord, &konx, &kony);

    if (czypoprawnyruch(plansza, poczx, poczy, konx, kony, gracz))
        {
        // Zwykly ruch
        wykonanieruchu(plansza, poczx, poczy, konx, kony);
        printf("Ruch wykonany.\n");
        }
    else if (czymoznazbic(plansza, poczx, poczy, konx, kony, gracz, komputer))
        {
        // Zbicie
        wykonaniebicia(plansza, poczx, poczy, konx, kony);
        printf("Zbicie wykonane.\n");
        }
    else
        {
        printf("Niepoprawny ruch!\n");
        }
}




























void ruchkomputera()
{

}








int main()

{

    poczatek();

    char plansza[8][8];
    stworzenieplanszy(plansza);

    wyswietlenieplanszy(plansza);

    while(1)
    {

        ruchgracza(plansza, 'x', 'o');
        wyswietlenieplanszy(plansza);







         if (czymapionki('o','O', plansza)==2)
            {
            printf("Gratulacje! Wygrales przeciwnik nie ma juz pionkow.\n");
            break;
            }
        if (czymapionki('x', 'X', plansza)==2)
            {
            printf("Niestety! Przegrales nie masz juz pionkow.\n");
            break;
            }

    }

    printf("Gra zakonczona");








    return 0;
}

 

komentarz 13 stycznia przez adrian17 Mentor (352,580 p.)
Zrób sobie osobnego printf'a przy każdym warunku sprawdzanym przez `czypoprawnyruch`.

Na oko co najmniej kilka wygląda dziwnie, na przykład `konx - poczx != 1` i `konx >= poczx` - pierwszy stwierdza że zły ruch gdy nie ruszyłeś w prawo, a drugi gdy ruszyłeś w prawo - oba są błędne.
komentarz 13 stycznia przez adam234345 Początkujący (400 p.)
na początek chce zrobić tylko w jednym kierunku
komentarz 13 stycznia przez adam234345 Początkujący (400 p.)

@adrian17, sprawdziłem z printf, tak jak powiedziałeś i znalazłem błąd, teraz problemem jest to że plansza się nie aktualizuje

 

komentarz 13 stycznia przez adrian17 Mentor (352,580 p.)
Zgaduję że drugi problem jaki masz, to że jak masz taką tablicę z koordynatami, to je się indeksuje [y][x], a nie [x][y]. Najpierw są rzędy, a każdy rząd ma komórki.

I wrzucaj proszę zaktualizowany kod jak znowu coś pójdziesz do przodu i będzie nowy problem.
komentarz 13 stycznia przez adam234345 Początkujący (400 p.)
wydaje mi się że masz racje, ale nie wiem jak to zmienić, poza tym chyba funkcja wykonywanieruchu też nie działa

Zaloguj lub zarejestruj się, aby odpowiedzieć na to pytanie.

Podobne pytania

0 głosów
2 odpowiedzi 197 wizyt
pytanie zadane 5 listopada 2024 w C i C++ przez adam234345 Początkujący (400 p.)
0 głosów
1 odpowiedź 236 wizyt
pytanie zadane 19 sierpnia 2022 w C i C++ przez benny13 Obywatel (1,150 p.)
0 głosów
0 odpowiedzi 193 wizyt
pytanie zadane 17 marca 2022 w C i C++ przez benny13 Obywatel (1,150 p.)

93,327 zapytań

142,325 odpowiedzi

322,396 komentarzy

62,657 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Wprowadzenie do ITsec, tom 1 Wprowadzenie do ITsec, tom 2

Można już zamawiać dwa tomy książek o ITsec pt. "Wprowadzenie do bezpieczeństwa IT" - mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy aż 15% zniżki! Dziękujemy ekipie Sekuraka za fajny rabat dla naszej Społeczności!

...