Tasowanie kart - tablica dwuwymiarowa.

0

Cześć wszystkim! Temat zakładam, gdyż inne o tasowaniu nie odpowiedziały na moje pytania. Wykonuję projekt gry "wojna", jestem na etapie algorytmu tasującego karty. Posługuję się tablicą dwuwymiarową:

int tab1[52][3]=
{{2,0,1},{2,0,2},{2,0,3},{2,0,4},
{3,0,1},{3,0,2},{3,0,3},{3,0,4},
{3,0,1},{3,0,2},{3,0,3},{3,0,4},
{4,0,1},{4,0,2},{4,0,3},{4,0,4},
{5,0,1},{5,0,2},{5,0,3},{5,0,4},
{6,0,1},{6,0,2},{6,0,3},{6,0,4},
{7,0,1},{7,0,2},{7,0,3},{7,0,4},
{8,0,1},{8,0,2},{8,0,3},{8,0,4},
{9,0,1},{9,0,2},{9,0,3},{9,0,4},
{10,0,1},{10,0,2},{10,0,3},{10,0,4},
{11,0,1},{11,0,2},{11,0,3},{11,0,4},
{12,0,1},{12,0,2},{12,0,3},{12,0,4},
{13,0,1},{13,0,2},{13,0,3},{13,0,4}
};

Pierwsza kolumna: figura karty;
Druga kolumna: wartości 0 (karta nie była tasowana) i 1(karta była tasowana);
Trzecia kolumna: kolor karty;

Oto kod tasowania:

int los = 0;
int tabtemp[52][3]; //tablica pomocnicza do zmiany wartosci

for(int i = 0 ; i<52 ; i++)
{
    los = (rand()%52)+0;    //losujemy dana liczbe z przedzialu i przypisujemy ja do zmiennej los

    for(int j = 0 ; j<3 ; j++)
    {
        if((tab1[los][1])==0)   //sprawdzenie czy dana karta byla juz losowana (sprawdzajac druga kolumne)
        {
            tab1[i][j] = tabtemp[los][j]; //tasowanie
            tab1[i][1]=1;    //zmiana kolumny drugiej na wartość 1, żeby wiersz nie był więcej tasowany;

            cout << "WIERSZ(i): " << los << " AND KOLUMNA(j): " << j << " WYNOSI " << tab1[los][j] << endl;
        }
    }
}

Problem polega na tym, że tasowane karty powtarzają się, pomimo warunku. Nie potrafię stwierdzić, gdzie leży przyczyna błędu. Próbowałem także wrzucić ten warunek jeszcze w pierwszej pętli, by druga wykonała się tylko przy spełnieniu go, ale wtedy także niczym to nie poskutkowało. Proszę Was o pomoc ;)

0

Gdy sprawdzasz czy została już losowana sprawdzasz tab[los][1] == 0 ale gdy potrzebujesz ustawić tą flagę ustawiasz tab[i][1] = 1 przez co działasz na dwóch innych kartach.

0

Dobrze, ale czy czasem ta linijka:

tab1[i][j] = tabtemp[los][j];

nie powinna załatwić tego problemu? Zmienia indeks głównej na indeks tymczasowej. Spróbowałem pozmieniać i nadal nie znalazłem rozwiązania, pustka w głowie

0

Na pewno nie załatwi problemu, lepiej - stworzy problemy.

Tablica tabtemp nie jest zainicjalizowana więc do tab[i][j] przypisujesz śmieci.

2

Używaj zmiennych i stałych, których nie musisz tłumaczyć, a nie magicznych liczb. C++ ma enumeratory, nie ma wytłumaczenia dlaczego z nich nie korzystasz. A do losowania użyj std::shuffle, nagle okaże się, że nie trzeba się martwić o niepoprawne tasowanie.

0

Wiem, że mogłem skorzystać z enum, ale moim zadaniem jest zrobienie tego za pomocą tablic ;)
@atmal , mam przypisać do tabtemp to co jest w tablicy tab1, i pokombinować z tym if'em, tak?

1

Ale co ma enum do tablic?

0

OK, może enum to za dużo, ale stałe to chyba wam wolno stosować?
No i funkcje to pewnie są na drugich zajęciach z programowania dla księgowych, więc polecam zaimplementować swap() i zajrzeć do sugerowanej wyżej implementacji (najprościej w random_shuffle).

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