Wątek przeniesiony 2021-10-28 19:17 z C/C++ przez Adam Boduch.

Jak zapisac funkcję, która sprawadza czy gracz wygrał. Chodzi o grę "kółko i krzyżyk"

0
void koniec_gry()
{
    if (tablica[1 && 2 && 3] == 'O')
    {
        cout << "\n\t\t Gracz O wygrywasz\n";
        false;
    }

    if (tablica[1 && 5 && 9] == 'O')
    {
        cout << "\n\t\t Gracz O wygrywasz\n";
        false;
    }

    if (tablica[4 && 5 && 6] == 'O')
    {
        cout << "\n\t\t Gracz O wygrywasz\n";
        false;
    }

    if (tablica[7 && 8 && 9] == 'O')
    {
        cout << "\n\t\t Gracz O wygrywasz\n";
        false;
    }

    if (tablica[1 && 5 && 7] == 'O')
    {
        cout << "\n\t\t Gracz O wygrywasz\n";
        false;
    }

    if (tablica[2 && 5 && 8] == 'O')
    {
        cout << "\n\t\t Gracz O wygrywasz\n";
        false;
    }

    if (tablica[3 && 8 && 9] == 'O')
    {
        cout << "\n\t\t Gracz O wygrywasz\n";
        false;
    }

    if (tablica[3 && 5 && 7] == 'O')
    {
        cout << "\n\t\t Gracz O wygrywasz\n";
        false;
    }

    // dla krzyzy
    if (tablica[1 && 2 && 3] == 'X')
    {
        cout << "\n\t\t Gracz O wygrywasz\n";
        false;
    }

    if (tablica[1 && 5 && 9] == 'X')
    {
        cout << "\n\t\t Gracz O wygrywasz\n";
        false;
    }

    if (tablica[4 && 5 && 6] == 'X')
    {
        cout << "\n\t\t Gracz O wygrywasz\n";
        false;
    }

    if (tablica[7 && 8 && 9] == 'X')
    {
        cout << "\n\t\t Gracz O wygrywasz\n";
        false;
    }

    if (tablica[1 && 5 && 7] == 'X')
    {
        cout << "\n\t\t Gracz O wygrywasz\n";
        false;
    }

    if (tablica[2 && 5 && 8] == 'X')
    {
        cout << "\n\t\t Gracz O wygrywasz\n";
        false;
    }

    if (tablica[3 && 8 && 9] == 'X')
    {
        cout << "\n\t\t Gracz O wygrywasz\n";
        false;
    }

    if (tablica[3 && 5 && 7] == 'X')
    {
        cout << "\n\t\t Gracz O wygrywasz\n";
        false;
    }
}

ja to napisalem tak ale nie wiem czy dobrze

1

Jedyne co tu jest poprawne to ogólna struktura IF'a.
Nawet komunikat o wygranej jest zły (zawsze wygrywa gracz "0") :D

btw.

  • Sprawdziłeś co robi operator "&&" i jaką zwraca wartość?
  • Jakie zadanie ma "false" przy każdym porównaniu?
0

@StachuBond9: @dziobu: operator && oznacz po polskiu i a false ma dawac wartosc pozniej do petli

7

Taki zapis nie ma prawa działać, z kilku powodów.

 if (tablica[1 && 2 && 3] == 'O')
    {
        cout << "\n\t\t Gracz O wygrywasz\n";
        false;
    }
  • Po pierwsze, tam powinno być

    return false;
    

    a na końcu, po wszystkich ifach, powinno być return true. Jeśli żaden z ifów nie złapał wygranej, to zwróć przeciwny wynik.

  • Po drugie, to co taki zapis zrobi

    tablica[1 && 2 && 3] == 'O'
    

    to zrobi tak:

    • 1 && 2, przeprowadzi boolean algebra (czyt. algebrę boolowską) - zarówno 1 oraz 2 są truth-y, więc wynikiem będzie true, a potem zrobi true && 3, znów oba są truth-y, więc wynikiem będzie true.
    • Jako że wynikimiem 1 && 2 && 3 jest true, to potem wykona się tablica[true] == 'O'. true zostanie uznane za 1, więc odczytana zostanie wartość tablica[1].

    to co musisz zrobić, to:

    if (tablica[1] == 'O' && tablica[2] == 'O' && tablica[3] == 'O')
    
  • Po trzecie, indeksy w tablicy zaczynają się od zera, więc powinieneś napisać

    if (tablica[0] == 'O' && tablica[1] == 'O' && tablica[2] == 'O')
    

Następnym krokiem zapewne byłoby napisanie tego algorytmu na pętlach, tak żeby nie pisać drabinki ifów tylko to jakoś zautomatyzować.

0

ook

dzziekluje wszystkim juz dziala

1

Ale s[prawdzanie czy gracz wygral to robisz w jednej linijce a nie ze sie rozpisujesz na 100

4
StachuBond9 napisał(a):

    if (tablica[3 && 8 && 9] == 'O')
    {
        cout << "\n\t\t Gracz O wygrywasz\n";
        false;
    }

Albo ja o czymś nie wiem, albo to jakieś nowe kółko i krzyżyk w którym trzecie, ósme i dziewiąte pole w jakiś sposób tworzą ciągłą linie. Brakuje Ci też sprawdzenia lini 1 - 4 - 7 oraz 3 - 6 - 9.

Posiadając najprostszą wersję gry i mając już wszystkie pola w jednej tablicy to samo sprawdzenie również można zrobić w dość prosty sposób - wpisz wygrywające indeksy do stałej tablicy i iteruj po niej sprawdzają tablicę z wypełnionymi polami. Nie musisz też sprawdzać dwa razy osobno dla kółka i krzyżyka skoro w tablicy już masz informację, która strona wygrała.

const std::vector<std::array<uint8_t, 3>> WINNING_IDX {
  {1,2,3}, {1,4,7}, {1,5,9} // itd
};

for(const auto &winIdx : WINNING_IDX)
{
   if(tablica[winIdx[0]] == tablica[windIdx[1]] && tablica[windIdx[1]] == tablica[windIdx[2]])
   {
      std::cout << "\n\t\t Gracz " << tablica[windIdx[0]] <<" wygrywasz\n";
      break;
   } 
}

Powyższy kod można dalej zoptymalizować, ale nie zawracaj sobie na razie tym głowy.

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