Pozycja x i y karty wynika z jej pozycji w stosie - w tym przypadku mamy 4 stosy u góry... powinny być jeszcze 4 u dołu, jeśli dobrze kojarzę tę grę (nie znoszę gier karcianych
). Zatem przy rysowaniu łatwo wyliczyć ich pozycję na ekranie.
Ależ skąd. Karta może znajdować się w dowolnej pozycji na planszy. Ty zakładasz, że są stosy w ściśle określonym miejscu, nawet gdyby tak było, to i tak gdzieś trzeba by przechowywać numer stosu na którym karta się znajduje, czyli w praktyce do każdej karty zamiast pozycji na planszy musiałbym przypisać stos.
Przecież wygodniej to trzymać jako jedną długą bitmapę, która trzyma wszystkie karty. Pozycję karty w takiej bitmapie łatwo wyliczyć.
Wcale nie wygodniej, gdzieś musiałbym trzymać informacje o pozycji kart w bitmapie, a tak mam każą bitmapę oddzielnie, więc nie muszę jej
wycinać z bitmapy zbiorczej za każdym razem gdy jest mi potrzebna. Teraz wystarczy
sięgnąć po potrzebną kartę. Windows'owy pasjans również ma przechowywane karty oddzielnie.
Oczywiście, że nie muszą. Ale są lepsze i gorsze rozwiązania.
Dla mnie lepszym rozwiązaniem jest użycie mapy, która przechowuje zmieniające się pozycje kart oraz wektora którzy przechowuje nazwy identyfikatorów zasobów.
Zresztą logika programu nie potrzebuje identyfikatorów tekstowych, poza wspomnianymi nazwami zasobów, ale to się da spokojnie ominąć i uprościć.
Logika programu nie wymaga również by to były identyfikatory liczbowe, zważywszy na to, że mam do wyboru albo klucz String albo klucz int. Dzięki zastosowaniu klucza String, by sprawdzić co przechowuje dany klucz mapy lub wektor nie muszę zaglądać do tablicy String w zasobach, gdyż mogę pobrać nazwę bezpośrednio z klucza, w przeciwnym razie musiałbym pobrać z wektora numer karty a potem zajrzeć do zasobu STRINGTABLE i zobaczyć jaka jest karta pod tym numerem.
int x = vCards[numer_indeksu].LastDelimiter("_"); /* gdzie klucz to np. DAMA_PIK */
String jaki_kolor = vCards[numer_indeksu].SubString( x + 1, 4 );
String jaka_karta = vCards[numer_indeksu].SubString( 1, x - 1);
Nie rozumiem...
Patrze STRINGTABLE w zasobach id_cards.rc:
#define I9_PIK 1
#define I10_PIK 2
#define WALET_PIK 3
#define DAMA_PIK 4
#define KROL_PIK 5
#define AS_PIK 6
#define I9_KIER 7
#define I10_KIER 8
#define WALET_KIER 9
#define DAMA_KIER 10
#define KROL_KIER 11
#define AS_KIER 12
#define I9_KARO 13
#define I10_KARO 14
#define WALET_KARO 15
#define DAMA_KARO 16
#define KROL_KARO 17
#define AS_KARO 18
#define I9_TREFL 19
#define I10_TREFL 20
#define WALET_TREFL 21
#define DAMA_TREFL 22
#define KROL_TREFL 23
#define AS_TREFL 24
STRINGTABLE
BEGIN
I9_PIK "I9_PIK"
I10_PIK "I10_PIK"
WALET_PIK "WALET_PIK"
DAMA_PIK "DAMA_PIK"
KROL_PIK "KROL_PIK"
AS_PIK "AS_PIK"
I9_KIER "I9_KIER"
I10_KIER "I10_KIER"
WALET_KIER "WALET_KIER"
DAMA_KIER "DAMA_KIER"
KROL_KIER "KROL_KIER"
AS_KIER "AS_KIER"
I9_KARO "I9_KARO"
I10_KARO "I10_KARO"
WALET_KARO "WALET_KARO"
DAMA_KARO "DAMA_KARO"
KROL_KARO "KROL_KARO"
AS_KARO "AS_KARO"
I9_TREFL "I9_TREFL"
I10_TREFL "I10_TREFL"
WALET_TREFL "WALET_TREFL"
DAMA_TREFL "DAMA_TREFL"
KROL_TREFL "KROL_TREFL"
AS_TREFL "AS_TREFL"
END
Podczas tworzenia kodu rozważałem możliwości, które tutaj przedstawiłeś, jak chociażby przechowywanie w wektorze numeru identyfikatora karty, a nie nazwy zasobu, ale uznałem, że nazwa lepiej się sprawdzi. Gdybym coś zyskiwał używając tylko wektorów zamiast np. map to zrobiłbym to.
Jeżeli masz własna koncepcję to przedstaw ją, ale tak bym mógł to przetestować i sprawdzić, czy rzeczywiście jest to lepsze w ujęciu całościowym, a nie w odniesieniu tylko do jednej funkcji programu.