Deklarowanie zmiennych w pętli

0

Witam

Walczę z moim programikiem do pokera i zastanawiam się czy da się zadeklarować zmienne przy użyciu pętli.
To fragment mojego kodu:

 
void pokaz_reke(){
    string moja_reka[5][2];
    for (int i = 0; i < 5; i++) {
        moja_reka[i][0] = talia[i][0];
        moja_reka[i][1] = talia[i][1];
    }
    for (int i = 0; i < 5; i++) {
        for (int j = 0; j < 2; j++) {
            cout << moja_reka[i][j]<< " ";
        }cout <<endl;
    }
    for (int i = 0; i < 5; i++) {
        for (int j = 0; j < 13; j++) {
            if(moja_reka[i][0] == wartosci[j])
                cout<< wartosci[j];
        }
    }
}

wartosci to tablica

string wartosci[13] ={"dwojka", "trojka", "czworka", "piatka", "szostka", "siodemka",
                "osemka", "dziewiatka", "dziasiatka", "walet", "dama", "krol",
                "as"};

Chciałem zliczyć wystąpienia poszczególnych kart (dwojki, trojki, czworki) na ręce żeby później sprawdzić wartość ręki. Mógłbym w funkcji pokaz_reke utworzyc zmienne:
int dwojki = 0; int trojki = 0; itd. i potem zrobić:

 
if(moja_reka[i][0] == "dwojki")
                dwojki++;

Problem w tym, że wymagałoby to 13 ifów. Czy da się jakoś zadeklarować zmienne (int dwojki, trojki itd.) z domyślną wartością 0 przy użyciu pętli?

0
int counters[13];
for(int i=0;i<13;i++){
	counters[i]=0;
}
 

lub można użyć funkcji memset do zerowania.

Tutaj dodajemy do wartości tablicy, jeżeli string pasuje do pozycji count

int count;
for(count=0;moja_reka[i][0]!=wartosci[count];++count);
if(count < 13){
	++counters[count];
}else{
	//undefined 
}
 

I na końcu zliczyć wartość, z tym że nie bardzo rozumiem ideę takiego postępowania, jaki to jest typ pokera?

1

Chciałem zliczyć wystąpienia poszczególnych kart (dwojki, trojki, czworki) na ręce żeby później sprawdzić wartość ręki. Mógłbym w funkcji pokaz_reke utworzyc zmienne:
int dwojki = 0; int trojki = 0; itd. i potem zrobić:

Możesz użyć zagnieżdżonych pętli:

  • zewnętrzna przeskakuje karty talii
  • wewnętrzna sprawdza stan na ręce.
0

Do czegoś takiego (żeby uniknąć trzynastu ifów) idealnie nadaje się mapa.

if(moja_reka[i][0] == "dwojki")
                dwojki++;

Wystarczy coś takiego:

std::map <string, int> card_list;

//tutaj tylko init
for(int i = 0; i < 13; ++i)
{
    string key = wartosci[i];
    card_list[key] = 0;
}

I ten if, ktorego nie chcesz rozpisywac zamieniamy na:

string key = moja_reka[i][0];
++card_list[key];

Dodatkowa rada: nie wklepuj tych "magic numbers" tylko zrób jakieś deklaracje odpowiednich liczb, żeby było wiadomo co i jak. Opakowanie tego w jakąś klasę byłoby idealne, chyba że chcesz/musisz zrobić to strukturalnie.

0

nie wklepuj tych "magic numbers" tylko zrób jakieś deklaracje odpowiednich liczb, żeby było wiadomo co i jak

Masz na myśli

 for (int i = 0; i < 5; i++) 

zastąpić np.

 for (int ilosc_reki = 0; ilosc_reki < 5; ilosc_reki++) 

? W sensie nazewnictwa zmiennych?

Opakowanie tego w jakąś klasę byłoby idealne, chyba że chcesz/musisz zrobić to strukturalnie.

Na razie się uczę krok po kroku. Do obiektów w C++ jeszcze nie doszedłem i na razie robię wszystko najprościej jak się da (po prostu jak mi się uda żeby działało).

0

Co do tych "magic numbers"...
Zrób np

 constexpr int iloscKartWRece = 5; 

i użyj zamiast na sztywno wpisanego rozmiaru tablicy.
W momencie gdy będziesz ponownie wracal do kodu, bądź chciał cos zmienić, będziesz miał znacznie łatwiej.

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