Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Inventory - Czyli zawartość plecaka w grze RPG

Ostatnio zmodyfikowano 2024-08-15 17:08
Autor Wiadomość
pekfos
» 2024-08-07 16:45:04
I co z tym? Wygląda tragicznie i nie robi tego co napisałeś, ale problemów za bardzo nie widać.
P-181425
tBane
Temat założony przez niniejszego użytkownika
» 2024-08-07 16:48:23
Tworzy posortowaną listę itemów sortedItems w oparciu o uporządkowaną listę itemów items i działa. Wrzuciłem kod na wypadek jakby ktoś kiedyś (zapewne ja) potrzebował

RPG2D
RPG2D
P-181426
pekfos
» 2024-08-07 17:43:56
Wrzuciłem kod na wypadek jakby ktoś kiedyś (zapewne ja) potrzebował
Z trudem domyśliłem się o co tu może chodzić, wiec nie miej nadziei że to się komuś przyda, zwłaszcza wrzucone w niemal niezwiązany temat. Już lepiej wrzucaj takie wyrywki na githuba. Skoro już wrzuciłeś to w miejsce które służy do dyskusji i napisałem że ten kod jest tragiczny, to przepiszę go wg mojego zrozumienia:
C/C++
// "Posortowane" znaczy przefiltrowane po typach z `items`, w kolejności określonej przez `items`. Wskaźniki w `items` są unikalne, w `inventory->items` niekoniecznie.
std::map < Item *, int > counts;
for( int i = 0; i < inventory->items.size(); i++ )
   
 counts[ inventory->items[ i ] ] += inventory->counts[ i ]; // Zsumuj ilości wszystkich przedmiotów danego typu (identyfikowanego przez wskaźnik Item*).

std::vector < Item * > sortedItems; // Czemu 2 kontenery a nie jeden???? Brzmi jak niepotrzebne utrudnienie przez konieczność utrzymania spójności
std::vector < int > sortedItemsCounts;

for( auto & item: items ) {
   
auto it = counts.find( item );
   
if( it != counts.end() && it->second > 0 ) {
       
sortedItems.push_back( item );
       
sortedItemsCounts.push_back( it->second );
   
}
}
P-181427
tBane
Temat założony przez niniejszego użytkownika
» 2024-08-07 19:27:08
Tylko, że inventory->items ma unikalne itemy. Ale dzięki za radę :-)
P-181428
pekfos
» 2024-08-07 21:32:30
Unikalne wartości wskaźników? Wtedy to można zrobić jeszcze prościej. Sądziłem że to wskazuje na typ przedmiotu i wskaźnik robi za identyfikator typu, tj przedmiot w plecaku w ilości 3 i przedmiot w skrzyni w ilości 1 mają ten sam adres i te sortowanie ma służyć np scaleniu ich w jeden slot z ilością 4. Ale jak to wskazuje na egzemplarz przedmiotu, to zamiast sumowania można by dać przypisanie, bo nigdy nie będziesz dodawać dwóch niezerowych wartości. Nie wiem też czemu wtedy nie dasz count jako pola w Item, zamiast trzymać ilości w osobnym kontenerze.
P-181429
tBane
Temat założony przez niniejszego użytkownika
» 2024-08-07 22:44:24
to znaczy nie. Inventory->items to zawsze wskaźniki na itemy, które są w liście items, a inventory->counts to ilości tych itemów w inventory. Każdy item inventory->items[j] ma przypisaną ilość inventory->counts[j]. Tylko trzymam je w osobnych listach, bo nie wiedziałem jak to zrobić z std::map i nie wiem czy to poprawić tzn. te dwie listy na std::map
P-181430
pekfos
» 2024-08-07 22:50:50
Mapa zamiast obu wektorów to nie rozwiązanie, bo wtedy kolejność elementów będzie posortowana po wartości wskaźników. Lepszym rozwiązaniem jest wektor struktur.
C/C++
struct ItemWithCount
{
   
Item * item;
   
int count;
};

std::vector < ItemWithCount > items;
Jak masz tylko 2 pola to można użyć std::pair<Item*, int>, ale pola first i second nie są tak czytelne jak nazwane pola w dedykowanej strukturze.
P-181431
tBane
Temat założony przez niniejszego użytkownika
» 2024-08-15 17:08:49
w sumie ok.
P-181442
1 2 3 « 4 »
Poprzednia strona Strona 4 z 4